获取Kernel32基地址的几种方法
(2010-10-31 00:38:43)
获取Kernel32基地址的几种方法
1、CreateProcess函数在完成装载应用程序后,会先将一个返回地址压入到堆栈顶端,而这个返回地址恰好在Kernel32.dll中,利用这个原理我们可以顺着这个返回地址按64KB大小往地址搜索,那么我们一定可以找到Kernel32模块的基地址,废话少说,代码如下:
GetK32Base:
mov eax,
[esp+04h]
;得到kernel32的返回地址
and eax,
ffff0000h
Search:
cmp WORD ptr
[eax], IMAGE_DOS_SIGNATURE
;判断是否为ImageBase
jnz @f
mov edx,
[eax+3ch]
add edx,
eax
cmp WORD ptr
[edx], IMAGE_NT_SIGNATURE
;判断是否为PE头
jnz @f
ret
@@:
dec
eax
;按64KB递减搜索
xor ax,
ax
cmp eax,
70000000h
ja
Search
ret
2、通过PEB枚举当前进程空间中用户模块列表也可以获取Kernel32模块的基地址,fs:[0]指向TEB,fs:[30h]指向PEB,PEB偏移0ch是LDR指针,以下可以分别通过加载顺序、内存顺序、初始化顺序获取Kernel32模块的基地址,这里以初始化顺序为例:
未公开的LDR_MODULE数据结构如下:
typedef struct _LDR_MODULE
{
LIST_ENTRY
InLoadOrderModuleList;
// +0x00
LIST_ENTRY
InMemoryOrderModuleList;
// +0x08
LIST_ENTRY
InInitializationOrderModuleList; // +0x10
PVOID
BaseAddress;
// +0x18
PVOID
EntryPoint;
// +0x1c
ULONG
SizeOfImage;
// +0x20
UNICODE_STRING
FullDllName;
// +0x24
UNICODE_STRING
BaseDllName;
// +0x2c
ULONG
Flags; |