📄 loader.asm
字号:
;==========================================================================
;《加密与解密__软件保护技术》 内存补丁示例
; WWW.PEDIY.COM
; 2002年11月
;==========================================================================
.486
.model flat, stdcall
option casemap :none
;//////////////////////////////////////////////////////////////////////////////////
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
;////////////////////////////////////////////////////////////////////////////////////
; EQU 数据
ORIGN_CODE EQU 016AH ; 注意是字比较
;////////////////////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////////////
; 数据段
.data
szMsgTitle db '内存补丁示例',0
szFileName db "EnableMenuasp.exe",0 ; 目标文件名
stStartUp STARTUPINFO <?>
psInfo PROCESS_INFORMATION <?>
BytesToWrite db 06Ah,00h ;写的数据
lChanges dd 2h ;需要修补的字节数
lVOffset dd 04011e3h ;需要修改的进程的虚拟地址
hProcess dd 0
szTemp db 10 DUP (?) ; 临时缓存区
AppName db "第4章 功能限制",0 ; 应用程序标题
; -------------------------------------------------------------------------
szLoadError db '无法被加载!', 0 ; 无法创建进程时的提示消息
szOK db '补丁成功 :)',0
szbyteError db '文件不匹配',0
;////////////////////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////////////
.code
start:
;---------------------------------------
;下面创建目标进程
invoke GetStartupInfo,addr stStartUp
invoke CreateProcess, ADDR szFileName, NULL, NULL, NULL, FALSE, 0, 0, 0, ADDR stStartUp, ADDR psInfo
.IF EAX == 0 ; 如果创建目标进程失败了
invoke lstrcat, ADDR szFileName, ADDR szLoadError
mov ebx,offset szFileName
jmp error
.ENDIF
Search:
invoke FindWindow,NULL,addr AppName
test eax,eax
jz Search ; 循环,直到找到正确的窗口名字
invoke ReadProcessMemory,psInfo.hProcess, lVOffset, ADDR szTemp, 2, 0 ; 读取指定地址的2个字节
.IF WORD PTR [szTemp] != ORIGN_CODE
mov ebx,offset szbyteError
jmp error
.ENDIF
invoke WriteProcessMemory,psInfo.hProcess, lVOffset, ADDR BytesToWrite, lChanges, ADDR szTemp
.IF eax==FALSE
mov ebx,offset szbyteError
jmp error
.ENDIF
mov ebx,offset szOK
error:
invoke MessageBox,NULL,ebx,offset szMsgTitle,MB_OK+MB_ICONINFORMATION
invoke ExitProcess,NULL ; 退出
End start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -