借个位置
程序代码:
.386 .model flat,stdcall option casemap:none GetKernelBase proto GetApiAddress proto :dword .data szFuctionName db 'LoadLibraryA',0 szFuctionName1 db "GetProcAddress",0 .code start: mov esi,[esp] invoke GetKernelBase invoke GetApiAddress,offset szFuctionName mov ebx,eax jmp $ GetKernelBase proc uses esi .while 1 xor si,si .if word ptr [esi]=="ZM" mov eax,[esi+3ch] .if word ptr [esi+eax]=="EP" mov eax,esi .break .endif .endif dec esi .if esi<=70000000h .break .endif .endw ret GetKernelBase endp GetApiAddress proc uses esi ecx ebx szfunctionname:dword LOCAL ad:dword mov ebx,[eax+3ch] ;获取PE头偏移 add ebx,eax ;定位PE头 add ebx,078h ;定位数据目录项偏移 mov ebx,[ebx] ;提取导出表偏移地址 add ebx,eax ;定位导出表 mov ebx,[ebx+020h] ;提取字符函数偏移 add ebx,eax ;定位字符函数偏移 mov ad,ebx cld xor edx,edx next1: mov ebx,ad mov ebx,[ebx] ;提取字符函数存放字符串的偏移 add ebx,eax ;定位字符串地址 mov esi,ebx mov ecx,3 mov edi,szfunctionname next: cmpsd ;比较字符串 jz continue inc edx mov ebx,ad sub ebx,2 cmp edx,[ebx] ja nofind add ad,4 jmp next1 continue: loop next push eax mov eax,4 mul dx shl dx,8 or edx,eax pop eax mov ebx,[eax+24h] add ebx,eax add edx,ebx mov edx,[edx] ;取得函数的序号 push eax mov eax,4 mul dx shl dx,8 or edx,eax pop eax mov ebx,[eax+01ch] add ebx,eax add edx,ebx add eax,[edx] ;定位函数的地址 ret nofind: mov eax,0 ret GetApiAddress endp end start
[ 本帖最后由 zhu224039 于 2014-3-6 14:21 编辑 ]