老文章档案 · 2003 年

win2000下手动破解Elib2.01

赢政天下 [WINZHENG.COM] · 网络学院 · 2003-06-09 · 作者:ircbox 人气: · 出处:嬴政天下整理收藏)

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(方法可参考上述)。

效果:修改这里,会将菜单“激活并注册”变成灰色。将时间向后调一下,如增加一年,会出现

“过期”对话框。

(3)004069E5

在W32ASM中下SHIFT+F12,输入004069E5

停在

* Reference To: eLib.TGlobal::IsValidSerialNo(System::AnsiString)

|

:004069E5 E812F00500 call 004659FC

:004069EA 83C408 add esp, 00000008

:004069ED BA02000000 mov edx, 00000002

:004069F2 50 push eax

:004069F3 8D45C0 lea eax, dword ptr [ebp-40]

:004069F6 FF4B1C dec [ebx+1C]

:004069F9 E872951100 call 0051FF70

:004069FE 59 pop ecx

:004069FF 84C9 test cl, cl

:00406A01 745B je 00406A5E //修改为jne 00406A5E,文件位移6001h

:00406A03 66C743106800 mov [ebx+10], 0068

:00406A09 BAE12E5200 mov edx, 00522EE1

:00406A0E 8D45BC lea eax, dword ptr [ebp-44]

:00406A11 E84A931100 call 0051FD60

:00406A16 FF431C inc [ebx+1C]

:00406A19 33C0 xor eax, eax

:00406A1B 8945B8 mov dword ptr [ebp-48], eax

:00406A1E 8D55BC lea edx, dword ptr [ebp-44]

:00406A21 FF431C inc [ebx+1C]

:00406A24 8D4DB8 lea ecx, dword ptr [ebp-48]

:00406A27 8B06 mov eax, dword ptr [esi]

:00406A29 83C064 add eax, 00000064

:00406A2C E897951100 call 0051FFC8

:00406A31 8D55B8 lea edx, dword ptr [ebp-48]

:00406A34 8D45C4 lea eax, dword ptr [ebp-3C]

:00406A37 E864951100 call 0051FFA0

:00406A3C FF4B1C dec [ebx+1C]

:00406A3F 8D45B8 lea eax, dword ptr [ebp-48]

:00406A42 BA02000000 mov edx, 00000002

:00406A47 E824951100 call 0051FF70

:00406A4C FF4B1C dec [ebx+1C]

:00406A4F 8D45BC lea eax, dword ptr [ebp-44]

:00406A52 BA02000000 mov edx, 00000002

:00406A57 E814951100 call 0051FF70

:00406A5C EB0D jmp 00406A6B

在hiew6.81中修改745B为755b。

效果:会弹出“软件没有激活”对话框,“过期”对话框消失。

(4)00407c3b

在W32ASM中下SHIFT+F12,输入00407c3b

停在

* Reference To: eLib.TGlobal::IsValidSerialNo(System::AnsiString)

|

:00407C3B E8BCDD0500 call 004659FC

:00407C40 83C408 add esp, 00000008

:00407C43 84C0 test al, al

:00407C45 0F95C2 setne dl //可在这里改为 sete dl

:00407C48 83E201 and edx, 00000001

:00407C4B 8D45FC lea eax, dword ptr [ebp-04]

:00407C4E 52 push edx

:00407C4F BA02000000 mov edx, 00000002

:00407C54 FF4DE8 dec [ebp-18]

:00407C57 E814831100 call 0051FF70

:00407C5C 59 pop ecx

:00407C5D 85C9 test ecx, ecx

:00407C5F 0F84A6000000 je 00407D0B //上面不改的情况下,可改为je 00407D0B,记下文件位移725fh

:00407C65 66C745DC1400 mov [ebp-24], 0014

:00407C6B A16C3B5500 mov eax, dword ptr [00553B6C]

:00407C70 50 push eax

:00407C71 33D2 xor edx, edx

:00407C73 8955F8 mov dword ptr [ebp-08], edx

:00407C76 8D4DF8 lea ecx, dword ptr [ebp-08]

:00407C79 51 push ecx

:00407C7A FF45E8 inc [ebp-18]

在HIEW中在文件位移725fh将0F84A6000000改为0F85A6000000

效果:末知

(5)00407ec8

00407eec 0f84a6000000 文件位移74ech 改为0f85a6000000

(6)00408a68

00408a8c 0f84a3000000 文件位移808ch 改为0f85a3000000

(7)0040bf7d

0040bfa1 0f84a6000000 文件位移b5a1h 改为0f84a6000000

效果:末知

(8)0040f779

