向上反动几下就看到了
0043B43C |. E8 F7B40500 call Registry.00496938
0043B441 |. 83F8 01 cmp eax,0x1
0043B444 |. 0F85 A4000000 jnz Registry.0043B4EE
Nop掉0043B444 |. 0F85 A4000000 jnz Registry.0043B4EE就出现了注册成功,
但是重启任然是未注册,显然是重启验证,我们先进关键call里去查看查看
有2出调用,好吧!我们全下断重启软件
重启软件后发现先断在了49491c处,这里是启动验证,经过调试得出494923的jnz不跳就是未注册,必须在让eax出call是值要调整为1。
结合上面的分析得出:虽然启动和注册是分开的,但是call是一个,好吧!我们把目光聚焦在call Registry.00496938
重新来,断下后F7进cal,好长一段代码
在不修改的时候出call eax=0,我们向上找eax有赋值的地方修改,再看信息框处有8次跳转过来,每次跳转都有个eax赋值语句
00496A59 |. E8 F62E0800 call Registry.00519954
00496A5E |. 8B85 F0FAFFFF mov eax,[local.324]
00496A64 |. E9 EC0D0000 jmp Registry.00497855
00496C12 |. E8 3D2D0800 call Registry.00519954
00496C17 |. 8B85 E8FAFFFF mov eax,[local.326]
00496C1D |. E9 330C0000 jmp Registry.00497855
00496E05 |. E8 4A2B0800 call Registry.00519954
00496E0A |. 8B85 54FAFFFF mov eax,[local.363]
00496E10 |. E9 400A0000 jmp Registry.00497855
00496FB9 |. E8 96290800 call Registry.00519954
00496FBE |. 8B85 44FAFFFF mov eax,[local.367]
00496FC4 |. E9 8C080000 jmp Registry.00497855
004972AC |. E8 A3260800 call Registry.00519954
004972B1 |. 8B85 34FAFFFF mov eax,[local.371]
004972B7 |. E9 99050000 jmp Registry.00497855
0049746F |. E8 E0240800 call Registry.00519954
00497474 |. 8B85 20FAFFFF mov eax,[local.376]
0049747A |. E9 D6030000 jmp Registry.00497855
0049764E |. E8 01230800 call Registry.00519954
00497653 |. 8B85 0CFAFFFF mov eax,[local.381]
00497659 |. E9 F7010000 jmp Registry.00497855
00497765 |. E8 EA210800 call Registry.00519954
0049776A |. 8B85 04FAFFFF mov eax,[local.383]
00497770 |. E9 E0000000 jmp Registry.00497855
Call 00519954 被调用多次,每次出call都是个变量给eax赋值,结合网站上购买协议,我们暂且猜测这是不同版本的注册。
好了,先从第二个下手,为什么第二个?因为第一个被跳过了,修改代码地方越少越好,所以从第二个入手。
注册成功但是修复错误时出现
显然注册是不完全的!我们要想办法断在上面提示框出来之前!!
………………漫长的调试………………
找到给变量赋值的地方查找参考地址常量
00496BB3 C785 E8FAFFFF>mov dword ptr ss:[ebp-0x518],0x1 ; 给变量赋初值
觉定去0043dcba看看,好长的代码!循环套循环,难道是在做某个验证?断首下断点
点修复错误成功断下。
F8单步
0043DBFA |. E8 B1410000 call Registry.00441DB0
0043DBFF |. 85C0 test eax,eax
0043DC01 |. 0F85 52010000 jnz Registry.0043DD59
0043DC07 |. 6A 00 push 0x0
0043DC09 |. 8D8D F0FAFFFF lea ecx,[local.324]
0043DC0F |. E8 0CFB0400 call Registry.0048D720
0043DC14 |. C745 FC 00000>mov [local.1],0x0
0043DC1B |. 8B85 F8F8FFFF mov eax,[local.450]
0043DC21 |. 8945 C8 mov [local.14],eax
0043DC24 |. 8D8D F0FAFFFF lea ecx,[local.324]
0043DC2A |. E8 CAC80D00 call Registry.0051A4F9 ; 启动提示框
不要提示框出现0043DC01的JNZ就必须要跳,我们F7进0043DBFA的call。
进call后发现好熟悉的模式。
改掉变量赋值后提示框没有了,但是。。。。。。。。
错误并没有修复,继续。。。。。。
查找地址常量和以前的赋值地点变化了很多。有4处赋值,其中第四处是为了干掉提示框修改的,那我们修改掉上面几处看看吧!
完美的KO
总结:
软件启动、注册、功能分别验证。启动和注册调用了同一个call,而功能的验证是另外的call。共同点是所有的值全是靠变量传递的!
假如我们是作者,那个功能验证不出任何提示,没有那个提示框,将要复杂的多,真是无从下手了!哈哈~~~
对了,最开始提到的8个跳转,有兴趣可以试试是有时间的版本
由于时间仓促,刚才有网友提醒我!我试了下,其他地方还有功能限制,我会在下面的帖子中处理好。再发下载链接