当前位置:文档之家› Gh0st通信协议解析

Gh0st通信协议解析

界面篇等我先搞完这个通信协议解析再说,要不我老觉得自己是在扯淡。在这里我也给自己这两天搞的协议解析找个网络存储做一下备份。

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;

相关主题