首页
社区
课程
招聘
[求助]如何破解有自解码的DLL
发表于: 2005-6-10 13:18 7480

[求助]如何破解有自解码的DLL

2005-6-10 13:18
7480
[目标程序]
encryptdll3.6专业版
《共享软件加密算法库》专业版是一款针对个人、企业开发共享软件的加密工具,支持Windows平台下各类开发工具: VC、VB、BCB、Delphi、PB、VFP、ASP等,算法库中包含了获取计算机硬盘物理序列号、主板序列号功能及多种高强度对称、非对称算法。获取的硬盘序列号不随硬盘分区及格式化改变,支持IDE、SCSI接口硬盘,获取主板序列号的功能支持各类BIOS芯片,这两个功能可方便的用来实现一机一码的注册方式。算法库集成的算法有:BlowFish,MD5,Secret16,AES、SHA、CRC32、RSA、DES、字符串加/解密、
文件加/解密等多种功能强大的算法,可以满足软件开发的各类需求,加密算法库附有详细的函数说明及各类软件调用示例。

[遇到问题]
其提供的所有加密函数功能都放在Reg.dll中,用OD跟发现该Dll有自解码,包含区段Roba类型SFX,dll加载后自动解码,因为其注册算法采用了对称加密算法,要跟出注册码是不可能了,因此我用爆破。但是,爆破要修改字节,保存后,因为没有去掉自解码程序段(因为我菜,没跟出来),也许还有自校验,所以加载出错。
试着想去掉自解码,一步一步从DLL模块的入口处跟,不一会就异常了――还有SEH?? 唉――
谁能帮帮我,给个去除dll自解码的文章。

最好是就这个Reg.dll。
[下载]
http://liangs.autodebug.com

[调试过程]
选择示例VB6_TestEncryDll编译。

OD加载主程序TestEncryDll.exe,VB程序,因为reg.dll是动态加载(loadlibrary)的,
而不是设计时静态联编的,因此直接F9运行,程序界面出现。
此时下 MSVBVM60.DllFunctionCall 断点,有好几处调用,全部F2设断,其分别对应于调用reg.dll输出
的各个加密函数。
点击MD5加密按钮,程序中断:
0040235D       0>db 00
0040235E       0>db 00
0040235F       0>db 00
00402360       0>db 0B
00402361       0>db 00
00402362       0>db 00
00402363       0>db 00
00402364    .  4>ascii "MD5Encrypt",0
0040236F       0>db 00
00402370       F>dd TestEncr.004021F0                     ;  ASCII "Reg.DLL"
00402374       6>dd TestEncr.00402364                     ;  ASCII "MD5Encrypt"
00402378       0>db 00
00402379       0>db 00
0040237A       0>db 04
0040237B       0>db 00
0040237C       7>dd TestEncr.00408374
00402380       0>db 00
00402381       0>db 00
00402382       0>db 00
00402383       0>db 00
00402384       0>db 00
00402385       0>db 00
00402386       0>db 00
00402387       0>db 00
00402388    $  A>mov eax,dword ptr ds:[40837C]                  ;EAX<==MD5Encrypt函数的句柄
0040238D    .  0>or eax,eax                                  ; 若前面已经加载过Reg.dll调用过一次,则EAX不等于0,直接CALL就是了       
0040238F    .  7>je short TestEncr.00402393                  ;第一次调用,Reg.dll尚未加载       
00402391    .  F>jmp eax
00402393    >  6>push TestEncr.00402370
00402398    .  B>mov eax,<jmp.&MSVBVM60.DllFunctionCall>        ;中断于此
0040239D    .  F>call eax
0040239F    .  F>jmp eax

F7跟进,来到MSVBVM60空间:
6600A031     6>push 0
6600A033     F>push dword ptr ss:[ebp+8]                ; TestEncr.00402370==>
        注意到[00402370]==>00402370  F0 21 40 00              ?@.d

        004021F0  52 65 67 2E 44 4C 4C 00  Reg.DLL.
        004021F8  0E 00 00 00 47 65 74 48  ...GetH
        00402200  61 72 64 44 69 73 6B 49  ardDiskI
        00402208  64 00                    d.
        原来每个输出的加解密函数调用在函数开始时都会调用GetHardDiskId()函数获取硬盘ID,
        算作机器码?

6600A036     E>call MSVBVM60.6600A07D                        ;F7跟进
6600A03B     8>mov esi,eax
6600A03D     8>test esi,esi
6600A03F     0>jl MSVBVM60.66021B54
6600A045     8>cmp byte ptr ds:[6610F170],0
6600A04C     0>jnz MSVBVM60.66021BB5

来到这里:
6600A0A9     F>push dword ptr ds:[esi]                  ; TestEncr.004021F0
6600A0AB     F>call dword ptr ds:[<&KERNEL32.LoadLibrar>; KERNEL32.LoadLibraryA  
                                                        ;开始加载Reg.dll库了
                                                        ;F7 跟进
6600A0B1     8>cmp eax,20

进入KERNEL32空间,F8单步跟踪(由于Reg.dll虽然PEID查得用VC++6编写,但程序有自解码,我原来
用暴力破解做的程序dll补丁运行出错,很有可能就是在DllMain事件中解码出错,或者程序有自校验,
因此这里跟入看看它自己怎么解码的):
77E80273     6>push 0
77E80275     6>push 0
77E80277     F>push dword ptr ss:[ebp+8]                ; TestEncr.004021F0==>ASCII "Reg.dll"
77E8027A     E>call KERNEL32.LoadLibraryExA
....
77E802A3     F>push dword ptr ss:[esp+C]
77E802A7     F>push dword ptr ss:[esp+C]
77E802AB     F>push dword ptr ds:[eax+4]                ;ASCII "Reg.dll"
77E802AE     E>call KERNEL32.LoadLibraryExW                ;在这里F8一下,ALT+E看到Reg.dll模块已加载,双击进入,可以看到程序尚未解码
77E802B3     C>retn 0C

ALT+M
内存映射
地址       大小       Owner                         区段       包含                    类型                访问      初始? 映射为
06CB0000   00001000   Reg      06CB0000 (itself)               PE header               Imag 01001002       R         RWE
06CB1000   00045000   Reg      06CB0000             .text      code                    Imag 01001002       R         RWE
06CF6000   00001000   Reg      06CB0000             .rsrc      imports,exports         Imag 01001002       R         RWE
06CF7000   00001000   Reg      06CB0000             .reloc     data,relocations        Imag 01001002       R         RWE
06CF8000   00001000   Reg      06CB0000             RoBa       SFX                     Imag 01001002       R         RWE
注意到Reg区段RoBa了吗,包含SFX,啥意思,再次验证了Reg.dll包含自解码程序段了。

像这种情况怎么跟踪呢?
又看了看OD帮助,提到hit跟踪方式,一种思路。
另一种思路,ALT+M,对Reg模块的所有区段设置内存访问中断,摸索到自解压部分。

到这里就跟不下去了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
2
以前有过讨论
论坛内搜索
2005-6-10 13:34
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
谢谢关注!
我大致跟踪完了整个自解码过程,其间解决了SEH问题,但是我还是不知道要修改哪些代码才能使保存解码后的dll文件valid。
哪位大哥帮帮忙呀。

fly大哥,我搜索不到呀
2005-6-11 00:00
0
游客
登录 | 注册 方可回帖
返回
//