• 标 题:FlasherShop3.0
  • 作 者:鸡鸡
  • 时 间:2003/05/14 06:43pm
  • 链 接:http://bbs.pediy.com

今天GF要我帮她做个好看的FLASH,可我只会破解,哪会做什么FLASH啊!晕哦...
这不,再中国共享软件注册中心发现了这个自夸一分钟就能做成自己所想的FLASH!
把它下回家,弄了一个上午都没有作出一个像样子的FLASH 呵呵
反正闲着也是闲着,就把它破了吧...


【下载页面】: http://www.softreg.com.cn/shareware_view.asp?id=/A4863E72-DAC2-4DED-A604-EB5B5D9D8A22/

【软件大小】:1.68M

【应用平台】:WIN9X/WINNT/WIN2K/WINXP

【软件简介】: 每个人都可以轻松制作出Flash动画!你可以1分钟内就制作出专业动画效果的Flash制作软件。

【软件限制】:未注册版本在运行的开始的时候会有一个提醒注册的窗口弹出来!!还有就是不知道了!!!

【作者声明】:本人发表这篇文章只是希望交流一下!读者看了文章后所做的事情与我无关,我也不会负责,最后希望大家经济基础好的话,请支持共享软件!

【破解工具】:TRW2000   w32Dasm   Hiew   PEiD   KEYMAKE

—————————————————————————————————
【过    程】:
运行软件,没有注册成功和注册失败的提示!

用PEiD查主程序FlasherShop.exe发现未加壳,是用Borland Delphi编写的!

本来想用DEDE反汇编的,可惜我不会用!那么就用w32Dasm反汇编吧!

w32Dasm反汇编后发现软件的注册信息保存在注册表里面!
如下:
[HKEY_CURRENT_USER\Software\Flash2Me\FlasherShop\Common]
name         \\用户名
code         \\注册码

除了这个外就没发现什么提示了!(可能是我太菜,所以没有发现什么!)

那么只好用TRW2000动态跟踪了!

运行FlasherShop.exe-->选择帮助-->软件注册-->填好用户名Yock和假的注册码78787878

运行TRW2000-->ctrl+n呼出TRW2000-->下断点bpx hmemcpy-->F5返回-->按OK-->拦下bc清楚断点-->pmodule返回程序(TRW2K就是这个好!)按了N次F10后来到下面:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F1398(C)
|
:004F1407 8945FC                  mov dword ptr [ebp-04], eax
:004F140A 33C0                    xor eax, eax
:004F140C 55                      push ebp
:004F140D 68FC144F00              push 004F14FC
:004F1412 64FF30                  push dword ptr fs:[eax]
:004F1415 648920                  mov dword ptr fs:[eax], esp
:004F1418 B201                    mov dl, 01
:004F141A A180784C00              mov eax, dword ptr [004C7880]
:004F141F E82825F1FF              call 0040394C
:004F1424 8BD8                    mov ebx, eax
:004F1426 A1A0964F00              mov eax, dword ptr [004F96A0]
:004F142B 895824                  mov dword ptr [eax+24], ebx
:004F142E 33C0                    xor eax, eax
:004F1430 55                      push ebp
:004F1431 68D2144F00              push 004F14D2
:004F1436 64FF30                  push dword ptr fs:[eax]
:004F1439 648920                  mov dword ptr fs:[eax], esp
:004F143C 8D55F8                  lea edx, dword ptr [ebp-08]\\看不懂!
:004F143F 8B45FC                  mov eax, dword ptr [ebp-04]\\看不懂!
:004F1442 8B80FC020000            mov eax, dword ptr [eax+000002FC]\\看不懂!
:004F1448 E8BF30F7FF              call 0046450C              \\应该是得到用户名的位数放在EAX!
:004F144D 8B45F8                  mov eax, dword ptr [ebp-08]\\这里是我输入的用户名!
:004F1450 50                      push eax                   \\用户名压栈!
:004F1451 8D55F4                  lea edx, dword ptr [ebp-0C]\\看不懂!
:004F1454 8B45FC                  mov eax, dword ptr [ebp-04]\\看不懂!
:004F1457 8B80F8020000            mov eax, dword ptr [eax+000002F8]\\看不懂!
:004F145D E8AA30F7FF              call 0046450C              \\应该是得到假注册码的位数放在EAX!
:004F1462 8B55F4                  mov edx, dword ptr [ebp-0C]\\这里是我输入的注册码!
:004F1465 A1A0964F00              mov eax, dword ptr [004F96A0]\\作者有病!!!好多余的东西!
:004F146A 8BC3                    mov eax, ebx                 \\这里应该是运算有关的东西!
:004F146C 59                      pop ecx                      \\这里是我输入的注册码!
:004F146D E89E67FDFF              call 004C7C10             \\这个CALL就是假的注册码运算后比较是否正确
                                                           \\我根进去后发现自己能力有限,就放弃了!