0040f7a0 747c 文件位移eda0h 改为757c

效果:标题栏“unregister”消失。

(9)004147d6

004147f2 0f8451010000 文件位移13df2h 改为0f8551010000

效果:“关于”对话框显示注册成功,“软件没有激活”对话框消失。

(10)0042f8f9

:0042f94d 7407 //2ef4dH 暂不修改

效果:末知

(11)004305af

这里就是我们在win98修改过的地方,修改后不会弹出“注册码错误”对话框,到这里,上网就可激活。

:004305d6 0f8484000000 //文件位移2fbd6h 改为 0f8584000000或者90e984000000

效果:如上

(12)00431fff

:00432009 0f85ab000000 //文件位移31609h 改为0f84ab000000

效果:末知

(13)00465ba5

:00465baf 0f84bf000000 //文件位移651af 0f85bf000000

效果:“软件没有激活”对话框消失,可使用工具栏提供的“源码”和“编辑”功能。

到这里,可暂停对程序的修改,因为还有其它地方要解决。先试用一下elib,打开一网页,试着保存一下。会弹出“网页无法保存”对话框。因为过期后不支持保存功能,分析一下,我们已对ELIB调用IsValidSerialNo的地方都修改过了,是不是有其它文件还有调用了。我们发现在elib目录中还有一个文件

htmlcollect.dll。

下upx -d htmlcollect.dll脱壳。

用W32asm打开文件,点击exports工具,又发现IsValidSerialNo的身影。

0043558c位置调用了这个函数,

(14)0043558c(文件htmlcollect.dll)

:0043573f 0f84bf000000 //文件位移34d3fh 改为0f85bf000000

效果:可保存网页了。

既然这样,我们仔细检查elib目录中的文件还有调用IsValidSerialNo的,

发现在bookview.dll,batchadd.exe都有调用。全修改了!

(15)004255ed(文件bookview.dll)

:004255ed 0f84bf000000 //文件位移24bf7h 改为0f85bf000000

(16)00434b28(文件batchadd.exe)

:00434b28 0f84bf000000 //文件位移342dbh 改为0f85bf000000

现在试用一下,正常,但如果使用“导出”功能的话,还会弹出“报告bug”对话框。

看来elib文件中还有检测,

用w32asm查看elib中的EXPORTS函数,发现一个eLib.TGlobal::GetSerialNo(void)。

Exported fn(): TGlobal::GetSerialNo(void) - Ord:0283h

:004668FC 55 push ebp

:004668FD 8BEC mov ebp, esp

查看调用该函数的地方

* Referenced by a CALL at Addresses:

|:0040643E , :00406705 , :0040676A , :004069D6 , :00407C2C

|:00407C7D , :00407EB9 , :00407F0A , :00408A59 , :00408AAA

|:0040BF6E , :0040BFBF , :0040F76A , :004147C7 , :0041481A

|:00414877 , :00418979 , :0042F8EA , :00430AE2 , :004320E2

|:00465BFB

|

分析函数调用位置,将调用GetSerialNo(void)之后,又调用IsValidSerialNo的地方排除之后,

只剩下

(17)00407C7D

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:00407C7D E87AEC0500 call 004668FC

:00407CAB 50 push eax

:00407CAC 8D45F8 lea eax, dword ptr [ebp-08]

:00407CAF FF4DE8 dec [ebp-18]

:00407CB2 E8B9821100 call 0051FF70

:00407CB7 59 pop ecx

:00407CB8 84C9 test cl, cl

:00407CBA 744F je 00407D0B //修改为jne 00407D0B,文件位移72bah

(18)00407F0A

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:00407F0A E8EDE90500 call 004668FC

:00407F38 50 push eax

:00407F39 8D45F8 lea eax, dword ptr [ebp-08]

:00407F3C FF4DEC dec [ebp-14]

:00407F3F E82C801100 call 0051FF70

:00407F44 59 pop ecx

:00407F45 84C9 test cl, cl

:00407F47 744F je 00407F98 //修改为jne 00407F98,文件位移7547h

(19)00408AAA

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:00408AAA E84DDE0500 call 004668FC

:00408AD8 50 push eax

:00408AD9 8D45F4 lea eax, dword ptr [ebp-0C]

:00408ADC FF4E1C dec [esi+1C]

:00408ADF E88C741100 call 0051FF70

:00408AE4 59 pop ecx

:00408AE5 84C9 test cl, cl

:00408AE7 744C je 00408B35 //修改为jne 00408B35,文件位移80e7h

(20)0040BFBF

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:0040BFBF E838A90500 call 004668FC

:0040BFED 50 push eax

:0040BFEE 8D45F8 lea eax, dword ptr [ebp-08]

