【文章标题】: 学写内存补丁(初级版)
【文章作者】: KuNgBiM
【作者邮箱】: kungbim@163.com
【作者主页】: http://www.crkcn.com
【软件名称】: QQ聊天记录查看器 5.3
【软件大小】: 648KB
【下载地址】: 自己下载
【加壳方式】: N/A
【保护方式】: 序列号
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OD、RadASM、Masm32
【操作平台】: 盗版XPsp2
【软件介绍】: 可以不用密码查看QQ聊天记录.
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
我们在玩破解的时候,经常会见到今天象目标这样的软柿子:
004862DC > $ 55 push ebp ; OD载入停在这里
004862DD . 8BEC mov ebp, esp
004862DF . 83C4 F0 add esp, -10
004862E2 . B8 B4604800 mov eax, 004860B4
004862E7 . E8 B403F8FF call 004066A0
004862EC . A1 F88A4800 mov eax, dword ptr [488AF8]
004862F1 . 8B00 mov eax, dword ptr [eax]
004862F3 . E8 E81EFDFF call 004581E0
004862F8 . 33C9 xor ecx, ecx
004862FA . B2 01 mov dl, 1
004862FC . A1 80F34600 mov eax, dword ptr [46F380]
00486301 . E8 52A9FCFF call 00450C58
00486306 . 8B15 E88A4800 mov edx, dword ptr [488AE8] ; QQlogger.00489CF4
0048630C . 8902 mov dword ptr [edx], eax
0048630E . A1 E88A4800 mov eax, dword ptr [488AE8]
00486313 . 8B00 mov eax, dword ptr [eax]
00486315 . 8B10 mov edx, dword ptr [eax]
00486317 . FF92 E8000000 call dword ptr [edx+E8]
0048631D . A1 E88A4800 mov eax, dword ptr [488AE8]
00486322 . 8B00 mov eax, dword ptr [eax]
00486324 . E8 E7D1F7FF call 00403510
00486329 . A1 F8884800 mov eax, dword ptr [4888F8] ; 是否选择了QQ号码
0048632E . 8338 00 cmp dword ptr [eax], 0
00486331 . 74 69 je short 0048639C
00486333 . A1 D0884800 mov eax, dword ptr [4888D0] ; 程序是否注册过
00486338 . 8338 00 cmp dword ptr [eax], 0
0048633B . 75 3B jnz short 00486378 ; 如果程序注册过这里发生跳转!(75 --> EB)
0048633D . 33C9 xor ecx, ecx
0048633F . B2 01 mov dl, 1
00486341 . A1 ECE94600 mov eax, dword ptr [46E9EC]
00486346 . E8 0DA9FCFF call 00450C58
0048634B . 8B15 F08B4800 mov edx, dword ptr [488BF0] ; QQlogger.00489CE4
00486351 . 8902 mov dword ptr [edx], eax
00486353 . A1 F08B4800 mov eax, dword ptr [488BF0]
00486358 . 8B00 mov eax, dword ptr [eax]
0048635A . 8B10 mov edx, dword ptr [eax]
0048635C . FF92 E8000000 call dword ptr [edx+E8]
00486362 . A1 F08B4800 mov eax, dword ptr [488BF0]
00486367 . 8B00 mov eax, dword ptr [eax]
00486369 . E8 A2D1F7FF call 00403510
0048636E . A1 D0884800 mov eax, dword ptr [4888D0]
00486373 . 8338 00 cmp dword ptr [eax], 0
00486376 . 74 24 je short 0048639C
00486378 > 8B0D 008B4800 mov ecx, dword ptr [488B00] ; 到这里就来到程序主窗体
0048637E . A1 F88A4800 mov eax, dword ptr [488AF8]
00486383 . 8B00 mov eax, dword ptr [eax]
00486385 . 8B15 DC384800 mov edx, dword ptr [4838DC] ; QQlogger.00483928
0048638B . E8 681EFDFF call 004581F8
00486390 . A1 F88A4800 mov eax, dword ptr [488AF8]
00486395 . 8B00 mov eax, dword ptr [eax]
我们根据以上分析很显然得出只要将0048633B处的:
jnz 00486378 改为 jmp 00486378 就可以完成该软件的破解。
我们得知该地址中指令jnz对应的机器码是75,而我们需要修改的指令jmp对应的机器码是EB,所以我们可以编写一个简单的补丁程序:
(这种是最简陋的内存补丁方式,不支持加壳后的程序,因为加壳后的程序有很多代码都是在壳中解码出来的。)
--------------------------------------------------------------------------------代码:;#######################################################################
;学写内存补丁(初级版)
;
;QQ聊天记录查看器 5.3 - 内存补丁
;
;Patcher by KuNgBiM
;
;2007-06-30
;
; Use: ml /c /coff MemPatcher1.asm
; link /SUBSYSTEM:WINDOWS MemPatcher1.obj
;#######################################################################
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
;#######################################################################
.data
AppName db 'QQ聊天记录查看器 5.3 - 内存补丁',0
msg_run db '此程序必须与被补丁文件在同一目录下!',0
msg_read db '错误',0
msg_ver db '请检查目标程序是否正确!',0
msg_cap db '启动失败',0
msg_write db '错误',0
m_progname db 'QQlogger.exe',0; 目标文件名
; ---- 补丁数据 ----
m_addr_to_patch1 dd 0048633Bh ; 补丁地址
m_original_bytes1 db 075h ; 原始代码
m_new_bytes1 db 0EBh ; 补丁代码
m_num_of_bytes1 dd 1 ; 数据大小
m_loop_me dd 5 ; 设置5秒后启动
.data?
read_buffer db 512 dup (?)
startinfo STARTUPINFO <>
pi PROCESS_INFORMATION <>
.code
start:
invoke GetStartupInfo,addr startinfo
invoke CreateProcess,addr m_progname,NULL,NULL,NULL,FALSE,20h,NULL,NULL,addr startinfo,addr pi
test eax,eax
jz _launch_error
mov ebx,m_loop_me
_the_loop:
invoke ReadProcessMemory,dword ptr [pi],m_addr_to_patch1,addr read_buffer,m_num_of_bytes1,0
test eax,eax
jz _read_proc_error
lea esi,read_buffer
lea edi,m_original_bytes1
mov ecx,m_num_of_bytes1
repz cmpsb
jnz _down
jmp _patch_the_mother
_down:
dec ebx
jnz _the_loop
jmp _wrong_ver
_patch_the_mother:
invoke WriteProcessMemory,dword ptr [pi],m_addr_to_patch1,addr m_new_bytes1,m_num_of_bytes1,0
test eax,eax
jz _write_proc_error
jmp _exit
_launch_error:
invoke MessageBox,NULL,addr msg_run,addr msg_cap,MB_ICONSTOP+MB_OK
jmp _exit
_read_proc_error:
invoke MessageBox,NULL,addr msg_read,addr msg_cap,MB_ICONSTOP+MB_OK
jmp _exit
_wrong_ver:
invoke MessageBox,NULL,addr msg_ver,addr msg_cap,MB_ICONSTOP+MB_OK
jmp _exit
_write_proc_error:
invoke MessageBox,NULL,addr msg_write,addr msg_cap,MB_ICONSTOP+MB_OK
_exit:
invoke CloseHandle,dword ptr [pi]
invoke CloseHandle,dword ptr [startinfo]
invoke ExitProcess,0
end start
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年06月30日 PM 04:50:23