:004F1472 3C01                    cmp al, 01                \\是否正确注册码的比较!
:004F1474 7537                    jne 004F14AD              \\跳下去就死掉了!不跳的话就会把用户名和假的注册码保存在注册表里!爆破点!
                                                           \\把这里的机器码7537改成9090
:004F1476 8D55F0                  lea edx, dword ptr [ebp-10]
:004F1479 8B45FC                  mov eax, dword ptr [ebp-04]
:004F147C 8B80FC020000            mov eax, dword ptr [eax+000002FC]
:004F1482 E88530F7FF              call 0046450C
:004F1487 8B45F0                  mov eax, dword ptr [ebp-10]
:004F148A 50                      push eax
:004F148B 8D55EC                  lea edx, dword ptr [ebp-14]
:004F148E 8B45FC                  mov eax, dword ptr [ebp-04]
:004F1491 8B80F8020000            mov eax, dword ptr [eax+000002F8]
:004F1497 E87030F7FF              call 0046450C
:004F149C 8B55EC                  mov edx, dword ptr [ebp-14]
:004F149F A1A0964F00              mov eax, dword ptr [004F96A0]
:004F14A4 8B4024                  mov eax, dword ptr [eax+24]
:004F14A7 59                      pop ecx
:004F14A8 E86B65FDFF              call 004C7A18

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F1474(C)
|
:004F14AD 33C0                    xor eax, eax
:004F14AF 5A                      pop edx
:004F14B0 59                      pop ecx
:004F14B1 59                      pop ecx
:004F14B2 648910                  mov dword ptr fs:[eax], edx
:004F14B5 68D9144F00              push 004F14D9

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F14D7(U)
|
:004F14BA A1A0964F00              mov eax, dword ptr [004F96A0]
:004F14BF 8B4024                  mov eax, dword ptr [eax+24]
:004F14C2 E8B524F1FF              call 0040397C
:004F14C7 A1A0964F00              mov eax, dword ptr [004F96A0]
:004F14CC 33D2                    xor edx, edx
:004F14CE 895024                  mov dword ptr [eax+24], edx
:004F14D1 C3                      ret

---------------------------------------------------------------------------------
由于这个程序的注册码运算非常的复杂,不是我这种菜鸟看的懂的!

所以就把程序爆破了吧!

根据w32Dasm反汇编后发现软件的注册信息保存在注册表里面!
如下:
[HKEY_CURRENT_USER\Software\Flash2Me\FlasherShop\Common]
name         \\用户名
code         \\注册码

那么双击参考字串发现两个地方!一个地方是004C7A4E 另一个地方是004C7B32
------------------------------------------------------------------
那么我们重新来过!(在这之前要确定注册表的name用户名和code注册码不为空!)

ctrl+n呼出TRW2K-->bc清除所有断点-->再下断点bpx 004C7A4E和bpx 004C7B32

重新运行FlasherShop.exe拦下在004C7B32这里:

* Possible StringData Ref from Code Obj ->"Software\Flash2Me\FlasherShop\Common"
                                 |
