ring0-遍历IAT(特例NTOS)

http://blog.csdn.net/hgy413/article/details/7786530

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

x64:

其他的IAT遍历代码如下:

[cpp] view plaincopy

  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. if (NULL == pDos
  8. || IMAGE_DOS_SIGNATURE != pDos->e_magic)
  9. {
  10. return STATUS_INVALID_IMAGE_FORMAT;
  11. }
  12. pNt = (PIMAGE_NT_HEADERS)((PUCHAR)pBase+pDos->e_lfanew);
  13. if (IMAGE_NT_SIGNATURE != pNt->Signature)
  14. {
  15. return STATUS_INVALID_IMAGE_FORMAT;
  16. }
  17. pImport = (PIMAGE_IMPORT_DESCRIPTOR)((PUCHAR)pBase+pNt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
  18. // 枚举打印
  19. while (NULL !=pImport
  20. && MmIsAddressValid(pImport)
  21. &&pImport->Name != 0)
  22. {
  23. pThunk = (PIMAGE_THUNK_DATA)((PUCHAR)pBase+pImport->FirstThunk);
  24. while (NULL != pThunk
  25. && MmIsAddressValid(pThunk)
  26. && pThunk->u1.Function != 0)
  27. {
  28. KdPrint(("[EnumIATTable]-Import Module:%s-function:%p\r\n", (PUCHAR)pBase+pImport->Name, pThunk->u1.Function));
  29. pThunk++;
  30. }
  31. pImport++;
  32. }
  33. return STATUS_SUCCESS;
  34. }
时间: 2024-10-02 22:52:55

ring0-遍历IAT(特例NTOS)的相关文章

ring0 恢复SSDTHook

原理: 用ZwQuerySystemInformation 功能号为11(SystemModuleInformation)  得到所有系统模块的地址 遍历搜索得到ntos模块的基地址 读Ntos模块到System进程空间中 在ntos中找到函数真正地址 将地址转换为ssdt的索引 //X64版本#include "ResumeSSDTHook.h" #define SEC_IMAGE 0x1000000 PVOID __NtosModuleBaseAddress = NULL; ULO

PE基础6_远程线程注入-HOOK(消息-InLine-IAT)

注入 概述 DLL注入的初始动力源自于程序员对其他第三方应用程序进行功能扩展的愿望 注入方式有 注册表注入 ComRes注入 APC注入 消息钩子注入 远程线程注入 依赖可信进程注入 劫持进程创建注入 输入法注入 远程线程注入 //要加载的dll路径 WCHAR szDllPath[] = L"C:\\Users\\42140\\source\\repos\\34windows原理PE \\Debug\\16InjectDll.dll"; ? int main() { //1.要注入,

ring0 根据EThread遍历线程

ntdll!_ETHREAD +0x000 Tcb : _KTHREAD +0x200 CreateTime : _LARGE_INTEGER 0xff58b008 +0x208 ExitTime : _LARGE_INTEGER 0x400000`91334e00 +0x208 KeyedWaitChain : _LIST_ENTRY [ 0x91334e00 - 0x400000 ] +0x210 ExitStatus : 800443912   //不为0 表示线程结束 +0x214 Po

Java数据结构-二叉树及其遍历

二叉树的定义:n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互相不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点: 0<=度<=2: 左右子树是有顺序的,不能颠倒: 不论有几棵子树,也要区分它是左子树还是右子树. 二叉树的五种基本形态: 空二叉树: 只有一个根结点: 根结点只有左子树: 根结点只有右子树: 根结点既有左子树又有右子树. 举例3个结点的二叉树的形态有: 下面说一些特殊的二叉树. 斜树:所有的结点都只有左子树的二叉

小白日记37:kali渗透测试之Web渗透-手动漏洞挖掘(三)-目录遍历、文件包含

手动漏洞挖掘 漏洞类型 #Directory traversal 目录遍历[本台机器操作系统上文件进行读取] 使用者可以通过浏览器/URL地址或者参数变量内容,可以读取web根目录[默认为:/var/www/]之外的其他操作系统文件(如:/etc/passwd/).形成根源:目录权限限制不严格 #File include文件包含[1.include本地文件包含LFI:2.远程系统文件包含RFI(可传入木马)] 通常为如include函数,可以将web根目录以外的目录包含进来.根源:include

导入表结构复习 导入模块,函数名称,地址遍历

关于PE结构导入表,以前只是手动分析,没有通过编程来实现.而且PE文件结构,不巩固的话,一段时间之后就会忘记,所以记录下这次试验,为IAT挂钩做好准备,也算是复习一下. 测试 环境:windows xp sp3 IDE: vs 2008 sp1 build:release #include <windows.h> #include <stdio.h> #include <DbgHelp.h> #pragma comment(lib,"dbghelp.lib&q

ring0 暴力枚举进程

原理:遍历进程ID,然后openprocess,能打开的都枚举出来 ring0 : #include "EnumProcessByForce.h" extern char* PsGetProcessImageFileName(PEPROCESS EProcess); extern POBJECT_TYPE* PsProcessType; NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterP

C# 遍历DLL导出函数

C#怎样去遍历一个由C++或E语言编写的本地DLL导出函数呢 只是在这里我建议对PE一无所知的人 你也许应先补补这方面的知识.我不知道为什么PE方面的 应用在C#中怎么这么少.我查阅过相关 C#的知识大概仅仅见一个人写过关于PE的应用 还仅仅是从PE信息中推断运行文件是X86还是X64方式 编译,难道C#程序猿真的非常差 真的仅仅能会点Asp.Net / MVC?想想看雪论坛那些玩inline-asm / inline-hook的牛牛 真是感到有非常大差距 只是任何语言 在我看来事实上都差点儿相

算法题——二叉树结点的中序遍历的后继结点

题目:给出二叉树的一个结点,返回它中序遍历顺序的下一个结点. 思路: 如果有指向父亲的结点,则: 如果当前结点有右儿子,或者当前结点是根结点,则后继结点为右子树的最左叶节点: 否则,如果当前结点是父结点的左儿子,则后继结点就是父结点:(其实是第三种情况的一个特例,即自己是第0代祖先,返回第一代祖先) 否则,向上遍历,直到n-1代祖先是n代祖先的左儿子,则后继结点为n代祖先:或者遍历到根节点后未找到符合的n代结点,则该结点为中序遍历的最后结点,没有后继. 时间复杂度为树的高度O(lgN). 代码: