逆向总结(3)-- 无模块遍历API(找到Kernel32.dll)

在逆向工程中,有时需要无模块地找到Kernel32.dll的基址。该过程涉及通过FS段获取TEB地址,然后依次访问PEB、PEB_LDR_DATA结构,找到InInitializationOrderModuleList链表,从而获取模块信息。在NT5.x系统中,Kernel32.dll位于链表的第二个节点,而在NT6.1中则是KernelBase.dll。
摘要由CSDN通过智能技术生成

很多的时候,我们需要使用到无模块获取到Kernel32.dll的基址,这时候,我们就需要借助FS还完成:

      1)通过FS得到TEB的地址

         2)TEB偏移0x30处指向的是PEB指针

         3)PEB偏移0x0C处指向PEB_LDR_DATA结构指针

         4)PEB_LDR_DATA偏移0x1C处是InInitializationOrderModuleLis(模块初始化链表的头指针)

         5)InInitializationOrderModuleLis中按顺序存在着此进程的初始化模块信息,在NT5.x内核中,第一个节点为ntdll.dll的基址,第二个节点为Kernel32.dll的基址; 在NT6.1内核中,第二个节点为KernelBase.dll的基址(包含着Kernel32.dll的大部分实现,其中就有GetProcAddress函数)



代码





#include "stdafx.h"
#include <windows.h>




//#define CONTAINING_RECORD(address, type, field) ((type *)( (PCHAR)(address)-(ULONG_PTR)(&((type *)0)->field)))


typedef struct _UNICODE_STRING {
<span style="white-space:pre">	</span>USHORT  Length;
<span style="white-space:pre">	</span>USHORT  MaximumLength;
<span style="white-space:pre">	</span>PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;


typedef struct _PEB_LDR_DATA
{
<span style="white-space:p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值