内存补丁的编写与运用(一).txt
来自「这是最简单的内存补丁方法,又很多的不足,因为程序的好多代码都是在壳中才解密出来的」· 文本 代码 · 共 74 行
TXT
74 行
我们在破解软件的时候,经常会见到这样的经典语句:
Call 00405432
00401234: Je 00402310
Call 00402410 ;显示注册失败
…
…
…
00402310: call 00402510 ;显示注册成功
很显然,我们只要将je 00402310改为jmp 00402310就可以完成简单的破解.
我们知道指令je对应的机器码是74,而jmp对应EB,因此我们可以编写如下补丁程序:
;内存补丁实例(一) Code bY eLaNce@crsky
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
;宏定义
CTEXT MACRO quoted_text:VARARG
EXITM <ADDR literal(quoted_text)>
ENDM
literal MACRO quoted_text:VARARG
LOCAL local_text
.data
local_text db quoted_text,0
.code
EXITM <local_text>
ENDM
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
BREAK_POINT1 equ 00401234h ;第一个断点
.data?
dbOldByte db ?
stStartUp STARTUPINFO <?>
stProcInfo PROCESS_INFORMATION <?>
.const
dbPatch db 74h
dbPatched db 0ebh
szExecFilename db 'test.exe',0 ;文件名
.code
start:
invoke GetStartupInfo,addr stStartUp
invoke CreateProcess,offset szExecFilename,NULL,NULL,NULL,NULL,NORMAL_PRIORITY_CLASS or CREATE_SUSPENDED,0,\
0,offset stStartUp,offset stProcInfo
.if eax
;读取进程内存
invoke ReadProcessMemory,stProcInfo.hProcess,BREAK_POINT1,addr dbOldByte,1,NULL
.IF EAX
mov ax,WORD ptr dbOldByte
.if ax == WORD ptr dbPatch
invoke WriteProcessMemory,stProcInfo.hProcess,BREAK_POINT1,addr dbPatched,1,NULL
invoke ResumeThread,stProcInfo.hThread
.else
invoke TerminateProcess,stProcInfo.hProcess,-1
invoke MessageBox,NULL,CTEXT("补丁出错"),CTEXT("ERROR"),MB_OK
.endif
.endif
invoke CloseHandle,stProcInfo.hProcess
invoke CloseHandle,stProcInfo.hThread
.else
invoke MessageBox,NULL,CTEXT("无法装载目标文件"),CTEXT("ERROR"),MB_OK
.endif
invoke ExitProcess,NULL
end start
也许很多人会说,有这个必要吗?直接将00401234: Je 00402310改为:00401234: Jmp 00402310不就行了吗?何必为此再编程?可是,如果软件带有文件自校验的话,你说的那种文件补丁不就不能用了吗?
当然,现在这种只是最简单的内存补丁方法,又很多的不足,如,倘若我们欲补丁的程序加过壳,我们的补丁就没法用了,因为程序的好多代码都是在壳中才解密出来的,我将在下一篇文章中给出改进方案.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?