天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理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实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? VIP会员办理QQ: 89986068   
【请先加好友,然后到好友列表双击联系客服办理,不然可能无法接受到信息。】
27 加入2000人交流群637034024 3 28 免责声明?
查看: 5115|回复: 0

WIN7-X64内核模式下枚举导出表

[复制链接]

12

主题

0

回帖

14

积分

编程入门

Rank: 1

天马币
24
发表于 2024-3-1 14:15:57 | 显示全部楼层 |阅读模式
内核模式下枚举查看导出表需要注意的事项比在用户模式下要考虑更加周详;
X64环境倒不是变化太多,指针定是64位的,数据数据及指针指向的数据类型需要注意;
不费话,直接上源码,VS2010+WDK7600下编译通过:

代码:
  1. #include <ntddk.h>
  2. #include <WinDef.h>
  3. #include <aux_klib.h>

  4. #pragma comment(lib,"aux_klib.lib")  

  5. #define TAG    'test'
  6. #define PtrFromRva(xbase,rva)  (((PBYTE)xbase)+rva)

  7. // 提供一个Unload函数只是为了
  8. VOID DriverUnload(PDRIVER_OBJECT driver)
  9. {
  10.   // 但是实际上我们什么都不做,只打印一句话:
  11.     // #if DBG
  12.     //    DbgBreakPoint();
  13.     // #endif
  14.   KdPrint(("first: Our driver is unloading…\r\n"));
  15. }

  16. NTSTATUS ExpList(PVOID imagebase)
  17. {
  18.   //PVOID LoadAddress=(PVOID)*(PVOID*)imagebase;
  19.   NTSTATUS status=0;
  20.   PIMAGE_EXPORT_DIRECTORY ExportDirectory;
  21.   PIMAGE_DATA_DIRECTORY ExportDataDirectory;
  22.   PIMAGE_NT_HEADERS NtHeader;
  23.   PIMAGE_DOS_HEADER DosHeader=(PIMAGE_DOS_HEADER)imagebase;
  24.   
  25.   ULONG Index;
  26.   PULONG FuncRvaArray;
  27.   PUSHORT OrdArray;
  28.   PULONG NameArray;

  29.   if (IMAGE_DOS_SIGNATURE!=DosHeader->e_magic)
  30.   {
  31.     KdPrint(("No Dos Header!\n"));
  32.     return status;
  33.   }
  34.   NtHeader=(PIMAGE_NT_HEADERS)PtrFromRva(DosHeader,DosHeader->e_lfanew);
  35.   if (IMAGE_NT_SIGNATURE!=NtHeader->Signature)
  36.   {
  37.     KdPrint(("Not Nt File!\n"));
  38.     return status;
  39.   }
  40.   
  41.   ExportDataDirectory=&NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
  42.   ExportDirectory=(PIMAGE_EXPORT_DIRECTORY)PtrFromRva(imagebase,ExportDataDirectory->VirtualAddress);
  43.   //这上下两个可以对比
  44.   ExportDirectory=AuxKlibGetImageExportDirectory(imagebase);
  45.   
  46.   if (!MmIsAddressValid(ExportDirectory) || ExportDirectory->NumberOfFunctions==0 || ExportDirectory->AddressOfFunctions==0 || ExportDirectory->AddressOfNameOrdinals==0 || ExportDirectory->AddressOfNames==0 )
  47.   {
  48.     KdPrint(("no export....\n"));
  49.     return status;
  50.   }
  51.   
  52.   FuncRvaArray=(PULONG)PtrFromRva(imagebase,ExportDirectory->AddressOfFunctions);
  53.   OrdArray=(PUSHORT)PtrFromRva(imagebase,ExportDirectory->AddressOfNameOrdinals);
  54.   NameArray=(PULONG)PtrFromRva(imagebase,ExportDirectory->AddressOfNames);
  55.   for (Index=0;Index<ExportDirectory->NumberOfNames;Index++)
  56.   {
  57.     USHORT Ordinal=(USHORT)OrdArray[Index]+(USHORT)ExportDirectory->Base;
  58.     ULONG FunRva=FuncRvaArray[Ordinal-ExportDirectory->Base];
  59.     if (FunRva>=ExportDataDirectory->VirtualAddress && FunRva<ExportDataDirectory->VirtualAddress+ExportDataDirectory->Size)
  60.     {
  61.       KdPrint(("It's a forwarders\n"));  
  62.       continue;
  63.     }
  64.     else
  65.     {
  66.       KdPrint(("%4x   %s\n",FunRva,PtrFromRva(imagebase,NameArray[Index])));
  67.     }
  68.   }
  69.   return status;
  70. }

  71. NTSTATUS Aux_Test()
  72. {
  73.   NTSTATUS status;
  74.   ULONG modsize;
  75.   ULONG numofmod;
  76.   AUX_MODULE_EXTENDED_INFO *mod;
  77.   ULONG i;
  78.   
  79.   PVOID imagebase;

  80.   KdPrint(("Aux_Klib testing ......\n\n"));
  81.   status=AuxKlibInitialize();
  82.   if (!NT_SUCCESS(status))
  83.   {
  84.     KdPrint(("AuxKlibInitialize failed!\n"));
  85.     return status;
  86.   }
  87.   status=AuxKlibQueryModuleInformation(&modsize,sizeof(AUX_MODULE_EXTENDED_INFO),NULL);
  88.   if (!NT_SUCCESS(status) || modsize==0)
  89.   {
  90.     KdPrint(("first query failed!\n"));
  91.     return status;
  92.   }
  93.   numofmod=modsize / sizeof(AUX_MODULE_EXTENDED_INFO);
  94.   mod=(AUX_MODULE_EXTENDED_INFO*)ExAllocatePoolWithTag(PagedPool,modsize,TAG);
  95.   if(mod==NULL)
  96.   {
  97.     status=STATUS_INSUFFICIENT_RESOURCES;
  98.     KdPrint(("insufficient resouces!\n"));
  99.     return status;
  100.   }
  101.   RtlZeroMemory(mod,modsize);
  102.   status=AuxKlibQueryModuleInformation(&modsize,sizeof(AUX_MODULE_EXTENDED_INFO),mod);
  103.   if (!NT_SUCCESS(status))
  104.   {
  105.     ExFreePoolWithTag(mod,TAG);
  106.     KdPrint(("Query Failed!\n"));
  107.     return status;
  108.   }
  109.   for (i=0;i<numofmod;i++)
  110.   {
  111.     KdPrint(("Load order:%d\n",i));
  112.     KdPrint(("FileName:%s\n",mod.FullPathName+mod.FileNameOffset));
  113.     KdPrint(("ImageBase:%p\n",mod.BasicInfo.ImageBase));
  114.     KdPrint(("ImageSize:0x%08X\n",mod.ImageSize));
  115.     KdPrint(("\n\n"));
  116.     imagebase=mod.BasicInfo.ImageBase;  

  117.     /*if (i==128 || i==3)
  118.       DbgBreakPoint();*/
  119.     if (!MmIsAddressValid(imagebase))
  120.       continue;
  121.     ExpList(imagebase);
  122.   }
  123.   ExFreePoolWithTag(mod,TAG);
  124.   return status;
  125. }

  126. // DriverEntry,入口函数。相当于main。
  127. NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
  128. {
  129.   // 设置一个卸载函数便于这个函数能退出。
  130.   driver->DriverUnload = DriverUnload;

  131.      #if DBG
  132.         DbgBreakPoint();
  133.      #endif
  134.   // 这是我们的内核模块的入口,可以在这里写入我们想写的东西。
  135.   // 我在这里打印一句话。因为”Hello,world” 常常被高手耻笑,所以
  136.   // 我们打印一点别的。
  137.   KdPrint(("first: Hello, my salary!\r\n"));
  138.   Aux_Test();

  139.   return STATUS_SUCCESS;
  140. }
复制代码


回复

使用道具 举报

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

本版积分规则

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