#2
zhu2240392014-03-06 14:23
|
程序代码:
.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 编辑 ]