界面篇等我先搞完这个通信协议解析再说,要不我老觉得自己是在扯淡。在这里我也给自己这两天搞的协议解析找个网络存储做一下备份。
Gh0st通信协议解析(1)
正所谓蛇打七寸,今天我们对gh0st的通信协议进行一个完整的解析,看看gh0st这款远控的核心技术的来龙去脉。
************************************************************************ *******
从主控端初始化IOCP服务器开始讲起
[cpp]view plaincopyprint?
1.// 启动IOCP服务器
2.int nPort = m_IniFile.GetInt("Settings", "ListenPort");
3.int nMaxConnection = m_IniFile.GetInt("Settings", "MaxConnection")
;
4.if (nPort == 0)
5. nPort = 80;
6.if (nMaxConnection == 0)
7. nMaxConnection = 10000;
8.
9.if (m_IniFile.GetInt("Settings", "MaxConnectionAuto"))
10. nMaxConnection = 8000;
11.
12.((CMainFrame*) m_pMainWnd)->Activate(nPort, nMaxConnection); IOCP服务器是在CGh0stApp::InitInstance这个函数中被调用的,实际上是调用了CMainFrame的一个成员函数:CMainFrame::Active。看看这个函数都做了哪些事情。
[cpp]view plaincopyprint?
1.void CMainFrame::Activate(UINT nPort, UINT nMaxConnections)
2.{
3. CString str;
4.
5.if (m_iocpServer != NULL)
6. {
7. m_iocpServer->Shutdown();
8.delete m_iocpServer;
9.
10. }
11. m_iocpServer = new CIOCPServer;
12.
13.// 开启IPCP服务器
14.if (m_iocpServer->Initialize(NotifyProc, this, 100000, nPort))
15. {
16.
17.char hostname[256];
18. gethostname(hostname, sizeof(hostname));
19. HOSTENT *host = gethostbyname(hostname);
20.if (host != NULL)
21. {
22.for ( int i=0; ; i++ )
23. {
24. str += inet_ntoa(*(IN_ADDR*)host->h_addr_list[i]);
25.if ( host->h_addr_list[i] + host->h_length >= host
->h_name )
26.break;
27. str += "/";
28. }
29. }
30.
31. m_wndStatusBar.SetPaneText(0, str);
32. str.Format("端口: %d", nPort);
33. m_wndStatusBar.SetPaneText(2, str);
34. }
35.else
36. {
37. str.Format("端口%d绑定失败", nPort);
38. m_wndStatusBar.SetPaneText(0, str);
39. m_wndStatusBar.SetPaneText(2, "端口: 0");
40. }
41.
42. m_wndStatusBar.SetPaneText(3, "连接: 0");
43.}
首先判断这个m_iocpServer全局变量是否已经指向了一个CIOCPServer,如果是的话,就要先关闭它,并且删除掉这个CIOCPServer所占的内存空间。到这里我有些犹豫要不要去追踪这个CIOCPServer::Shutdown函数呢,一方面,如果去追踪的话,我们将不得不深入到CIOCPServer这个类里面去抽丝剥茧,寻找Shutdown函数,以及这个函数内部所调用的一系列的函数,这样我不得不深度遍历整个调用过程。另一方面,如果追踪吧,会使得这篇文章的主线凌乱掉,如果不追踪吧,我自己会凌乱掉,思前想后,宁可让大家疯掉,也不能让我疯掉,因为我疯掉了就写不出这个分析文章了……
好了,我们接下来看看这个CIOCPServer::Shutdown这个函数内部的一个执行逻辑。[cpp]view plaincopyprint?
1.void CIOCPServer::Shutdown()
2.{
3.if (m_bInit == false)
4.return;
5.
6. m_bInit = false;
7. m_bTimeToKill = true;
8.
9.// Stop the listener
10. Stop();
11.
12.
13. closesocket(m_socListen);
14. WSACloseEvent(m_hEvent);
15.
16.
17. CloseCompletionPort();
18.
19. DeleteCriticalSection(&m_cs);
20.
21.while (!m_listFreePool.IsEmpty())
22.delete m_listFreePool.RemoveTail();
23.
24.}
先来看看这个CIOCPServer::m_bInit这个变量。这个变量有什么作用呢,看这些个地方:
1:在CIOCPSserver的构造函数中有这么一句:m_bInit = false;
2:在CIOCPServer::Initialize这个函数中有这么一句:m_bInit = true;
3:在CIOCPServer::Shutdown这个函数中有这么一句:m_bInit = false;
4:在CIOCPServer::IsRunning这个函数中有这么一句:return m_bInit;
从以上的各个地方我们可以知道,这个m_bInit就是一个记录CIOCPServer这个服务器的运行状态的,它只有两个意思:开启或者关闭。当CIOCPServer服务器初始化完毕的时候,此值将会被设为true。在关闭的时候,此值将会被设为false,其它的时候此值作为CIOCPServer运行状态的一个考量。
首先判断这个m_binit是否为false,如果为false那CIOCPServer本身就没有开启,还关闭个屁,如果为true的话,接下来就将其运行状态设为false。
然后看看CIOCPServer::m_bTimeToKill这个变量。这个变量的作用:
1:在CIOCPSserver的构造函数中有这么一句:m_bTimeToKill = false;