分析NtReadVirtulMemoery(内核函数)在挂靠时如何备份和恢复APC队列的

看了别人博客里的WRK代码,也看了逆向代码,WRK帮我把逆向没搞清楚的  搞清楚了,所以不说细节了,直接说怎么调用的

  1. 首先函数调用了NtReadVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, SIZE_T NumberOfBytesToRead, PSIZE_T NumberOfBytesRead)函数
  2. 然后里面又调用了_MmCopyVirtualMemory函数
  3. _MmCopyVirtualMemory根据所读取的大小是否超过0x1ff,超过就调用_MiDoMappedCopy函数,没超过就调用_MiDoPoolCopy函数
  4. _MiDoMappedCopy函数调用了_KeStackAttachProcess
  5. _KeStackAttachProcess又调用了_KiAttachProcess函数
  6. _KiAttachProcess函数调用了_KiMoveApcState,而这个函数是将_KTHREAD偏移0x34里的_KAPC_SATE备份一遍
  7. 出了_KiMoveApcState函数后又进入了_KiAttachProcess函数,进行了一系列的初始化(我看汇编的时候没发现是宏),并且将其APCState里的Process改为要挂靠的进程Process
  8. 后面直接退到_MiDoMappedCopy函数通过KeUnstackDetachProcess函数和KeStackAttachProcess函数来detach Process和恢复Process

源码大家可以看看habaga师傅的博客

汇编太长了,懒得放上来了

posted @ 2021-01-25 18:08  PYozo_free  阅读(284)  评论(0编辑  收藏  举报