;*****************************************************************************************
;const void* __stdcall GetAPIAddr(const void* hModule,const char* lpszProcName)
;等价于 const void* __stdcall GetProcAddress(const void* hModule,const char* lpszProcName)
;*****************************************************************************************
GetAPIAddr:
push ebp
mov ebp,esp
pushad
mov ebx,[ebp+8]
mov esi,[ebp+12]
;检查是否是有效的 PE 文件格式
cmp word [ebx], 'MZ'
jne .NoExportTable ;是不是有效的 PE 文件
mov eax, [ebx + 3CH]
add eax, ebx ;eax = PE Header
cmp dword [eax], 00004550H ;PE/0/0
jne .NoExportTable
;搜索需要的 API 地址
mov edx, [eax + 04H + 14H + 60H]
test edx, edx
jz .NoExportTable ;没有输出表
add edx, ebx ;计算输出表位置
;NumberOfFunctions
mov ecx, [edx + 18H]
;AddressOfNames
mov eax, [edx + 20H]
add eax, ebx
;AddressOfFunctions
mov ebp, [edx + 1CH]
add ebp, ebx
;AddressOfNameOrdinals
mov edx, [edx + 24H]
add edx, ebx
dec ecx
cld
push eax
xor eax, eax
.GetAPIAddress:
inc eax
cmp byte [esi + eax], 0
jne .GetAPIAddress
;dec eax
xchg eax, [esp]
push esi ;[esp] = esi;[esp + 4] = strlen(lpszProcName)
.FindNextExportFunction:
mov edi, [eax + ecx * 4]
add edi, ebx ;edi = API NAME
push ecx
mov ecx, [esp + 4 + 4]
repz cmpsb
jnz .3_GetAPIAddress
test ecx, ecx
jnz .3_GetAPIAddress
;找到匹配的字符串
pop ecx
movzx ecx, word [edx + ecx * 2]
mov eax, [ebp + ecx * 4]
add eax, ebx ;eax = API ADDRESS
mov [esp + 32 - 4 + 8], eax ;返回值
jmp .4_GetAPIAddress
.3_GetAPIAddress:
pop ecx
mov esi, [esp]
dec ecx
jns .FindNextExportFunction
.4_GetAPIAddress:
pop ebx
pop ebx
.NoExportTable:
popad
leave
ret 4*2
WinAPI: GetProcAddress 自实现
最新推荐文章于 2023-09-04 09:25:59 发布