:004C7B32 BAC87B4C00              mov edx, 004C7BC8
:004C7B37 8B45FC                  mov eax, dword ptr [ebp-04]
:004C7B3A E8B168F7FF              call 0043E3F0                \\这个CALL是验证是否有这个地方的!
:004C7B3F 84C0                    test al, al
:004C7B41 7436                    je 004C7B79                  \\有的话就不跳,没有就跳下去弹出提示注册框!
:004C7B43 8D4DF8                  lea ecx, dword ptr [ebp-08]

* Possible StringData Ref from Code Obj ->"name"
                                 |
:004C7B46 BAF87B4C00              mov edx, 004C7BF8
:004C7B4B 8B45FC                  mov eax, dword ptr [ebp-04]
:004C7B4E E8656AF7FF              call 0043E5B8                 \\这里是取得输入的用户名的!
:004C7B53 8B55F8                  mov edx, dword ptr [ebp-08]
:004C7B56 8D4304                  lea eax, dword ptr [ebx+04]
:004C7B59 E8E2CCF3FF              call 00404840                 \\是否有用户名,有的话在内存的某个地方做一个标志!(可惜我不知道在那里)
:004C7B5E 8D4DF4                  lea ecx, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->"code"
                                 |
:004C7B61 BA087C4C00              mov edx, 004C7C08
:004C7B66 8B45FC                  mov eax, dword ptr [ebp-04]
:004C7B69 E84A6AF7FF              call 0043E5B8                 \\这里是取得输入的注册码!
:004C7B6E 8B55F4                  mov edx, dword ptr [ebp-0C]
:004C7B71 8D4308                  lea eax, dword ptr [ebx+08]
:004C7B74 E8C7CCF3FF              call 00404840                 \\是否有注册码,有的话在内存的某个地方做一个标志!(可惜我不知道在那里)

----------------------------------------------------------------------
在按了数次F10后发现程序下这里跳过去的话就不会弹出提示框出来了!(但前提是有输入用户名和注册码!)

:004C7CE5 E83ED0F3FF              call 00404D28
:004C7CEA 8B55F0                  mov edx, dword ptr [ebp-10]
:004C7CED 58                      pop eax
:004C7CEE E821CFF3FF              call 00404C14
:004C7CF3 7504                    jne 004C7CF9                \\这里要是不跳的话就不会出现提醒注册的对话框了!
                                                             \\而且程序在运行的时候会两次经过这个地址!
                                                             \\第一次不跳是弹出提醒注册的对话框的!
                                                             \\第二次不跳是显示(评估版本)的字样的!
                                                             \\那么我们把这里的机器码7504改成9090就可以了!
:004C7CF5 B301                    mov bl, 01
:004C7CF7 EB0A                    jmp 004C7D03

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C7CF3(C)
|
:004C7CF9 85DB                    test ebx, ebx
:004C7CFB 7404                    je 004C7D01
:004C7CFD B301                    mov bl, 01
:004C7CFF EB02                    jmp 004C7D03

-------------------------------------------------------------------------------------
总结:
我们只要把下面两个地址:
:004F1474 7537                    jne 004F14AD

:004C7CF3 7504                    jne 004C7CF9

改成:
:004F1474 90                      NOP
:004F1475 90                      NOP

:004C7CF3 90                      NOP
:004C7CF4 90                      NOP

就可以了!

那么现在只需要运行程序,填入注册码后按OK!再把程序关了重新启动就变成以注册版本了!呵呵!

有人问:
直接改:
004C7CF3 7504                    jne 004C7CF9
就可以了!为什么还要改:
004F1474 7537                    jne 004F14AD
很多余啊!

我回答:
不改:
004F1474 7537                    jne 004F14AD
的话!别人怎么填注册信息到注册表啊?如果注册表[HKEY_CURRENT_USER\Software\Flash2Me\FlasherShop\Common]
用户名name项和注册码code项是空的话!程序是不能变成注册版本的!
不是每个人都会自己动手填注册表的!
所以为了比我更加菜的菜鸟!这样改是最好的了(飞来N块砖头...)!嘿嘿...


                                           2003.05.14下午于清远