本人遇上一个软件用的是.txt重启验证,加密是PECompact 1.4x or above -> Jeremy Collake
已被我脱壳,为了脱壳,学了三四天,,,,结果后来发现有脱壳机,,,,郁闷
但脱壳后还是不能解决重启验证,不能正常使用软件。因此发出来讨论如何破解.txt验证,以求提高技术水平,希望各位新手,高手一起来讨论,请把详细过程,写出来或录制
以下是另一款软件的参考
本人QQ 6364581
EMAIL 6364581@QQ.COM
“PECompact”+“重启验证”破解过程(2007年12月18日)
【破文标题】“PECompact”+“重启验证”破解过程(2007年12月18日)
【破文作者】Jacksunblack
【作者邮箱】jacksunblack@163.com
【破解工具】PeiD v0.94;Ollydbg;LordPE;Import REConstructor
【破解平台】Windows XP sp2
【软件名称】心情日记本
【软件大小】3.56M
【原版下载】http://www.onlinedown.net/soft/47701.htm
【保护方式】PECompact 2.x -> Jeremy Collake
【软件简介】一款书写日记的软件。
写日记,可定义主题、心情、天气、日期、内容。
查看日记的内容按时间排序,支持数字统计,自动阅读等功能。
可以设置写日记时的背景音乐,可设置播放列表。
可以管理多个日记本,可压缩日记数据大小。
可以自定义日记本界面和皮肤、背景图片等设置。
如有更新,日记本程序可以自动更新到最新版本
有操作日志,记录用户最近的重要操作。
【破解声明】本破解过程仅出于个人学习目的,如有不足敬请指教!
------------------------------------------------------------------------
【破解过程】1.首先,打开软件“心情日记本”,跳出窗口“注册心情日记本”。
点击“输入注册码”按钮,输入用户名“ABCDE”,注册码:“11111-11111-11111-11111”,点击“确定”
出现提示窗口“感谢您的注册,下次启动程序是,会对您的注册信息进行验证”
由此,可得出,该软件属于重启验证类型。
推出程序,在程序对应目录下,看到名为“Mydiary.Keyfile”的文件,推测其为注册码信息文件。
2.在了解了软件的注册方式之后,首先使用PeiD v0.94进行壳的检测,检测结果为:PECompact 2.x -> Jeremy Collake
设置Ollydbg忽略所有的异常选项,再用OD插件隐藏OD。
OD载入
00401000 > B8 30266600 mov eax,mydiary.00662630
00401005 50 push eax
00401006 64:FF35 0000000>push dword ptr fs:[0]
0040100D 64:8925 0000000>mov dword ptr fs:[0],esp
00401014 33C0 xor eax,eax
00401016 8908 mov dword ptr ds:[eax],ecx
00401018 50 push eax
下断点:BP VirtualFree。按F9运行。程序中断后,取消断点。
7C809AE4 > 8BFF mov edi,edi //中断到此处
7C809AE6 55 push ebp
7C809AE7 8BEC mov ebp,esp
7C809AE9 FF75 10 push dword ptr ss:[ebp+10]
7C809AEC FF75 0C push dword ptr ss:[ebp+C]
7C809AEF FF75 08 push dword ptr ss:[ebp+8]
7C809AF2 6A FF push -1
7C809AF4 E8 09000000 call kernel32.VirtualFreeEx
7C809AF9 5D pop ebp
7C809AFA C2 0C00 retn 0C
按 Alt+F9
00F60934 8B4424 20 mov eax,dword ptr ss:[esp+20] //到此处
00F60938 5F pop edi
00F60939 5E pop esi
00F6093A 5B pop ebx
00F6093B 83C4 10 add esp,10
00F6093E C2 0C00 retn 0C
然后,ctrl+F ,查找 push 8000(特征码)。
00F60BFB E8 37070000 call 00F61337
00F60C00 68 00800000 push 8000
00F60C05 6A 00 push 0
00F60C07 FFB5 271F0010 push dword ptr ss:[ebp+10001F27]
00F60C0D FF95 3B1F0010 call dword ptr ss:[ebp+10001F3B]
00F60C13 8B46 0C mov eax,dword ptr ds:[esi+C]
00F60C16 03C7 add eax,edi
00F60C18 5D pop ebp
00F60C19 5E pop esi
00F60C1A 5F pop edi
00F60C1B 5B pop ebx
00F60C1C C3 retn //在此处下断点
如上所示,在retn处下断点,F9运行。然后单步运行(F8)程序来到了:
006626D0 8985 3F130010 mov dword ptr ss:[ebp+1000133F],eax ; mydiary.005A2A40
006626D6 8BF0 mov esi,eax
006626D8 8B4B 14 mov ecx,dword ptr ds:[ebx+14]
006626DB 5A pop edx
006626DC EB 0C jmp short mydiary.006626EA
006626DE 03CA add ecx,edx
006626E0 68 00800000 push 8000
006626E5 6A 00 push 0
006626E7 57 push edi
006626E8 FF11 call dword ptr ds:[ecx]
006626EA 8BC6 mov eax,esi
006626EC 5A pop edx
006626ED 5E pop esi
006626EE 5F pop edi
006626EF 59 pop ecx
006626F0 5B pop ebx
006626F1 5D pop ebp
006626F2 FFE0 jmp eax //此处返回到OEP
如上所示,单步运行(F8)到‘jmp eax’,程序跳转到了:
005A2A40 55 push ebp //此处即为OEP
005A2A41 8BEC mov ebp,esp
005A2A43 83C4 F0 add esp,-10
005A2A46 53 push ebx
005A2A47 B8 D8215A00 mov eax,mydiary.005A21D8
005A2A4C E8 FB46E6FF call mydiary.0040714C
使用LordPE将该进程完整转存,再使用Import REConstructor修复,生成脱壳后的文件dump_.exe
使用PEiD查壳,检查结果为:Borland Delphi 6.0 - 7.0
至此,脱壳成功!
3.下面,进入破解过程
使用OD载入脱壳后的程序dump_.exe,针对该软件读取名为“Mydiary.Keyfile”的文件,进行重启验证这一方式。下断点:“bp CreateFileA”
shift+F9运行,留意堆栈段信息。当堆栈段出现如下信息时:
0012FAA8 004034C0 /CALL 到 CreateFileA 来自 dumped_.004034BB
0012FAAC 0012FBFC |FileName = "E:\DOWNLOAD\Mydiary2007\Mydiary2007\Mydiary.Keyfile"
0012FAB0 C0000000 |Access = GENERIC_READ|GENERIC_WRITE
0012FAB4 00000003 |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
0012FAB8 00000000 |pSecurity = NULL
0012FABC 00000003 |Mode = OPEN_EXISTING
0012FAC0 00000080 |Attributes = NORMAL
0012FAC4 00000000 \hTemplateFile = NULL
F2取消断点,F8单步跟踪
7C801A24 > 8BFF mov edi,edi //在此处取消断点,开始F8跟踪
7C801A26 55 push ebp
7C801A27 8BEC mov ebp,esp
7C801A29 FF75 08 push dword ptr ss:[ebp+8]
7C801A2C E8 43C60000 call kernel32.7C80E074
7C801A31 85C0 test eax,eax
7C801A33 74 1E je short kernel32.7C801A53
7C801A35 FF75 20 push dword ptr ss:[ebp+20]
7C801A38 FF75 1C push dword ptr ss:[ebp+1C]
7C801A3B FF75 18 push dword ptr ss:[ebp+18]
7C801A3E FF75 14 push dword ptr ss:[ebp+14]
7C801A41 FF75 10 push dword ptr ss:[ebp+10]
7C801A44 FF75 0C push dword ptr ss:[ebp+C]
7C801A47 FF70 04 push dword ptr ds:[eax+4]
7C801A4A E8 11ED0000 call kernel32.CreateFileW
7C801A4F 5D pop ebp
7C801A50 C2 1C00 retn 1C //此处返回,其后程序段如下:
004034C0 83F8 FF cmp eax,-1
004034C3 74 24 je short dumped_.004034E9
004034C5 8903 mov dword ptr ds:[ebx],eax
004034C7 EB 30 jmp short dumped_.004034F9 //此处跳转实现,继续跟踪:
004034F9 5F pop edi ; 0100BFEC
004034FA 5E pop esi
004034FB 5B pop ebx
004034FC C3 retn //此处返回,其后程序段如下:
再次经历了一个retn之后,程序来到了:
00598B20 E8 8B9EE6FF call dumped_.004029B0
00598B25 33D2 xor edx,edx
00598B27 8D85 9CFDFFFF lea eax,dword ptr ss:[ebp-264]
00598B2D E8 F6A9E6FF call dumped_.00403528
00598B32 E8 799EE6FF call dumped_.004029B0
继续按F8跟踪,到达:
00598C45 8B95 E4FCFFFF mov edx,dword ptr ss:[ebp-31C]
00598C4B 58 pop eax
00598C4C E8 7BC2E6FF call dumped_.00404ECC
00598C51 0F85 AA000000 jnz dumped_.00598D01
注意此时的堆栈段:
0012FAF8 0107CB24 ASCII "CB133A63E7AB9A63CB133A63E7AB9A63EFB1C1854CB176E0"
0012FAFC 0107CB8C ASCII "11111111111111111111" //破解过程中所输入的注册码
0012FB00 0107CB00 ASCII "ODg5MjVBMzgyOTZGOEU1Mw"
0012FB04 0107CAB8 ASCII "88925A38296F8E53"
0012FB08 0107CA80 ASCII "ABCDE" //破解过程中所输入的注册名
0012FB0C 0107CA98 ASCII "88925A38296F8E53"
0012FB10 0107CA4C ASCII "C202BBB9B9931A4C"
0012FB14 0107C938 ASCII "E:\DOWNLOAD\Mydiary2007\Mydiary2007\Mydiary.Keyfile"
在jnz语句上按“ENTER”键,来到它的目的代码段,可知此处跳转到了未注册的部分,因此,jnz上面的call为关键的判断部分。
00598D01 A1 A09A5A00 mov eax,dword ptr ds:[5A9AA0]
00598D06 05 7C080000 add eax,87C
00598D0B BA C0955900 mov edx,dumped_.005995C0 ; 未注册
00598D10 E8 FFBDE6FF call dumped_.00404B14
00598D15 33C9 xor ecx,ecx
00598D17 B2 01 mov dl,1
按Alt+F9返回程序段,在call语句上按F7进入子程序
注意到此时EAX中值的ASCII码为:ASCII "ODg5MjVBMzgyOTZGOEU1Mw"
EDX中值的ASCII码为:ASCII "11111111111111111111" //后者为我们输入的伪注册码
观察程序段:
00404ECC 53 push ebx
00404ECD 56 push esi
00404ECE 57 push edi
00404ECF 89C6 mov esi,eax
00404ED1 89D7 mov edi,edx
00404ED3 39D0 cmp eax,edx //此处做比较判断
00404ED5 0F84 8F000000 je dumped_.00404F6A //如果相同跳转
在je语句上单击“ENTER”键,程序到了该子程序的末尾:
00404F6A 5F pop edi
00404F6B 5E pop esi
00404F6C 5B pop ebx
00404F6D C3 retn
即为相同就返回。
则得知,该注册名所对应的注册码为:ODg5MjVBMzgyOTZGOEU1Mw
重新打开程序,按照用户名:ABCDE,注册码:ODg5MjVBMzgyOTZGOEU1Mw输入。重启后,提示注册成功;
或将00598C51 0F85 AA000000 jnz dumped_.00598D01处的jnz判断改为je,使之跳转条件转变,重启后,弹出窗口提示注册成功
至此,实现了本软件的破解过程。
jacksunblack
2007年12月18日于杭州
------------------------------------------------------------------------
【破解总结】第一:PECompact 2.x -> Jeremy Collake壳的脱壳方式的经验方法:
1.设置Ollydbg忽略所有的异常选项,再用OD插件隐藏OD。
OD载入
2.下断点:P VirtualFree。按F9运行。程序中断后,取消断点。
3.按 Alt+F9然后,ctrl+F ,查找 push 8000(特征码)。
4.在该程序段的retn处下断点,F9运行。然后单步运行(F8)程序,找到OEP
第二、重启验证式软件的破解方法
访问文件类常用API:
CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台
OpenFile 这个函数能执行大量不同的文件操作 ReadFile 从文件中读出数据
ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调
通过下断点,跟踪程序过程,找到关键的跳转和判断。从而实现破解的过程。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
上传的附件: