龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 2332|回复: 0

ring0级暴力搜索内存检测系统隐藏进程(或Rootkit)

[复制链接]

10

主题

2

回帖

15

积分

编程入门

Rank: 1

龙马币
30

ring0级暴力搜索内存检测系统隐藏进程(或Rootkit)

  1. #include<ntddk.h>

  2. //EPROCESS结构大小,我的系统是XP SP3,所以0x260,不过经过测试,这里设置成比实际EPROCESS小也是没问题的
  3. #define  EPROCESS_SIZE       0x260
  4. #define  PEB_OFFSET          0x1B0        //PEB偏移,下面就不注释了
  5. #define  FILE_NAME_OFFSET    0x174
  6. #define  PROCESS_LINK_OFFSET 0x088
  7. #define  PROCESS_ID_OFFSET   0x084
  8. #define  EXIT_TIME_OFFSET    0x078

  9. #define  OBJECT_HEADER_SIZE  0x018
  10. #define  OBJECT_TYPE_OFFSET  0x008

  11. ULONG        ulPebAddress;                        //PEB地址的前半部分
  12. ULONG        ulStartAddress, ulEndAddress;        //起始,结束地址
  13. ULONG        ulObjectType;                        //进程对象类型

  14. BOOLEAN        IsaRealProcess(ULONG pEprocess);    //该函数判断是否真的是进程
  15. VOID        WorkThread(IN PVOID pContext);        //新开线程防止系统顿卡
  16. VOID        UpdateEndStartPebAddress();            //更新首尾地址和PEB地址
  17. VOID        EnumProcess();                        //枚举进程
  18. VOID        ShowProcess(ULONG pEProcess);        //显示进程信息

  19. VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
  20. {
  21. }

  22. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
  23. {
  24.     HANDLE hThread;

  25.     DriverObject -> DriverUnload = OnUnload;
  26.     UpdateEndStartPebAddress();

  27.     ulObjectType = *(PULONG)((ULONG)ulEndAddress - OBJECT_HEADER_SIZE + OBJECT_TYPE_OFFSET);
  28.     PsCreateSystemThread(&amp;hThread,
  29.         (ACCESS_MASK)0,
  30.         NULL,
  31.         (HANDLE)0,
  32.         NULL,
  33.         WorkThread,
  34.         NULL );

  35.     return STATUS_SUCCESS;
  36. }


  37. VOID WorkThread(IN PVOID pContext)
  38. {
  39.     EnumProcess();
  40.     PsTerminateSystemThread(STATUS_SUCCESS);
  41. }

  42. VOID UpdateEndStartPebAddress()
  43. {
  44.     ULONG ulEProcessAddress = (ULONG)IoGetCurrentProcess();
  45.     ULONG pEProcess;
  46.     //IoGetCurrentProcess返回的是System进程EPROCESS结构地址,此处已经是搜索结束处。
  47.     ulStartAddress = ulEndAddress = ulEProcessAddress;

  48.     ulEProcessAddress = (ULONG)(((PLIST_ENTRY)(ulEProcessAddress + PROCESS_LINK_OFFSET))->Flink) - PROCESS_LINK_OFFSET;
  49.     ulPebAddress = *(PULONG)(ulEProcessAddress + PEB_OFFSET) &amp; 0xFFFF0000;

  50.     while (ulEProcessAddress != ulEndAddress)
  51.     {        //遍历EPROCESS结构,找到最小地址处
  52.         ulEProcessAddress = (ULONG)(((PLIST_ENTRY)(ulEProcessAddress + PROCESS_LINK_OFFSET))->Flink) - PROCESS_LINK_OFFSET;
  53.         if (ulStartAddress > ulEProcessAddress)
  54.             ulStartAddress = ulEProcessAddress;
  55.     }
  56. }


  57. VOID EnumProcess()
  58. {

  59.     ULONG  i;
  60.     ULONG nCount = 2;
  61.     ULONG  Address;
  62.     ULONG  ret;

  63.     KdPrint(("-------------------------------------------\r\n"));
  64.     KdPrint(("EProcess    PID    ImageFileName\r\n"));
  65.     KdPrint(("-------------------------------------------\r\n"));
  66.     //系统空闲进程的检测方法有点特殊,只作参考
  67.     ShowProcess(*(PULONG)(ulStartAddress + PROCESS_ID_OFFSET));
  68.     //system的PEB总是零 上面的方法是枚举不到的 不过我们用PsGetCurrentProcess就能得到了
  69.     ShowProcess(ulEndAddress);

  70.     for(i = ulStartAddress; i < ulEndAddress; i += 4) {//system进程的EPROCESS地址就是最大值了
  71.         if (MmIsAddressValid((PVOID)i)) {
  72.             Address = *(PULONG)i;
  73.             if (( Address &amp; 0xFFFF0000) == ulPebAddress){//每个进程的PEB地址都是在差不多的地方,地址前半部分是相同的      
  74.                 if (IsaRealProcess(i)) {
  75.                     ShowProcess(i - PEB_OFFSET);
  76.                     i -= 4;
  77.                     i += EPROCESS_SIZE;
  78.                     nCount ++;
  79.                 }
  80.             }
  81.         } else {
  82.             i -= 4;
  83.             i += 0x5000000;//5M
  84.         }
  85.     }   
  86.     KdPrint(("-------------------------------------------\r\n"));
  87.     KdPrint(("=====   Total Processes count:%3d   =======\r\n", nCount));
  88.     KdPrint(("-------------------------------------------\r\n"));
  89. }


  90. VOID ShowProcess(ULONG pEProcess)
  91. {
  92.     PLARGE_INTEGER ExitTime;
  93.     ULONG PID;
  94.     PUCHAR pFileName;

  95.     ExitTime = (PLARGE_INTEGER)(pEProcess + EXIT_TIME_OFFSET);
  96.     if(ExitTime->QuadPart != 0) //已经结束的进程的ExitTime为非零
  97.         return ;

  98.     PID = *(PULONG)(pEProcess + PROCESS_ID_OFFSET);
  99.     pFileName = (PUCHAR)(pEProcess + FILE_NAME_OFFSET);

  100.     KdPrint(("0x%08X  %04d   %s\r\n",pEProcess,PID,pFileName));
  101. }


  102. BOOLEAN IsaRealProcess(ULONG pEprocess)
  103. {
  104.     NTSTATUS STATUS;
  105.     PUNICODE_STRING pUnicode;
  106.     UNICODE_STRING Process;
  107.     ULONG pObjectType;
  108.     ULONG ObjectTypeAddress;

  109.     if (!MmIsAddressValid((PVOID)(pEprocess - PEB_OFFSET)))
  110.         return FALSE;

  111.     ObjectTypeAddress = pEprocess - PEB_OFFSET - OBJECT_HEADER_SIZE + OBJECT_TYPE_OFFSET ;

  112.     if (MmIsAddressValid((PVOID)ObjectTypeAddress)) {
  113.         pObjectType = *(PULONG)ObjectTypeAddress;
  114.     } else {
  115.         return FALSE;
  116.     }

  117.     if(ulObjectType == pObjectType) {//确定ObjectType是Process类型
  118.         return TRUE;
  119.     }
  120.     return FALSE;
  121. }
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表