win2000下手动破解Elib2.01 算法分析 上

时间:2005-12-20 来源: 作者: 点击:
win2000下手动破解Elib2.01。 1.此破解教程仅供学习,不得用于商业用途。 2.破解工具:SoftICE4.05(98下)、UPX、W32DSM89、HIEW6.81。 3.原版文件下载(当前最新版本2.01):http://newhua.infosail.com/down/elib_cn.exe 4.使用的汇编指令: 机器码 指令格式 测试条件 跳转
  win2000下手动破解Elib2.01。
1.此破解教程仅供学习,不得用于商业用途。
2.破解工具:SoftICE4.05(98下)、UPX、W32DSM89、HIEW6.81。
3.原版文件下载(当前最新版本2.01):http://newhua.infosail.com/down/elib_cn.exe
4.使用的汇编指令:
机器码        指令格式    测试条件    跳转含义
0F 84 cw/cd     JE rel16/32     ZF=1        等于
0F 85 cw/cd     JNE rel16/32     ZF=0        不等于
74        JZ/JE      Z=1         零/等于
75        JNZ/JNE      Z=0         不为零/不等于 
E9   cw/cd     JMP rel16/32      无条件
90              NOP           

注:rel16/32  表示 16或32 位相对地址
ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0.


软件简介:
    作为网页收藏、保存和编辑的工具,Elib会给您带来极大的方便,并帮助您逐步建立自己的知识库。
编译工具:Borland C++
加壳:      UPX1.2W
技术:      该软件使用OLE或COM技术,采用控件,完成保存网页功能。其它如输出成CHM文件,则使用了微软的工具,不知是否可以如此捆绑?!

    3月26日在pediy论坛看到一篇ssljx的《算法分析》很受启发,TAE!提供的注册码又无法上网激活,可能已被封号,我在测试过程中使用新号激活时也发现有此现象。ssljx的算法分析很是独道,可惜我功力尚浅,无法做出注册机来,所以就转换思路,使用了另一种方法,直接修改原文件,也就是俗称的“爆破”。

    由于我在win2000下使用的SOFTICE4.05老是出问题,所以一般要调试的话,都会转到WIN98下进行。
启动加载Softice,进入win98,运行elib,点击菜单“帮助”->“激活并注册”,弹出“注册”对话框。输入注册码,格式为ELIBA-11111-22222-33333-44444。数字可随便填写。
Ctrl+D进入Softice
下bpx hmemcpy,
按F5回到Elib,
点击“下一步”按钮,被抓,
下bd 0或(bd *),
按F12,13次后弹出“注册码错误”对话框,
点“确定”,返回Softice,
下BE 0(或be *)
按F5回到Elib,
点击“下一步”按钮,被抓,
按F12,12次停在
0167:004304de CMP DWORD PTR[EBP-08],00
按F10,数次来到
0167:0043073e CALL 0045BDC4 (运行到此处会弹出“注册码错误”对话框),记下位置0043073e,W32ASM会用到。
之后就可不用SOFTICE了。可直接进入WIN2000手动开始破解。不过为了方便,我们先破解程序的一处看看效果如何。
使用SOFTICE调试时,发现elib的“天空”在UPX下,试一试用UPX能不能脱壳。还好手上有UPX1.20w。
备份elib.exe,
下upx -d elib.exe,
脱壳成功,解开的文件有2.82MB。
运行W32Asm8.93打开此文件,下Shitf+F12,在位移处输入上面记下的地址0043073e。
停在
* Reference To: eLib.TGlobal::InfoBox(())//这就是我们见到的“注册码错误“对话框了。
                                  |
:0043073E E881B60200              call 0045BDC4

往上走,会看到什么。到这里。
* Reference To: eLib.TGlobal::IsValidSerialNo(System::AnsiString)//是不是意外的惊喜,看名字是什么,检测注册码是否正确?找到这里,整个检测注册码的核心被找到。
                                  |
:004305AF E848540300              call 004659FC        //关键,记下004659FC这个值。
:004305B4 33C9                    xor ecx, ecx
:004305B6 83C408                  add esp, 00000008
:004305B9 8AC8                    mov cl, al
:004305BB BA02000000              mov edx, 00000002
:004305C0 83F901                  cmp ecx, 00000001
:004305C3 1BC0                    sbb eax, eax
:004305C5 F7D8                    neg eax
:004305C7 50                      push eax        //注册码正确,此处值为0,值存入堆栈
:004305C8 8D45E8                  lea eax, dword ptr [ebp-18]
:004305CB FF4DC4                  dec [ebp-3C]
:004305CE E89DF90E00              call 0051FF70
:004305D3 59                      pop ecx        //堆栈eax的值弹给ecx
:004305D4 84C9                    test cl, cl        //判断注册码是否正确,正确为0
:004305D6 0F8484000000            je 00430660        //注册码正确就跳。此处修改为jmp 00430660
//记下此处的文件位移,可在W32asm的状态栏获得为@offset 0002fbd6h,hiew会用到它。
:004305DC 66C745B84400            mov [ebp-48], 0044
:004305E2 33C0                    xor eax, eax
:004305E4 8D55DC                  lea edx, dword ptr [ebp-24]
:004305E7 8945DC                  mov dword ptr [ebp-24], eax
:004305EA 52                      push edx
:004305EB FF45C4                  inc [ebp-3C]

