刺激战场
六合彩
贵宾厅
  • 1458阅读
  • 1回复

ring0-遍历IAT(特例NTOS) [复制链接]

上一主题 下一主题
离线天道酬勤
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-11
— 本帖被 天道酬勤 从 驱动保护 移动到本区(2016-05-19) —


原NTOS的IAT只能通过IMAGE_DIRECTORY_ENTRY_IAT(12)来获得,因为NTOS加载完后,INIT方式加载,所以IMAGE_DIRECTORY_ENTRY_IMPORT对应的区域被释放了!
坑爹啊,
可以用windbg很直观的看到:
X86:






x64:



其他的IAT遍历代码如下:




[cpp] view plain copy
  1. NTSTATUS EnumIATTable(ULONG_PTR pBase)  
  2. {  
  3.     PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)pBase;  
  4.     PIMAGE_NT_HEADERS pNt = NULL;  
  5.     PIMAGE_IMPORT_DESCRIPTOR pImport = NULL;  
  6.     PIMAGE_THUNK_DATA pThunk = NULL;  
  7.   
  8.     if (NULL == pDos  
  9.         || IMAGE_DOS_SIGNATURE != pDos->e_magic)  
  10.     {  
  11.         return STATUS_INVALID_IMAGE_FORMAT;  
  12.     }  
  13.   
  14.     pNt = (PIMAGE_NT_HEADERS)((PUCHAR)pBase+pDos->e_lfanew);  
  15.     if (IMAGE_NT_SIGNATURE != pNt->Signature)  
  16.     {  
  17.         return STATUS_INVALID_IMAGE_FORMAT;  
  18.     }  
  19.   
  20.     pImport = (PIMAGE_IMPORT_DESCRIPTOR)((PUCHAR)pBase+pNt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);  
  21.   
  22.     // 枚举打印  
  23.     while (NULL !=pImport  
  24.         && MmIsAddressValid(pImport)  
  25.         &&pImport->Name != 0)  
  26.     {  
  27.         pThunk = (PIMAGE_THUNK_DATA)((PUCHAR)pBase+pImport->FirstThunk);  
  28.         while (NULL != pThunk  
  29.             && MmIsAddressValid(pThunk)  
  30.             && pThunk->u1.Function != 0)  
  31.         {  
  32.             KdPrint(("[EnumIATTable]-Import Module:%s-function:%p\r\n", (PUCHAR)pBase+pImport->Name, pThunk->u1.Function));  
  33.             pThunk++;  
  34.         }  
  35.   
  36.         pImport++;  
  37.     }  
  38.   
  39.     return STATUS_SUCCESS;  
  40. }  
离线v2680267313

只看该作者 沙发  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个