gh0st远控源码分析

四个工程,gh0st,install,loadmr,svchost。分别是控制端,安装程序,xxx,被控端。

一。install工程,安装程序.

1.WinMain函数。

  加载svchost工程的dll为服务,启动服务。

 

二。svchost工程.被控端(服务端).

1.main函数,

在当前目录获取上线名称,获取不到退出。设置当前进程为winsta0的windowsstation。

通过SetUnhandledExceptionFilter设置进程崩溃时重新创建main线程。在services下面创建

启动注册表项目。删除安装文件。死循环等待进程退出事件,每隔2分钟检查一次。通过base64解码出

服务器url地址,主机地址,代理地址,获取登录信息。获取登录信息时,连接url,通过InternetReadFile,下载

文件,解码出字串,依次取出代理主机地址,端口等。获取后设置CClientSocket的登录代理,端口等信息。

调用CClientSocket::Connect连接服务端,连接上之后,调用CClientSocket::WorkThread函数死循环等待服务端发送来的消息,

调用CClientSocket::OnRead函数接收信息,判断信息完整性,调用zlib解压缩信息,调用manager成员的OnReceive函数处理命令。

获取本地硬件信息,比如ip,cpu,内存,硬盘,视频,网速,版本,上线密码,上线分组等上线信息发送给服务端。

设置CClientSocket的ManagerCallBack为CKernelManager,以便进入CKernelManager::OnReceive函数处理服务端发来的命令。

等待控制端发送激活命令,超时为10秒,10秒后还没有收到控制端发来的激活命令,说明对方不是控制端,重新连接。

2.CKernelManager::OnReceive服务端命令处理函数.

3.如果是文件管理,创建线程进入Loop_FileManager函数处理,处理本次连接的收发数据。

产生新的CClientSocket,连接一次服务器,生成CFileManager对象,和这个socket和具体的xxxManager对象关联,进入CClientSocket::WorkThread等待新的连接。

后面的数据发送和接收和这个具体的xxxManager对象的CFileManager::OnReceive函数来处理.

在构造函数中完成操作,调用socket的send函数发送驱动器列表数据。调用CFileManager::SendDriveList函数,发送驱动器列表.

在该函数中,获取驱动器列表,获取已用和空闲大小,发送给服务端。

4. CFileManager::OnReceive具体的文件管理功能函数。

(1).比如获取文件列表,调用CFileManager::SendFilesList,参数为文件路径.调用函数FindFirstFile获取第一个文件,FindNextFile获取

后面文件,调用Send发送。

(2).如果是上传文件,解析出多个路径,判断路径是否存在,发送第一个文件大小。如果是继续上传文件命令,读取文件,发送。如果还有下一个文件,则

发送需要传输的文件大小。没有下一个文件,则发送完成命令,

5.如果是屏幕查看,进入CScreenManager的构造函数和OnReceive处理。

在构造函数中,创建一个WorkThread工作线程和一个ControlThread控制线程,控制线程是用于保持黑屏。

在工作线程中,调用WaitForDialogOpen等待控制端对话框打开。调用sendFirstScreen发送第一个屏幕。截屏使用的方法如下:

获取桌面窗口句柄,桌面窗口的DC,根据这个DC创建兼容DC,根据兼容DC创建一个DIBSection,调用BitBlt函数获取内存数据。

然后调用CScreenManager::sendNextScreen不断截取下一个屏幕。

 

 

三。gh0st工程.控制端

1.CGh0stApp::InitInstance初始化函数。

初始化CMainFrame窗口,调用CMainFrame::Activate启动iocp服务器.

进入CMainFrame::OnCreate函数创建窗口,

(1).如果是生成服务端,在函数CBuildServer::OnBuild中。

获取主机名,服务名,描述等。读取server.exe文件内容,在文件后面一次写入随机数据,上线地址,安装路径,版本,上线密码,自删除判断等信息,然后使用

upx压缩文件。

2.在函数 CMainFrame::ProcessReceive和函数CMainFrame::ProcessReceiveComplete中处理服务端发来的命令,主要是一次调用每种操作的对话框的OnReceiveComplete和

OnReceive函数。

 

--写于2015.8.30

 

你可能感兴趣的:(客户端及安全)