:0040BFF1 FF4DDC dec [ebp-24]

:0040BFF4 E8773F1100 call 0051FF70

:0040BFF9 59 pop ecx

:0040BFFA 84C9 test cl, cl

:0040BFFC 744F je 0040C04D //修改为jne 0040C04D,文件位移b5fch

(21)其它位置

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:00418979 E87EDF0400 call 004668FC //忽略

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:00430AE2 E8155E0300 call 004668FC //忽略

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:004320E2 E815480300 call 004668FC //忽略

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:00465BFB E8FC0C0000 call 004668FC //忽略

修改完成,试运行。可导出成CHM文件,“报告bug”对话框消失。

到此为至,整个elib2.01破解完成。经试用,我常用的功能如保存,导出均正常。

实现无时间,无功能限制,可上网激活。

缺点就是:对文件修改较多,可能会造成末知的错误。要使用破解,需要上网激活。

如果能将调用

Exported fn(): TGlobal::IsValidActiveCode() - Ord:0281h

:00465D48 55 push ebp

的地方也改一改可能效果会更好。

最佳的破解方法应该是能算出注册码,算法分析请参考ssljx的《算法分析》。

标 题:win2000下手动破解Elib2.01(二)Cool!! (10千字)

发信人:ircbox

时 间:2002-3-29 16:08:15

详细信息:

win2000下手动破解Elib2.01(三)

在《win2000下手动破解Elib2.01》(一)文中,讲过Elib检测注册码是否正确的核心为函数

eLib.TGlobal::IsValidSerialNo(System::AnsiString)

曾经说过由于函数的实现较复杂,希望有高手能够直接修改它来完成破解,可今天发现,

原来我就是一个“高手”,开个玩笑:)。直接修改eLib.TGlobal::IsValidSerialNo(System::AnsiString)的实现,同样完成了成功注册。并且这样的破解更干净,更稳定。

由于完成Elib整个的破解,需要修改elib目录中的四个文件。

分别是

elib.exe,htmlcollect.dll,bookview.dll,batchadd.exe

分别备份,用upx1.20W脱壳。

如 upx -d elib.exe。

建一个新目录,将脱壳后的文件分别复制到目录中。w32asm8.93将会用到。

用w32asm打开该目录中的elib.exe。

用hiew打开elib安装目录中的elib.exe。

(一)修改IsValidSerialNo

如果还记得eLib.TGlobal::IsValidSerialNo(System::AnsiString)的位置,则可在w32asm中

下Shift+F12,填上位移0046F9FC,点OK;或者点击w32asm工具栏上的“Exports Function”

找到TGlobal::IsAValidateNumber(())点击后,停在

Exported fn(): TGlobal::IsValidSerialNo(System::AnsiString) - Ord:027Fh

:004659FC 55 push ebp

:004659FD 8BEC mov ebp, esp

:004659FF 83C4D8 add esp, FFFFFFD8

:00465A02 B8387F5400 mov eax, 00547F38

:00465A07 53 push ebx

:00465A08 8B5D08 mov ebx, dword ptr [ebp+08]

:00465A0B E884FB0A00 call 00515594

:00465A10 C745F401000000 mov [ebp-0C], 00000001

:00465A17 8D550C lea edx, dword ptr [ebp+0C]

:00465A1A 8D450C lea eax, dword ptr [ebp+0C]

:00465A1D E876A30B00 call 0051FD98

:00465A22 FF45F4 inc [ebp-0C]

:00465A25 33D2 xor edx, edx

:00465A27 66C745E80800 mov [ebp-18], 0008

:00465A2D 66C745E81400 mov [ebp-18], 0014

:00465A33 8955FC mov dword ptr [ebp-04], edx

:00465A36 8D55FC lea edx, dword ptr [ebp-04]

:00465A39 FF45F4 inc [ebp-0C]

:00465A3C 8D450C lea eax, dword ptr [ebp+0C]

:00465A3F E8B0A80B00 call 005202F4

:00465A44 8D55FC lea edx, dword ptr [ebp-04]

:00465A47 8D450C lea eax, dword ptr [ebp+0C]

:00465A4A E851A50B00 call 0051FFA0

:00465A4F FF4DF4 dec [ebp-0C]

:00465A52 8D45FC lea eax, dword ptr [ebp-04]

:00465A55 BA02000000 mov edx, 00000002

:00465A5A E811A50B00 call 0051FF70

:00465A5F 8B4D0C mov ecx, dword ptr [ebp+0C]

:00465A62 85C9 test ecx, ecx

:00465A64 7408 je 00465A6E

