当前位置:文档之家› 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.else36. {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 listener10. 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;2:在CIOCPServer::Shutdown这个函数中有这么一句:m_bTimeToKill = true;3:在核心的完成端口循环中有这么一句:for (BOOL bStayInPool = TRUE; bStayInPool && pThis->m_bTimeToKill == false; )可以看出,m_bTimeToKill这个值就是一个记录是否结束掉在完成端口的所有等待线程的这么一个哨兵值,如果该值被设置为true,那么所有等待在完成端口上的线程都将结束并退出,这样,就不会再有工作线程来处理这个完成端口上的所有Read、Write、Initize的请求,在这里要明白一点:工作线程数是跟运行主控端的机子上的核心数相关的。

接下来,我们程序的流程就到了CIOCPSserver::Stop这个函数里了,这个函数的一个主要的功能就是结束掉这个监听的socket,已达到后续的连接请求不再受理。

我们看看在这个函数里CIOCPServer都做了哪些处理:[cpp]view plaincopyprint?1.void CIOCPServer::Stop()2.{3. ::SetEvent(m_hKillEvent);4. WaitForSingleObject(m_hListenThread, INFINITE);5. CloseHandle(m_hListenThread);6. CloseHandle(m_hKillEvent);7.}首先来看看这个CIOCPServer::m_hKillEvent这个变量的用途1:在CIOCPServer的构造函数中有这么一句调用m_hKillEvent = CreateEvent(NULL, TRUE, FALSE, NULL);在构造函数中创建了一个人工置信、初始状态为未受信的、未命名的事件对象。

2:在CIOCPServer::ListenThreadProc这个函数中有这么一句调用if (WaitForSingleObject(pThis->m_hKillEvent, 100) == WAIT_OBJECT_0)break;在监听上线的线程中的无限循环中,这一句的作用就是,当m_hKillEvent受信的时候,这个无限循环结束3:在一个关键的地方,就是在CIOCPServer::Stop中SetEvent(m_hKillEvent)的调用。

通过以上的分析我们可以看出,这个变量存在的意义,就是承担得起当要关闭CIOCPServer 这个服务器的时候,使得监听线程结束监听这么一个功能。

再来看看这个CIOCPServer::m_hThread这个变量的用途1:在CIOCPServer::Initialize函数中,有以下的这个调用[cpp]view plaincopyprint?1.m_hThread =(HANDLE)_beginthreadex(NULL,// Security2.3. 0, // Stack size - use default4.5. ListenThreadProc, // Thread fn entry point6.7. (void*) this,8.9. 0,// Init flag10.11. &dwThreadId); // Thread address2:在CIOCPServer::Stop中,有WaitForSingleObject(m_hThread, INFINITE)的调用。

相关主题