【文章标题】: 学写内存补丁(初级版)
【文章作者】: 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