WinAPI: GetProcAddress 自实现

本文档展示了如何使用汇编语言实现一个与系统API GetProcAddress功能类似的GetAPIAddr函数,该函数通过检查PE文件格式并遍历导出表来查找指定API的地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

;***************************************************************************************** 
;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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值