用作例子的软件是”开博电缆报价系统“
一、破解过程
1、载入OD运行软件后,点击”注册“后输入假码,弹窗
看到了弹窗,使用F12暂停法,按Alt+F9后,在点击弹窗的确定后就从系统空间返回到用户代码(或者可以按Ctrl+F9,F8出call几次后也能返回到用户代码)。
这时还不是弹窗call,继续F8出call后就找到了
0073868D |> \A1 C4C07400 mov eax,dword ptr ds:[0x74C0C4]
00738692 |. C600 00 mov byte ptr ds:[eax],0x0
00738695 |. 6A 10 push 0x10
00738697 |. B9 BC877300 mov ecx,007387BC ; 开博科技
0073869C |. BA 04887300 mov edx,00738804 ; 注册失败。http://www.dianlan8.com。
007386A1 |. A1 5CC77400 mov eax,dword ptr ds:[0x74C75C]
007386A6 |. 8B00 mov eax,dword ptr ds:[eax]
007386A8 |. E8 1FB3D3FF call 004739CC ; 弹窗call
007386AD |> A1 C4C07400 mov eax,dword ptr ds:[0x74C0C4]
007386B2 |. 8038 01 cmp byte ptr ds:[eax],0x1
2、向上寻找能跳过这个注册失败的跳转,找到的为:
00738574 |. E8 0F98FFFF call 00731D88 ; 关键call
00738579 |. 84C0 test al,al
0073857B |. 0F84 0C010000 je 0073868D ; 关键跳
进入关键call里面,发现是由3处都调用了这个关键call,
所以想到修改关键call的返回值。在关键call出下断点,再次注册,看一下关键call的运行流程。
修改关键call的段首为:
00731D88 B8 01000000 mov eax,0x1
00731D8D C3 retn
但是当使用软件的功能时,还是不行,提示未注册。所以这个关键call只是能够让在注册时不弹窗了,对于别的还是没有作用的。
还得从别的地方入手。
3、既然又弹窗了,继续F12暂停法找到关键代码。
00713B15 . A1 C4C07400 mov eax,dword ptr ds:[0x74C0C4]
00713B1A . 8038 00 cmp byte ptr ds:[eax],0x0
00713B1D . 75 1D jnz short 00713B3C ; 关键跳
00713B1F . 6A 10 push 0x10
00713B21 . B9 E83B7100 mov ecx,00713BE8
00713B26 . BA F43B7100 mov edx,00713BF4 ; 未注册版本不可使用本功能。请注册为正版用户!\r注册后,您将获得专业的技术支持和最新升级版本。
00713B2B . A1 5CC77400 mov eax,dword ptr ds:[0x74C75C]
00713B30 . 8B00 mov eax,dword ptr ds:[eax]
00713B32 . E8 95FED5FF call 004739CC ; 弹窗call
找到关键跳,影响关键跳的就是[[0x74C0C4]]的值,这里用了两层的中括号,是因为[0x74C0C4]先是给了eax,又取了[eax]的值。这就相当于C语言中的指针,0x74C0C4是一个指针,取它所指向内存的内容后,给了eax。然后再把eax看成指针,取eax所指向的内存的内容。关键就在于[0x74C0C4]的值74FB70,当74FB70为1就是已注册,为0就是未注册。但是直接把74FB70修改为1后,会发现不久又变回0了。说明程序里还有代码会每隔一段时间对74FB70进行重新赋值的。
4、对74FB70下硬件写入断点,找到是哪里对74FB70进行重新赋值。
从断下来的地方向上分析,找到代码并修改就行了。
网友评论