mov eax,[offset lpszLoadError-data1][ebx]
push eax
mov eax,[offset dll_name-data1][ebx]
push eax
push NULL
call MessageBox
invoke ExitProcess,NULL
.endif
.endif
mov dword ptr[esi],0
mov [offset hdll-data1][ebx],eax
mov eax,[edi].FirstThunk
invoke RVAtoAddr,eax
push eax ;FirstThunk的偏移量压栈,
.if [edi].OriginalFirstThunk!=0 ;有的连接器会将OriginalFirstThunk的值置0,这时取FirstThunk所指的数组的值指向涵数名
mov eax,[edi].OriginalFirstThunk
invoke RVAtoAddr,eax
push eax ;OriginalFirstThunk的偏移量压栈,这时eax所指数组的值指向IMAGE_IMPORT_BY_NAME
.else
push eax ;这时eax所指数组的值指向IMAGE_IMPORT_BY_NAME
.endif
call SetprocAddr
pop edx
add edx,sizeof IMAGE_IMPORT_DESCRIPTOR
add edi,sizeof IMAGE_IMPORT_DESCRIPTOR
.endw
impend:
ret
import endp
RVAtoAddr proc RVA:DWORD
mov eax,RVA
ADD eax,DWORD PTR[offset imagebase-data1][ebx]
ret
RVAtoAddr endp
SetprocAddr proc uses edi ecx esi edx naddr:DWORD ,faddr:DWORD
mov edi,naddr
mov esi,faddr
.while DWORD PTR[edi]!=0
.if dword ptr[edi]&80000000h ;判断涵数是以序号方式引入,还是用名称的方式引入。
mov eax,dword ptr[edi]
and eax,7fffffffh ;得到引入函数的序号
push eax
.else
mov eax,DWORD PTR[edi]
invoke RVAtoAddr,eax
assume eax:ptr IMAGE_IMPORT_BY_NAME
IF DEBUG
pusha
push MB_OK
lea ecx,[offset d_sz1-data1][ebx]
push ecx
lea ecx,[eax].Name1
push ecx
push 0
call MessageBox
popa
ENDIF
lea ecx,[eax].Name1
push ecx
push ecx
.endif
mov ecx,[offset hdll-data1][ebx]
push ecx
call GetProcAddress
.if eax==0
lea eax,[offset lpszLoadError-data1][ebx]
push MB_ICONEXCLAMATION+MB_OK
push eax
push eax
push 0
call MessageBox
invoke ExitProcess,0
.endif
.if !(dword ptr[edi] & 80000000h)
pop ecx
mov DWORD PTR[ecx-2],0
.endif
mov DWORD PTR[esi],eax
add esi,sizeof IMAGE_THUNK_DATA
add edi,sizeof IMAGE_THUNK_DATA
.endw
ret
SetprocAddr endp
;----------------------------------------------------------