:00465A66 8B450C mov eax, dword ptr [ebp+0C]

:00465A69 8B50FC mov edx, dword ptr [eax-04]

:00465A6C EB02 jmp 00465A70

.

.

.

我们已经分析总结过,如果你填写的的注册码正确,则函数返回值eax值为0;否则为1。

更确切的说是al的值决定注册码的正确,我们向下走走,看函数中是否有对al的设置。

来到这里。

* Reference To: eLib.TGlobal::fun1(char*)

|

:00465B5B E8C0F9FFFF call 00465520

:00465B60 83C408 add esp, 00000008

:00465B63 85C0 test eax, eax

:00465B65 0F94C0 sete al //就是这里了,设置al

//改成 0F95C0 setne al 即可。记下文件位移@offset 65165h

:00465B68 83E001 and eax, 00000001

:00465B6B BA02000000 mov edx, 00000002

:00465B70 50 push eax //保存eax

:00465B71 8D450C lea eax, dword ptr [ebp+0C]

:00465B74 FF4DF4 dec [ebp-0C]

:00465B77 E8F4A30B00 call 0051FF70 //这个调用不影响al

:00465B7C 58 pop eax //弹给eax

:00465B7D 8B55D8 mov edx, dword ptr [ebp-28]

:00465B80 64891500000000 mov dword ptr fs:[00000000], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

|:00465A93(U), :00465B46(U)

|

:00465B87 5B pop ebx

:00465B88 8BE5 mov esp, ebp

:00465B8A 5D pop ebp

:00465B8B C3 ret //函数返回

在hiew6.81中,下F5,输入65165(上面记下的文件位移),回车停在

00465B65 0F94C0 sete al

下F3

将0F94C0改为0F95C0,

下F9保存。

(二)修改00406457处的调用

在w32asm中下Shift+F12,填入4659FC,点OK,再次来到这里。

Exported fn(): TGlobal::IsValidSerialNo(System::AnsiString) - Ord:027Fh

:004659FC 55 push ebp

向上走几步,就会看见,什么地方调用了IsValidSerialNo。具体每个调用的效果,可参考

win2000下手动破解Elib2.01》(一)文中的说明。

* Referenced by a CALL at Addresses:

|:00406457 , :00406716 , :004069E5 , :00407C3B , :00407EC8

|:00408A68 , :0040BF7D , :0040F779 , :004147D6 , :0042F8F9

|:004305AF , :00431FFF , :00465BA5

|

在(一)文中提到第一处调用00406457后的:00406461 0f84eb000000 je 00406552

如果修改成0f85eb000000 jne 00406552会弹出“软件是盗版”对话框。

可是今天我们不改的话,运行elib.exe,反而会弹出“软件是盗版”对话框。

因为修改方法变化了,所以我们必须将0f84eb000000 je 00406552改成

0f85eb000000 jne 00406552

文件位移是5a61h,

同样在hiew中修改,保存。

(三)修改其它IsValidSerialNo

除了elib.exe有IsValidSerialNo实现外,其它文件htmlcollect.dll,bookview.dll,

batchadd.exe同样有。全部修改就成了,方法与修改elib.exe一样。

htmlcollect.dll

文件位移:34cf2h

bookview.dll

:004255ad 文件位移:24badh

batchadd.exe

:00434c91 文件位移: 3429ah

(四)修改调用TGlobal::GetSerialNo(void)的地方(elib.exe文件)

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:00407C7D E87AEC0500 call 004668FC

:00407CAB 50 push eax

:00407CAC 8D45F8 lea eax, dword ptr [ebp-08]

:00407CAF FF4DE8 dec [ebp-18]

:00407CB2 E8B9821100 call 0051FF70

:00407CB7 59 pop ecx

:00407CB8 84C9 test cl, cl

:00407CBA 744F je 00407D0B //修改为jne 00407D0B,文件位移72bah

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:00407F0A E8EDE90500 call 004668FC

:00407F38 50 push eax

:00407F39 8D45F8 lea eax, dword ptr [ebp-08]

:00407F3C FF4DEC dec [ebp-14]

:00407F3F E82C801100 call 0051FF70

:00407F44 59 pop ecx

:00407F45 84C9 test cl, cl

:00407F47 744F je 00407F98 //修改为jne 00407F98,文件位移7547h

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:00408AAA E84DDE0500 call 004668FC

:00408AD8 50 push eax

:00408AD9 8D45F4 lea eax, dword ptr [ebp-0C]

:00408ADC FF4E1C dec [esi+1C]

:00408ADF E88C741100 call 0051FF70

:00408AE4 59 pop ecx

:00408AE5 84C9 test cl, cl

