欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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的作者能在网络上发现此文,作为软件升级,设计新版软件的参考。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功