_GetApi proc _hModule,_lpszApi
LOCAL @dwReturn,@dwStringLength
pushad
mov @dwReturn,0
;*************************************************
;重定位
;*************************************************
call @F
@@:
pop ebx
sub ebx,offset @B
;*************************************************
;创建用于错误处理的SEH结构
;*************************************************
assume fs:nothing
push ebp
lea eax,[ebx+offset _Error]
push eax
lea eax,[ebx+offset _SEHHandler]
push eax
push fs:[0]
mov fs:[0],esp
;**************************************************
;计算API字符串的长度(带尾部的0)
;**************************************************
mov edi,_lpszApi
mov ecx,-1
xor al,al
cld
repnz scasb
mov ecx,edi
sub ecx,_lpszApi
mov @dwStringLength,ecx
;****************************************************
;从PE文件头的数据目录获取导出表地址
;****************************************************
mov esi,_hModule
add esi,[esi+3ch]
assume esi:ptr IMAGE_NT_HEADERS
mov esi,[esi].OptionalHeader.DataDirectory.VirtualAddress
add esi,_hModule
assume esi:ptr IMAGE_EXPORT_DIRECTORY
;*****************************************************
;查找符合名称的导出函数名
;*****************************************************
mov ebx,[esi].AddressOfNames
add ebx,_hModule
xor edx,edx
.repeat
push esi
mov edi,[ebx]
add edi,_hModule
mov esi,_lpszApi
mov ecx,@dwStringLength
repz cmpsb
.if ZERO?
pop esi
jmp @F
.endif
pop esi
add ebx,4
inc edx
.until edx >= [esi].NumberOfNames
jmp _Error
@@:
;*******************************************************
;API名称索引--》序号索引--》地址索引
;*******************************************************
sub ebx,[esi].AddressOfNames
sub ebx,_hModule
shr ebx,1
add ebx,[esi].AddressOfNameOrdinals
add ebx,_hModule
movzx eax,word ptr [ebx]
shl eax,2
add eax,[esi].AddressOfFunctions
add eax,_hModule
;*********************************************************
;从地址表得到到处地址
;*********************************************************
mov eax,[eax]
add eax,_hModule
mov @dwReturn,eax
_Error:
pop fs:[0]
add esp,0ch
assume esi:nothing
popad
mov eax,@dwReturn
ret
_GetApi endp
罗云彬win32汇编的例子
;API名称索引--》序号索引--》地址索引
sub ebx,[esi].AddressOfNames
sub ebx,_hModule
shr ebx,1
add ebx,[esi].AddressOfNameOrdinals
add ebx,_hModule
movzx eax,word ptr [ebx]
shl eax,2
add eax,[esi].AddressOfFunctions
add eax,_hModule
开头为何SUB 看不大懂 所以整段如何实现注释里的功能不大明白
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!