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 (17千字)
- 作 者:ircbox
- 时 间:2002-3-28 21:22:24
- 链 接:http://bbs.pediy.com