1.文件无扩展名时,unpack无法生成脱壳文件,提示Save file failed.
解决:搜索_unpack字符串调用,在此调用前面不远处,可以看到搜索字符.(2E)的函数调用。
将.(2E)换为\(5C)
将push eax(\FileName)
push offset(_unpack)
顺序对调
最终生成的unpack文件名的格式为:rawfilename_unpack
2.没有只运行一个实例的功能,右键查壳时,还要把先前的实例关掉,比较麻烦
利用原程序本身的api实现该功能,用汇编另写代码如下:
_CompareFileName proc _pszFileNameEnd,_dwFileNameLength,_pszProcFile
mov ebx,_dwFileNameLength
mov edi,_pszFileNameEnd
mov esi,_pszProcFile
xor ecx,ecx
@@:
lodsb
inc ecx
or al,al
jne @B
dec esi
cmp ebx,ecx
jae @F
mov eax,0
ret
@@:
std
repz cmpsb [edi],[esi]
cld
or ecx,ecx
jz @F
mov eax,0
ret
@@:
mov eax,1
ret
_CompareFileName endp
_GetProcessList proc
local @stProcess:PROCESSENTRY32
local @hSnapShot
LOCAL @szFileName[MAX_PATH]:byte
LOCAL @dwCurrentProcessID,@dwFileNameLength,@pszFileNameEnd
invoke GetModuleFileName,NULL,addr @szFileName,MAX_PATH
nop
invoke GetCurrentProcessId
nop
mov @dwCurrentProcessID,eax
lea esi,@szFileName
xor ecx,ecx
@@:
lodsb
inc ecx
or al,al
jne @B
dec ecx
mov @dwFileNameLength,ecx ;ebx存放_pszFileName的长度
dec esi
mov @pszFileNameEnd,esi
mov @stProcess.dwSize,sizeof @stProcess
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
nop
mov @hSnapShot,eax
invoke Process32First,@hSnapShot,addr @stProcess
nop
.while eax
invoke _CompareFileName,@pszFileNameEnd,@dwFileNameLength,addr @stProcess.szExeFile
or eax,eax
jz @F
mov eax,@dwCurrentProcessID
cmp eax,@stProcess.th32ProcessID
jz @F
invoke OpenProcess,PROCESS_TERMINATE,FALSE,@stProcess.th32ProcessID
nop
.if eax
invoke TerminateProcess,eax,-1
nop
jmp OUTCOMPARE
.endif
@@:
invoke Process32Next,@hSnapShot,addr @stProcess
nop
.endw
OUTCOMPARE:
invoke CloseHandle,@hSnapShot
nop
ret
_GetProcessList endp
备注:masm代码调用api时,需在调用后加nop,以备有空间修改代码,因为masm对api的调用跟vc部分地方不太一样,masm用call sub (E8)实现,而vc使用call [offset](FF 15)实现
将此代码拷贝到待修改程序指定位置后,修改nop前的调用api的指令
将winmain跳转到此代码段后跳回即可