关于破解ShowDep
——hg 首记
哎!已经没有什么软件破解了!(不要误解哟,我可不是什么高手,只是我机子上没有什么可以破解的软件了,且我这破机子也没有连上网,网吧老板又不让我用软盘。哎!......)
于是,随手拿出以前买的光盘。嘿,上边的好东西还真不少呢!我一下便看上了ShowDep(3.0 Beta)。先试试再说吧。
好了,废话少说,开始吧!
1. 运行ShowDep
2. 用鼠标单击ShowDep菜单->“Help”, 然后再单击“About”
3. 待弹出对话框后请再单击“Register”按钮
name:hg
number:78787878
4. ctrl+D, 激活softIce
5. bpx hmemcpy
6. 按F5
7. 用鼠标单击“OK”按钮,这时程序被拦
8. BD *,按F12, 直到进入ShowDep的领空(好像是按26下吧)
9. 当走到 0137:00417290 call 004170B1 时按F8进入(跳过则死了!!)
.
.
.
0137:00417163 PUSH EAX
0137:00417164 LEA ECX,[EBP-0108]
0137:0041716A PUSH ECX
0137:0041716B CALL 00416A80
;改变number格式(78787878-->0x78787878)只取末8位。
0137:00417170 ADD ESP,08
0137:00417173 TEST EAX,EAX
0137:00417175 JZ 00417194
0137:00417177 MOV EDX,[EBP-0110]
0137:0041717D ADD EDX,00000104
0137:00417183 PUSH EDX
0137:00417184 MOV EAX,[EBP-04]
0137:00417187 PUSH EAX
0137:00417188 CALL 00416B60
;比较核心
0137:0041718D ADD ESP,08
0137:00417190 TEST EAX,EAX
0137:00417192 JNZ 004171B0
;Eax=1则跳转,注册成功,否则...
0137:00417194 PUSH 10
0137:00417196 PUSH 0042B958
0137:0041719B PUSH 0042B960
0137:004171A0 PUSH 00
0137:004171A2 CALL [USER32!MessageBoxA]
;失败窗
0137:004171A8 OR EAX,-01
0137:004171AB JMP 00417242
.
.
.
10.让我们进入比较核心那个CALL去看看:
.
.
.
0137:00416B60 PUSH EBP
0137:00416B61 MOV EBP,ESP
0137:00416B63 SUB ESP,0C
0137:00416B66 MOV DWORD PTR [EBP-0C],12345678
;设为t1
0137:00416B6D MOV DWORD PTR [EBP-08],23456789
;设为t2
0137:00416B74 MOV DWORD PTR [EBP-04],34567890
;设为t3
0137:00416B7B LEA EAX,[EBP-0C]
0137:00416B7E PUSH EAX
0137:00416B7F MOV ECX,[EBP+08]
0137:00416B82 PUSH ECX
0137:00416B83 CALL [KERNEL32!lstrlen]
0137:00416B89 PUSH EAX
0137:00416B8A MOV EDX,[EBP+08]
0137:00416B8D PUSH EDX
0137:00416B8E CALL 00418C70
;对name进行运算
0137:00416B93 ADD ESP,0C
0137:00416B96 LEA EAX,[EBP-0C]
0137:00416B99 PUSH EAX
0137:00416B9A PUSH 0C
0137:00416B9C MOV ECX,[EBP+0C]
0137:00416B9F PUSH ECX
0137:00416BA0 CALL 00418C70
;对number进行运算
0137:00416BA5 ADD ESP,0C
0137:00416BA8 MOV EDX,[EBP+0C]
0137:00416BAB MOV EAX,[EBP-04]
;EAX=t3'
0137:00416BAE CMP EAX,[EDX+0C]
;比较点
0137:00416BB1 JNZ 00416BBA
0137:00416BB3 MOV EAX,00000001
;EAX与[EDX+0C]相等,则置EAX为1
0137:00416BB8 JMP 00416BBC
0137:00416BBA XOR EAX,EAX
;不相等,则置EAX为0
0137:00416BBC MOV ESP,EBP
0137:00416BBE POP EBP
0137:00416BBF RET
.
要想简单的破解成为注册版,修改上面两处的任一处均可。
但当我看到name和number运算的都是同一个Call,而且对number运算的初值还是对name运算的结果。这样的注册机我还没有写过呢!而且和我前次破的Crackme2的算法相似(name和number分别运算后比较)。Crackme2我都写了注册机,这个怎能放过?还是进去看看吧!
11.随便选了个Call进去看看他的运算过程吧
.
.
.
0137:00418CB7 MOV EAX,[EDI]
;t1
0137:00418CB9 MOV [EBP-10],EAX
0137:00418CBC MOV ECX,[EDI+04]
;t2
0137:00418CBF MOV [EBP-0C],ECX
0137:00418CC2 MOV EDX,[EDI+08]
;t3
0137:00418CC5 MOV [EBP-08],EDX
0137:00418CC8 PUSHAD
0137:00418CC9 CLD
0137:00418CCA MOV ECX,[EBP+0C]
0137:00418CCD LEA EDI,[EBP-0010]
0137:00418CD3 MOV ESI,[EBP+08]
0137:00418CD6 LODSB
0137:00418CD7 CALL 00418F10
;进去看吧
0137:00418CDC LOOP 00418CD6
0137:00418CDE POPAD
0137:00418CDF MOV EAX,[EBP+10]
0137:00418CE2 MOV ECX,[EBP-10]
0137:00418CE5 MOV EDX,[EBP-0C]
0137:00418CE8 MOV [EAX],ECX
0137:00418CEA MOV ECX,[EBP-08]
0137:00418CED MOV [EAX+04],EDX
0137:00418CF0 MOV [EAX+08],ECX
0137:00418CF3 MOV EAX,[EBP-04]
0137:00418CF6 POP EDI
0137:00418CF7 POP ESI
0137:00418CF8 POP EBX
0137:00418CF9 MOV ESP,EBP
0137:00418CFB POP EBP
.
.
12.进入00418CD7 CALL 00418F10
.
.
.
0137:00418F10 MOV EBX,[EDI]
;[EDI]=t1
0137:00418F12 CALL 00418EE0
0137:00418F17 MOV [EDI],EAX
0137:00418F19 AND EAX,000000FF
0137:00418F1E ADD EAX,[EDI+04]
;[EDI+04]=t2
0137:00418F21 MOV [EDI+04],EAX
0137:00418F24 MOV EDX,08088405
0137:00418F29 MUL EDX
0137:00418F2B INC EAX
0137:00418F2C MOV [EDI+04],EAX
0137:00418F2F SHR EAX,18
0137:00418F32 MOV EBX,[EDI+08]
;[EDI+08]=t3
0137:00418F35 CALL 00418EE0
0137:00418F3A MOV [EDI+08],EAX
0137:00418F3D RET
.
进入CALL 00418EE0
0137:00418EE0 MOV EDX,EBX
0137:00418EE2 SHR EDX,08
0137:00418EE5 XOR BL,AL
0137:00418EE7 AND EBX,000000FF
0137:00418EED MOV EAX,[EBX*4+0042C818]
;先得抓出这部分的数据,天啦!好多哟。
0137:00418EF4 XOR EAX,EDX
0137:00418EF6 RET
至此,程序已全部在此,算法也一目了然。
但是,这有一个问题。那就是运算过程中舍去了一些值,且最后的t1,t2,t3三个值,只有t3拿出来比较(比较点处EAX值就是t3)。但我看到与t3比较的[EDX+0C]始终为0(其实我在这犯了个错误),好吧,那我就用穷举法算几个结果来分析看看吧。
先得处理抓出的数据。(只有编程处理啦,什么?可不可以手工处理。#@$%^&~~~晕!只有交给你来哟)
.
.
.
.
.
.
哎,终于编完了。
跑一跑,看看怎么样?天呀!怎么这么慢呀。(没办法啦,要处理256*256*256*256*8次啦,其中还有32位的乘法运算,查表运算........)
......ZZZzzz......zzzZZZ......
几个小时之后,终于完了。什么?没有结果......(对不起了,编程有个小错误,晕~~~~~~~~~~~倒)
妈的,我改,改了再跑。
......zzzZZZ......zzzZZZ......
又是几个小时。什么?还是没有结果。(晕~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~)
再次分析了一下程序和数据,终于发现t3无论怎么样也不可能为0。但与t3比较的[EDX+0C]怎么会为0呢?于是我监视了[EDX+0C]所在的内存区域,发现这个区域只有在程序开始时才从注册表中读入数据。但是在没有注册成功前注册表中并不能提供任何可用数据,且在注册成功后这些数据才会添加进注册表中。
于是,我得出结论:该软件不能被正常注册,除非Crack或直接改写(添加)注册表信息!(有没有搞错!居然有这种事情)
于是,我试着在比较点处改写[EDX+0C]为EAX中的值,注册成功。重启ShowDep,已是注册版,Register to: hg
再看注册表中的值,新添了"RegName","RegNumber"。
如下:
[HKEY_CURRENT_USER\Software\Sergey Sorokin\ShowDep\2.00]
"RegName"="hg"
"RegNumber"=hex:78,78,78,78,00,00,00,00,00,00,00,00,3e,f2,2d,6a
RegNumber中存放的就是输入的数字(变型后的,超过八位只取最后八位),t3的值,还为t1,t2预留了空间呢。
初次写文章,如有不足之处,见谅!
如有错误或任何意见,请E-mail到hghanguang@163.com
- 标 题:看看吧! (7千字)
- 作 者:软档[hg]
- 时 间:2001-10-20 11:44:39
- 链 接:http://bbs.pediy.com