* Possible StringData Ref from Data Obj ->"Registration number is invalid!"
                                  |
:004305EE BA15785300              mov edx, 00537815
:004305F3 8D45E0                  lea eax, dword ptr [ebp-20]
:004305F6 E865F70E00              call 0051FD60
:004305FB FF45C4                  inc [ebp-3C]
:004305FE 8D4DE0                  lea ecx, dword ptr [ebp-20]
:00430601 51                      push ecx

* Possible StringData Ref from Data Obj ->"strRegNumInvalid"
                                  |
:00430602 BA04785300              mov edx, 00537804
:00430607 8D45E4                  lea eax, dword ptr [ebp-1C]
:0043060A E851F70E00              call 0051FD60
:0043060F FF45C4                  inc [ebp-3C]
:00430612 8D55E4                  lea edx, dword ptr [ebp-1C]
:00430615 A16C3B5500              mov eax, dword ptr [00553B6C]
:0043061A 59                      pop ecx

    调用hiew6.81,选择elib.exe文件,
F4选Decode mode,
F5,输入先前记下的文件位移0002fbd6
F3,修改0F8484000000为90E984000000,
F9。
运行一下看看,在注册码中输入
ELIBA-11111-22222-33333-44444,点下一步,不会弹出“注册码错误“对话框了,并且进入一个新的对话框中。连网激活一下试试,成功了。(要注意,一个注册码不能多次激活,小心被封)。
我们还有许多工作要做,这只是elib判断注册码是否正确的一个地方,其它还有许多呢。以下会具体说明。
分析总结一下,很明显elib使用函数eLib.TGlobal::IsValidSerialNo(System::AnsiString)来判断注册码是否正确,注册码正确,则eax值为0,否则为1。之后会有跳转判断。修改为无条件跳转,应该会成功。有人说将此函数修改一下不就行了,我进入函数看了一下,较复杂,只有等待高手来做了。记下eLib.TGlobal::IsValidSerialNo(System::AnsiString)函数位置004659FC。
现在我们收拾东西进入win2000开始手动破解elib2.01,心情开始激动起来。

进入WIN2000,将日期向后调,如增加一年。首先运行elib上网激活一下,注意注册码可能已被封,多试几个数字即可。
运行W32ASM和HIEW,分别打开elib.exe文件。准备修改。
在W32ASM中下shitf+F12,在位移处填入004659FC(即IsValidSerialNo函数位置),会停在
Exported fn(): TGlobal::IsValidSerialNo(System::AnsiString) - Ord:027Fh
:004659FC 55                      push ebp

它的下面就是函数IsValidSerialNo(System::AnsiString)具体实现,较复杂,也难为作者了。
我们不管它,记下有什么地方调用它即可。往上看就知道了。有13处调用了它。我们开始一个一个攻破它。
* Referenced by a CALL at Addresses:
|:00406457  , :00406716  , :004069E5  , :00407C3B  , :00407EC8 
|:00408A68  , :0040BF7D  , :0040F779  , :004147D6  , :0042F8F9 
|:004305AF  , :00431FFF  , :00465BA5 
|
(1)00406457
在W32ASM中下SHIFT+F12,输入00406457
停在
* Reference To: eLib.TGlobal::IsValidSerialNo(System::AnsiString)
                                  |
:00406457 E8A0F50500              call 004659FC        //调用IsValidSerialNo
:0040645C 83C408                  add esp, 00000008    //判断
:0040645F 84C0                    test al, al          //
:00406461 0F84EB000000            je 00406552          //al值为0(即注册码正确)则跳
:00406467 E8E0A71100              call 00520C4C
可不要上当,这里要改的话,会弹出一个“你使用的软件为盗版”对话框。
此处可忽略。

(2)00406716
在W32ASM中下SHIFT+F12,输入00406716
停在
* Reference To: eLib.TGlobal::IsValidSerialNo(System::AnsiString)
                                  |
:00406716 E8E1F20500              call 004659FC        //调用IsValidSerialNo
:0040671B 83C408                  add esp, 00000008
:0040671E BA02000000              mov edx, 00000002
:00406723 50                      push eax
:00406724 8D45FC                  lea eax, dword ptr [ebp-04]
:00406727 FF4B1C                  dec [ebx+1C]
:0040672A E841981100              call 0051FF70
:0040672F 59                      pop ecx
:00406730 84C9                    test cl, cl        //
:00406732 0F84E3010000            je 0040691B          //此处改为jne 0040691B,记下位移@offset 5d32h
:00406738 66C743101400            mov [ebx+10], 0014
:0040673E 8B06                    mov eax, dword ptr [esi]
:00406740 50                      push eax
:00406741 33D2                    xor edx, edx
:00406743 8955F8                  mov dword ptr [ebp-08], edx
:00406746 8D4DF8                  lea ecx, dword ptr [ebp-08]
:00406749 51                      push ecx
:0040674A FF431C                  inc [ebx+1C]

在hiew6.81中修改0F84E3010000为0F85E3010000(方法可参考上述)。
效果:修改这里,会将菜单“激活并注册”变成灰色。将时间向后调一下,如增加一年,会出现
“过期”对话框。
------分隔线----------------------------
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
推荐内容