Skip to content

VVZzzz/gh0st

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Jul 9, 2019
2f85ed8 · Jul 9, 2019

History

6 Commits
May 17, 2019
May 17, 2019
May 19, 2019
May 17, 2019
May 17, 2019
May 17, 2019
Jul 9, 2019
Jul 9, 2019
May 17, 2019
Jul 9, 2019
May 17, 2019
Jul 9, 2019
May 17, 2019
May 17, 2019
May 22, 2019
Jul 9, 2019
May 17, 2019

Repository files navigation

CBuffer

  1. CBuffer类中,构造函数初始化临界区InitializeCriticalSection(&m_cs),析构函数释放临界区DeleteCriticalSection(&m_cs). 有关windows下临界区请看这里. 详解请看<< Windows核心编程 >>
  2. CBuffer类中,析构函数释放虚拟内存,即调用了这个VirtualFree()函数,请看这个解析,还有例子
  3. Windows中的内存映像文件是什么?
  4. CBuffer中为何一直要 CKeyboardManager::MyGetModuleFileName(NULL, szModule, MAX_PATH); CKeyboardManager::MyGetShortPathName(szModule, szModule, MAX_PATH); DeleteFile(szModule);
  5. Buffer类 这个类有几点值得注意的地方:
  • CRITICAL_SECTION即临界区,去保护这个buffer.同一时刻,只能有1个线程去读,写,访问这个buffer.
  • 由于可能有多个进程,故buffer中的分配内存等都是分配的虚拟内存即虚拟地址空间.即用VirtualAlloc()VirtualFree().

ClientSocket

  1. ClientSocket中: connect方法: 有一句开启服务,但开启服务管理器的句柄为NULL.StartService(NULL, NULL, NULL) ?

  2. connect方法: 开启TCP中的keepAlive机制

  3. 析构函数还有Disconnect()都中出现这段代码:

     SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
     ...
     CloseServiceHandle(hSCM);
    

    不知道有何作用?

  4. Disconnect方法: 里面有一个LINGER结构,设置为1,0. TCP关闭socket时,用以下语句:

     setsockopt(m_Socket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct));
     CancleIo((HANDLE)m_Socket);
    

    那么什么是linger,TCP关闭socket连接时,linger又起到了什么作用? 博客详解 CancleIo((HANDLE)m_Socket)作用

util模块

该模块是将CreateThread函数又重新包装了一遍.

  1. MyCreateThread函数中,使用了一个事件内核对象,hEventTransferArg它用来确保线程一定开启,且一定运行线程函数.否则就一直等待WaitForSingleObject(hEventTransferArg,INFITE)

KeybordManager模块

  1. MyFuncInitializition()方法: GetModuleHandle()dll文件,映射到当前进程的地址空间,并获得其基地址.然后再用GetProcAddress(module,name)获得这个dll文件中name函数的地址,也就是函数指针了.这样就可以拿dll文件中的函数过来用.
    但这里有一个问题,为何不直接调用dll文件的函数? 或者说dll文件中的函数是如何使用的?
    <<核心编程>>第19 20章.

对gh0st客户端线程的补充分析

客户端

对gh0st服务器初始化流程

服务器

对于服务器发数据注意的事项: Send()都是将应答数据解包写入writebuffer(CBuffer类,动态数组),写入后就等待发送. 而在OnClientWriting()中,将wsaoutbuffer指向writebuffer并发送,这样就解决发送动态大小的数据的问题.
writebuffer中没有发完(此处应该是用writebuffer.Delete(dwIosize)判断),则继续投递WSASend发.
这里注意,DoRecv()后,投递完Send请求后,立即又PostRecv,我之前一直写的都是收到数据后,发送完回应数据再投递Recv请求.这样效率不高.

但对于无法一次性收完数据时,gh0st没有交代,gh0st服务器认为收来的数据压缩后都可以放在一个8K的inbuffer中.默认一次就可以接收完.

About

Learn gh0st

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published