当直接编译运行bind程序的时候发现目标程序打完补丁之后无法正常运行。看汇编源码终于找到了问题所在,本文找出了源程序的一个函数编写的错误并给出了正确写法。改正之后经bind程序打完补丁的目标程序可以正常运行。
1._getValidHeadSize函数原汇编代码:
;--------------------------------------
; 获取目标PE头的数据的有效长度
;--------------------------------------
getValidHeadSize proc _lpFileHead
local @dwReturn
local @dwTemp
pushad
mov esi,_lpFileHead
assume esi:ptr IMAGE_DOS_HEADER
add esi,[esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
mov edx,esi
add edx,sizeof IMAGE_NT_HEADERS
assume edx:ptr IMAGE_SECTION_HEADER
mov eax,[edx].PointerToRawData ;指向第一个节的起始
mov @dwTemp,eax
dec eax
mov esi,eax
add esi,_lpFileHead
mov @dwReturn,0
.repeat
mov bl,byte ptr [esi]
.if bl!=0
.break
.endif
dec esi
inc @dwReturn
.until FALSE
mov eax,@dwTemp
sub eax,@dwReturn
add eax,2 ;为有效数据留出两个0字符,假如最后的有效数据为字符串,必须以0结束
mov @dwReturn,eax
popad
mov eax,@dwReturn
ret
getValidHeadSize endp
2._getValidHeadSize函数修改后的汇编代码:
;--------------------------------------
; 获取目标PE头的数据的有效长度
;--------------------------------------
getValidHeadSize proc _lpFileHead
local @dwReturn
local @dwTemp
pushad
mov esi,_lpFileHead
assume esi:ptr IMAGE_DOS_HEADER
add esi,[esi].e_lfanew
mov @dwTemp,esi
dec esi
mov @dwReturn,0
.repeat
mov bl,byte ptr [esi]
.if bl!=0
.break
.endif
dec esi
inc @dwReturn
.until FALSE
mov eax,@dwTemp
sub eax,@dwReturn
sub eax,_lpFileHead
add eax,2 ;为有效数据留出两个0字符,假如最后的有效数据为字符串,必须以0结束
mov @dwReturn,eax
popad
mov eax,@dwReturn
ret
getValidHeadSize endp