题目:寻找WebZip4.1.0注册码之菜鸟教程
难度:易
文件大小:984KB
适用平台:Win9x/Me/NT/2000
软件简介:WebZIP把一个网站下载并压缩到一个单独的ZIP文件中,可以帮您将某个站台全部或部份之资料以ZIP格式压缩起来,可供你日后快速浏览这个网站。新版能排定时间来下载,具有当漂亮的立体界面及传输的曲线图。此软件30天试用期。
工具:TRW(有些大侠不喜欢这个,我喜欢),FI
引子:给菜鸟写破文的热情一直有增无减,今天就看到我的电脑报2001光盘上这个软件,有3.8版和4.1版的。(读者可能要问:怎么老是电脑报电脑报的?而且都是多年前的东西了!没错!跟您解释一下,我现在在埃塞援教呢,我只有带来我以前的光盘,这里没有宽带,上网不方便,无法从网上找到软件下载,只有拿这些老古董练手了。对菜鸟练手刚好合适!不要嫌弃我破解的软件版本太老哟!*_^)我大体瞄了一眼精华III的几篇文章,但没有按照他们的文章去练习,原因是过于简略了,操作性不强。因为相同的软件在不同电脑上的虚拟地址可能不同,那些大侠只是给出在他机器上的某条指令地址,可是在其他机器上不见得就是一样的。所以,我想根据我自己的实践经验写了这篇破文,错误在所难免,希望指正!书归正传!!
拿FI检查一下到底带“甲克”没有,果然带有甲克,是Aspack2.11c,尝试用ASPACK DIE去壳,提示你已经成功保存,名字Unpacked.exe,改为其他名字也可以。我用FI再次查看已经没有壳了,显示用DELPHI开发的。不过我们这里只是通过TRW找到其注册码,所以没有必要脱壳的。当然如果爆破除外,因为爆破需要修改某些地方,只有去壳才可以修改。
启动WebZip4.1.0,出现NAG,点击Register,弹出对话框,输入用户名bigpig,系列号123456,注册码78787878,Ctrl+N唤出TRW,下bpx hmemcpy,F5返回WebZip,单击OK按钮,被TRW拦住。下pmodule回到主程序领空,bc*取消所有断点,还需要按F10多次,一直到你在后面程序看不到RET指令为止。
1.先用F10粗跟踪,直到出现错误提示窗口。
CODE:00530410 call loc_437820
CODE:00530415 mov eax, [ebp-0Ch] //来到此处
CODE:00530418 lea edx, [ebp-8]
CODE:0053041B call loc_409654
CODE:00530420 mov edx, [ebp-8]
CODE:00530423 mov eax, [ebx+344h]
CODE:00530429 call loc_4D5E9C
CODE:0053042E lea edx, [ebp-14h]
CODE:00530431 mov eax, [ebp-4]
CODE:00530434 mov eax, [eax+2ECh]
CODE:0053043A call loc_437820
CODE:0053043F mov eax, [ebp-14h]
CODE:00530442 lea edx, [ebp-10h]
CODE:00530445 call loc_409654
CODE:0053044A mov edx, [ebp-10h]
CODE:0053044D mov eax, [ebx+344h]
CODE:00530453 call loc_4D57F8 //此处出现错误窗口,需要F8跟入
CODE:00530458 lea edx, [ebp-1Ch]
CODE:0053045B mov eax, [ebp-4]
CODE:0053045E mov eax, [eax+2F4h]
CODE:00530464 call loc_437820
========================================
2.细跟踪
在530453 处下断点,bpx 530453 ,重新填写注册信息,然后按OK 被拦住,此刻我们从530453 这里细跟踪。F8跟入:
CODE:004D57F8 push ebp
CODE:004D57F9 mov ebp, esp
CODE:004D57FB add esp, 0FFFFFFF8h
CODE:004D57FE push ebx
CODE:004D57FF xor ecx, ecx
CODE:004D5801 mov [ebp+var_8], ecx
CODE:004D5804 mov [ebp+var_4], edx
CODE:004D5807 mov ebx, eax
CODE:004D5809 mov eax, [ebp+var_4]
CODE:004D580C call sub_404298
CODE:004D5811 xor eax, eax
CODE:004D5813 push ebp
CODE:004D5814 push offset loc_4D58B3
CODE:004D5819 push dword ptr fs:[eax]
CODE:004D581C mov fs:[eax], esp
CODE:004D581F cmp byte ptr [ebx+74h], 0
CODE:004D5823 jnz short loc_4D5898 //此处不跳
CODE:004D5825 cmp byte ptr [ebx+2Ch], 0
CODE:004D5829 jz short loc_4D5898 //此处不跳
CODE:004D582B lea edx, [ebp+var_8]
CODE:004D582E mov eax, [ebp+var_4]
CODE:004D5831 call sub_4093F0 //此CALL复制注册码
CODE:004D5836 mov edx, [ebp+var_8]
CODE:004D5839 mov eax, ebx
CODE:004D583B call sub_4D59D8 //此处为关键地方,F8跟入
CODE:004D5840 sub eax, 0C8h //如果上面这个CALL返回C8H则走向光明
CODE:004D5845 jz short loc_4D584F //此处跳往天堂
CODE:004D5847 dec eax
CODE:004D5848 jz short loc_4D5872 //如果返回为C9H,走向地狱
CODE:004D584A dec eax
CODE:004D584B jz short loc_4D587F //如果返回为CAH,走向地狱
CODE:004D584D jmp short loc_4D5891
CODE:004D584F
CODE:004D584F loc_4D584F: ; CODE XREF: sub_4D57F8+4Dj
CODE:004D584F lea eax, [ebx+38h]
CODE:004D5852 mov edx, [ebp+var_4]
CODE:004D5855 call sub_403EB8
CODE:004D585A mov byte ptr [ebx+74h], 1
CODE:004D585E mov eax, ebx
CODE:004D5860 call sub_4D5F84
CODE:004D5865 mov eax, ebx
CODE:004D5867 call sub_4D6E2C
CODE:004D586C mov byte ptr [ebx+58h], 3
CODE:004D5870 jmp short loc_4D5891
CODE:004D5872
CODE:004D5872 loc_4D5872: ; CODE XREF: sub_4D57F8+50j
CODE:004D5872 mov byte ptr [ebx+74h], 0
CODE:004D5876 mov eax, ebx
CODE:004D5878 call sub_4D6D78 // 此处出现错误提示窗口
CODE:004D587D jmp short loc_4D5891
========================================
3.深入关键地方寻宝去也. 在4D583B 设置断点,bpx 4D583B ,F5退出,然后重新填写注册信息,点击OK,被拦住,F8跟入。如下:
CODE:004D59D8 push ebp
CODE:004D59D9 mov ebp, esp
CODE:004D59DB add esp, 0FFFFFFF0h
CODE:004D59DE push ebx
CODE:004D59DF push esi
CODE:004D59E0 push edi
CODE:004D59E1 xor ecx, ecx
CODE:004D59E3 mov [ebp+var_8], ecx
CODE:004D59E6 mov [ebp+var_4], ecx
CODE:004D59E9 mov edi, edx
CODE:004D59EB mov ebx, eax
CODE:004D59ED xor eax, eax
CODE:004D59EF push ebp
CODE:004D59F0 push offset loc_4D5B1D
CODE:004D59F5 push dword ptr fs:[eax]
CODE:004D59F8 mov fs:[eax], esp
CODE:004D59FB lea eax, [ebp+var_4]
CODE:004D59FE push eax
CODE:004D59FF mov eax, edi
CODE:004D5A01 call @System@_16823 ; System::_16823
CODE:004D5A06 mov edx, eax
CODE:004D5A08 dec edx
CODE:004D5A09 mov ecx, 2
CODE:004D5A0E mov eax, edi
CODE:004D5A10 call @System@@LStrCopy$qqrv
CODE:004D5A15 mov eax, [ebp+var_4]
CODE:004D5A18 mov edx, offset unk_4D5B38
CODE:004D5A1D call @System@@LStrCmp$qqrv //比较最后2位是否是1Y,如果是则无效。
CODE:004D5A22 jnz short loc_4D5A2B //此处跳转。
CODE:004D5A24 mov esi, 16Dh
CODE:004D5A29 jmp short loc_4D5A66
CODE:004D5A2B
CODE:004D5A2B loc_4D5A2B:
CODE:004D5A2B xor eax, eax
CODE:004D5A2D push ebp
CODE:004D5A2E push offset loc_4D5A4D
CODE:004D5A33 push dword ptr fs:[eax]
CODE:004D5A36 mov fs:[eax], esp
CODE:004D5A39 mov eax, [ebp+var_4]
CODE:004D5A3C call @Sysutils@StrToInt$qqrx17System@AnsiString// 把注册码最后两位转换后保存在ESI
CODE:004D5A41 mov esi, eax //最后两位必须为0,如果不是则错。
CODE:004D5A43 xor eax, eax
CODE:004D5A45 pop edx
CODE:004D5A46 pop ecx
CODE:004D5A47 pop ecx
CODE:004D5A48 mov fs:[eax], edx
CODE:004D5A4B jmp short loc_4D5A66
CODE:004D5A4D jmp @System@@HandleAnyException$qqrv ;
CODE:004D5A52 mov ebx, 0C9h
CODE:004D5A57 call @@DoneExcept$qqrv
CODE:004D5A5C jmp loc_4D5B02
CODE:004D5A61 call @@DoneExcept$qqrv
CODE:004D5A66 test esi, esi //测试ESI是否为0
CODE:004D5A68 jnz short loc_4D5A95 //如果不是则出错,后面程序总是返回0C9H。
CODE:004D5A6A lea eax, [ebp+var_4]
CODE:004D5A6D push eax
CODE:004D5A6E mov edx, [ebx+6Ch]
CODE:004D5A71 mov eax, [ebx+34h]
CODE:004D5A74 mov ecx, esi
CODE:004D5A76 call sub_4D36CC
CODE:004D5A7B mov eax, [ebp+var_4]
CODE:004D5A7E mov edx, edi
CODE:004D5A80 call @System@@LStrCmp$qqrv ; //在这里d eax 看到真注册码,d edi看到假码。此CALL就是关键,为了看清如何比较,我也把这个CALL代码放在下面了。不过没有多大意义 了。:)
CODE:004D5A85 jnz short loc_4D5A8E
CODE:004D5A87 mov ebx, 0C8h //如果注册码正确,则EBX=C8H
CODE:004D5A8C jmp short loc_4D5B02
*
*略掉10多行
*
CODE:004D5AB0 jnz short loc_4D5AFD
CODE:004D5AB2 inc dword ptr [ebx+44h]
CODE:004D5AB5 lea edx, [ebp+var_8]
CODE:004D5AB8 mov eax, ebx
CODE:004D5ABA call sub_4D6A94
CODE:004D5ABF mov edx, [ebp+var_8]
CODE:004D5AC2 lea eax, [ebx+34h]
========================================
4.在4D5A80设断点,F8跟入:
CODE:004041F4 push ebx
CODE:004041F5 push esi
CODE:004041F6 push edi
CODE:004041F7 mov esi, eax
CODE:004041F9 mov edi, edx
CODE:004041FB cmp eax, edx
CODE:004041FD jz loc_404292
CODE:00404203 test esi, esi
CODE:00404205 jz short loc_40426F
CODE:00404207 test edi, edi
CODE:00404209 jz short loc_404276
CODE:0040420B mov eax, [esi-4]
CODE:0040420E mov edx, [edi-4]
CODE:00404211 sub eax, edx //计算真假注册码的长度之差
CODE:00404213 ja short loc_404217
CODE:00404215 add edx, eax
CODE:00404217 push edx
CODE:00404218 shr edx, 2
CODE:0040421B jz short loc_404243
CODE:0040421D mov ecx, [esi]
CODE:0040421F mov ebx, [edi]
CODE:00404221 cmp ecx, ebx //此处d esi看到真注册码,d edi看到你的假注册码!
CODE:00404223 jnz short loc_40427D
CODE:00404225 dec edx
CODE:00404226 jz short loc_40423D
CODE:00404228 mov ecx, [esi+4]
CODE:0040422B mov ebx, [edi+4] //比较真假注册码
CODE:0040422E cmp ecx, ebx
CODE:00404230 jnz short loc_40427D
CODE:00404232 add esi, 8
CODE:00404235 add edi, 8
CODE:00404238 dec edx
CODE:00404239 jnz short loc_40421D //没有结束,返回上面,继续比较。
CODE:0040423B jmp short loc_404243
CODE:0040423D add esi, 4
CODE:00404240 add edi, 4
CODE:00404243 pop edx
CODE:00404244 and edx, 3
CODE:00404247 jz short loc_40426B //此处自动跳走,不要修改Z标志。
CODE:00404249 mov ecx, [esi]
CODE:0040424B mov ebx, [edi]
CODE:0040424D cmp cl, bl
CODE:0040424F jnz short loc_404292
CODE:00404251 dec edx
CODE:00404252 jz short loc_40426B
CODE:00404254 cmp ch, bh
CODE:00404256 jnz short loc_404292
CODE:00404258 dec edx
CODE:00404259 jz short loc_40426B
*
*略掉10多行
*
CODE:0040428C cmp cl, bl
CODE:0040428E jnz short loc_404292
CODE:00404290 cmp ch, bh
CODE:00404292 pop edi
CODE:00404293 pop esi
CODE:00404294 pop ebx
CODE:00404295 retn
========================================
后记:
1.本来我已经正确找到了3.8版的注册码了,我又安装了这个新版4.1实验一下找注册码,结果发现这个4.1版用ASPACK2.11C加壳了,我用ASPACK DIE脱壳成功,可是无法用W32DASM打开查看,因为打开后只有前面的文件头部分,没有代码部分.我用IDA打开可以看到代码.
2.在输入注册码的时候,必须使最后2位是0 ,我就是因为忽视了这个问题,最后实验了好多次总是返回CA,感到纳闷,后来发现一个CALL就是验证这个最后2个位的.
3.如果想让原来注册码作废,可以重新输入用户名,其他的系列号和注册码即可使原先正确的注册码作废.便于继续深入调试.
4. 注册信息如下:
User Name: bigpig
Srial Number: 123456
Register Number: 2E1F0C4F1B00 (注册码好象与系列号和用户名无关?)
5. 同样的程序可能在不同机器上的地址是不同的,菜鸟在学习的时候不要用文章中显示的地址去和你电脑上出现的实际地址比较,您应该关注代码是否相同才行.在不同电脑上,同样的代码可能地址不同.
耽误您的时间阅读,非常感谢!讨论技术问题EAMILTO:
qduwg@163.com
2005/12/30