内存补丁的编写与运用(一).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 + -
显示快捷键?