第七课 实战文件注册机制

                 实战文件注册机制【盲人摸象】
故名思意就是借助一些我们常用的按钮事件,API 断点,去高速有效的锁定
此课主要是以回顾和巩固以上六课我们所学的知识,当然这课我奉劝大家
还是认真的学习,尤其是以后想靠外挂赚钱的同学,这课学得多自然就会得多
不要认为我就是一味的靠我的经验,以下就是一系列调试的技巧
 
这课主要是观看MOV 的赋值,以及寄存器的变化,从而达到破解
这也是以后在破解带有VM 代码的程序时必须做得到的初级知识
废话就不多说,课程开始
 
 
 
Borland C++ 1999
 
 
00401620 > $ /EB 10         jmp short Unpacked.00401632
00401622   . |66:623A       bound di,dword ptr ds:[edx]
00401625   . |43            inc ebx
00401626   . |2B2B          sub ebp,dword ptr ds:[ebx]
00401628   . |48            dec eax
00401629   . |4F            dec edi                                  ;  ntdll.7C930228
0040162A   . |4F            dec edi                                  ;  ntdll.7C930228
0040162B   . |4B            dec ebx
0040162C   . |90            nop
0040162D   .-|E9 98D06300   jmp Unpacked.00A3E6CA
00401632   > \A1 8BD06300   mov eax,dword ptr ds:[0x63D08B]
00401637   .  C1E0 02       shl eax,0x2
0040163A   .  A3 8FD06300   mov dword ptr ds:[0x63D08F],eax
0040163F   .  52            push edx                                 ;  ntdll.KiFastSystemCallRet
00401640   .  6A 00         push 0x0                                 ; /pModule = NULL
00401642   .  E8 37AD2300   call <jmp.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA
00401647   .  8BD0          mov edx,eax
00401649   .  E8 3A932200   call Unpacked.0062A988
0040164E   .  5A            pop edx                                  ;  kernel32.7C817027
0040164F   .  E8 98922200   call Unpacked.0062A8EC
00401654   .  E8 6F932200   call Unpacked.0062A9C8
 
 
 
BC++ 的按钮事件是和DELPHI 对应,是一样的
他们查找字符串,都是同样采取查找ASCII 码搜索
 
重启验证必须在程序还未完全初始化之时,找到重启后的关键地址,进行破解
 
00420813  |.  6A 00         push 0x0                                 ; /ExitCode = 0
ExitCode 就是退出代码的意思
 
 
00402D8B   .  50            push eax                                 ; /pHandle = FFFFFF01
00402D8C   .  68 5BD26400   push Unpacked.0064D25B                   ; |SOFTWARE\EasyBoot Systems\UltraISO\5.0
00402D91   .  68 01000080   push 0x80000001                          ; |hKey = HKEY_CURRENT_USER
00402D96   .  E8 51942300   call <jmp.&ADVAPI32.RegOpenKeyA>         ;
 
RegOpenKeyA     打开注册表的意思
 
 
00402E1C   > \FF75 C8       push dword ptr ss:[ebp-0x38]             ; /hKey = 000000D8 (window)
00402E1F   .  E8 AA932300   call <jmp.&ADVAPI32.RegCloseKey>         ;
 
RegCloseKey    关闭注册表
 
既然是 注册表 类型重启,就必须读取注册表,而读取信息后,就会采用RegCloseKey 关闭注册表,从而我们可以判断,RegCloseKey 以下就是关键代码,所以我们必须得留意所有跳过了CALL 的判断型跳转
 
通常我们需要注意的语句有这种类型的,也就是一个CALL ,出来之后,把值赋值给EAX
这是任何开发语言都有的,所以以下就是我们需要留意的啦
 
 
 
00402FE9   .  A3 B0D76400   mov dword ptr ds:[0x64D7B0],eax
00402FEE   .  8B15 B0D76400 mov edx,dword ptr ds:[0x64D7B0]
00402FF4   .  85D2          test edx,edx                             ;  Unpacked.00B460B4
 
 
0047194D  |.  68 03A86600   push Unpacked.0066A803                   ;  uikey.ini
00471952  |.  68 E07E6C00   push Unpacked.006C7EE0                   ;  C:\Program Files\UltraISO
00471957  |.  68 FDA76600   push Unpacked.0066A7FD                   ;  %s\%s
 
注意UIkey.ini
 
00471AE4  |.  52            push edx                                 ; /pHandle = 00090000
00471AE5  |.  68 43A86600   push Unpacked.0066A843                   ; |SOFTWARE\EasyBoot Systems\UltraISO\5.0
00471AEA  |.  68 01000080   push 0x80000001                          ; |hKey = HKEY_CURRENT_USER
00471AEF  |.  E8 F8A61C00   call <jmp.&ADVAPI32.RegOpenKeyA>         ; \RegOpenKeyA
 
在一次读取注册表,从而可以更加的肯定,此为启动前的关键CALL
 
0012F6CC   0066A873  ASCII "Registration"
0012F6D0   00000000
0012F6D4   0012FAF0
0012F6D8   0012F7E4  ASCII "Jiack"
 
读取到了我的用户名
 
00471B8B  |> \FF75 DC        push [local.9]                           ; /hKey = 000000D8 (window)
00471B8E  |.  E8 3BA61C00    call <jmp.&ADVAPI32.RegCloseKey>         ; \RegCloseKey
 
关闭了注册表
 
00471D89  |.  FF75 08        push [arg.1]
00471D8C  |.  68 7C7A8200    push Unpacked.00827A7C                   ;  Jiack
00471D91  |.  E8 42921B00    call Unpacked.0062AFD8
00471D96  |.  83C4 08        add esp,0x8
00471D99  |.  FF75 0C        push [arg.2]
00471D9C  |.  68 807B8200    push Unpacked.00827B80                   ;  1111111111111111
00471DA1  |.  E8 32921B00    call Unpacked.0062AFD8
 
准备压入注册名和假码
 
 
00471DA9  |.  B8 01000000    mov eax,0x1     此时EAX, 赋值为1
00471DAE  |>  8BE5           mov esp,ebp
00471DB0  |.  5D             pop ebp
00471DB1  \.  C3             retn
 
00403027   .  8B0D F0716800  mov ecx,dword ptr ds:[0x6871F0]
0040302D   .  A1 C0D06300    mov eax,dword ptr ds:[0x63D0C0]          ;  %w
00403032   .  3BC8           cmp ecx,eax
00403034   .  74 19          je short Unpacked.0040304F
 
0041FFA5  |> \33C9           xor ecx,ecx        0
0041FFA7  |.  890D B0D76400  mov dword ptr ds:[0x64D7B0],ecx   赋值0
 
 
 
0041FFA5  |> \33C9           xor ecx,ecx
0041FFA7  |.  890D B0D76400  mov dword ptr ds:[0x64D7B0],ecx  //0
0041FFAD  |.  EB 0A          jmp short Unpacked.0041FFB9
0041FFAF  |>  C705 B0D76400 >mov dword ptr ds:[0x64D7B0],0x1  //1
 
00403056   .  8B0D A86E6C00 mov ecx,dword ptr ds:[0x6C6EA8]          ;  Unpacked._frmMain
 
就是在破解程序中需要留意每一次的EAX 的赋值
 
因为EAX ,是控制着我们的判断型跳转的
 
 
 
 

猜你喜欢

转载自blog.csdn.net/zang141588761/article/details/81043004