:00408AE7 744C je 00408B35 //修改为jne 00408B35,文件位移80e7h

* Reference To: eLib.TGlobal::GetSerialNo(void)

|

:0040BFBF E838A90500 call 004668FC

:0040BFED 50 push eax

:0040BFEE 8D45F8 lea eax, dword ptr [ebp-08]

:0040BFF1 FF4DDC dec [ebp-24]

:0040BFF4 E8773F1100 call 0051FF70

:0040BFF9 59 pop ecx

:0040BFFA 84C9 test cl, cl

:0040BFFC 744F je 0040C04D //修改为jne 0040C04D,文件位移b5fch

(五)上网激活

到这里,就可以上网激活一下就行了。

注意注册码的格式为 ELIBA-XXXXX-XXXXX-XXXXX-XXXXX

由于可能注册码已被占用或被封,激活不成功的话,可变化X的值。多试几次,就会有一个你拥有的激活码。

(六)填写激活码

如果不想用上网激活方式,也可使用填写激活码方式。

当然我们要对程序做相应的修改。我就不具体说明,但可以举个例子。

elib使用IsValidActiveCode函数来检测。

在w32asm中下shift+F12,填入00465D48,点OK,停在

* Referenced by a CALL at Addresses:

|:00406798 , :004148A3 , :00430B12 , :00432110 , :00465C25

|

Exported fn(): TGlobal::IsValidActiveCode() - Ord:0281h

:00465D48 55 push ebp

有五个地方调用IsValidActiveCode

记下位置,

下Shift+F12,填入第一个地址00406798,点OK,停在

* Reference To: eLib.TGlobal::IsValidActiveCode()

|

:00406798 E8ABF50500 call 00465D48

:0040679D 83C410 add esp, 00000010

:004067A0 BA02000000 mov edx, 00000002

:004067A5 50 push eax

:004067A6 8D45F0 lea eax, dword ptr [ebp-10]

:004067A9 FF4B1C dec [ebx+1C]

:004067AC E8BF971100 call 0051FF70

:004067B1 FF4B1C dec [ebx+1C]

:004067B4 8D45F4 lea eax, dword ptr [ebp-0C]

:004067B7 BA02000000 mov edx, 00000002

:004067BC E8AF971100 call 0051FF70

:004067C1 FF4B1C dec [ebx+1C]

:004067C4 8D45F8 lea eax, dword ptr [ebp-08]

:004067C7 BA02000000 mov edx, 00000002

:004067CC E89F971100 call 0051FF70

:004067D1 59 pop ecx

:004067D2 84C9 test cl, cl

:004067D4 0F84BB000000 je 00406895 //这里改成jmp 00406895即可。

:004067DA 66C743102000 mov [ebx+10], 0020

:004067E0 33C0 xor eax, eax

:004067E2 8D55E4 lea edx, dword ptr [ebp-1C]

:004067E5 8945E4 mov dword ptr [ebp-1C], eax

:004067E8 52 push edx

:004067E9 FF431C inc [ebx+1C]

其它四个调用的相应位置也修改一下就行了。

当然要检查一下,其它文件是否也有调用。

总结:

Elib在加密,防止破解方面做得不是很好,比如加壳,加密算法,以及函数的实现上显得稚嫩,形式上比较单一。希望新版能有所改进。上网激活方式上,服务器端应该增加检测注册码功能。导出CHM格式文件功能最好不要使用微软的软件捆绑。能自己实现此功能才是上乘。希望Elib的作者能在网络上发现此文,作为软件升级,设计新版软件的参考。 (出处:嬴政天下整理收藏)

相关文章:

·关于注册Flag在破解中的应用

·从轻松试卷 v4.03 的破解看 r fl z 的妙用

·破解圣经之------滚瓜烂熟篇

·破解API Spy for Windows 95/98/NT/2000

·chm帮助编辑器v2.6 注册码破解详谈之一*脱壳篇*

·破解NetAlert v2 [热点] 指导如何自动脱壳!!

·破解的理由

·对于破解的一些想法

·Audio Converter 3.0 破解要点

·破解 Matcom 4.0 for BC

相关软件:

·美萍安全卫士密码破解器 3.0+

·网文快爪 v1.0 破解版

·坏猫网页编辑 v2.0完整版破解文件

·pakmarker1.0破解版

·IE Plus!破解版

·邮件服务器2.6+破解版

·BadCopy99 V2.0 破解文件

·登录奇兵 3.01破解文件

·易思多媒体网络教室-4用户演示版破解文件

·网络三国智能机器人1.0.0.101版破解

→ 特别推荐

→ 热点TOP10

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1999-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史