Rhett的代码
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
_asm
{
mov eax,fs:30h
mov eax,[eax+0Ch]
mov esi,[eax+1Ch]
lodsd
mov ebp,[eax+8]
mov eax,[ebp+3Ch]
mov edx,[ebp+eax+78h]
add edx,ebp
mov ecx,[edx+18h]
mov ebx,[edx+20h]
add ebx,ebp
search:
dec ecx
mov esi,[ebx+ecx*4]
add esi,ebp
mov eax,0x64616F4C
cmp [esi],eax
jne search
mov eax,0x7262694C
cmp [esi+4],eax
jne search
mov eax,0x41797261
cmp [esi+8],eax
jne search
mov ebx,[edx+24h]
add ebx,ebp
mov cx,[ebx+ecx*2]
mov ebx,[edx+1Ch]
add ebx,ebp
mov eax,[ebx+ecx*4]
add eax,ebp
}
return 0;
}
进程初始化后FS:0 指向 TEB
TEB里偏移30h处是PEB地址;
mov eax,[eax+0Ch]
mov esi,[eax+1Ch]
这个是先后得到PEB_LDR_DATA 和 InitializationOrderModuleList头部地址;
这个列表里第 2 项就是kernel32.dll的地址;
后面是从PE的导出表查找函数名,和LoadLibraryA的hex表示比较,然后得到函数地址;
用这种方法再得到 GetProcAddress函数地址,然后就可以获取别的函数地址;
很苯的方法,over!