win2000下手动破解Elib2.01(二)Cool!! (10千字)
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的作者能在网络上发现此文,作为软件升级,设计新版软件的参考。
