jacksunblack 发表于 2007-12-21 19:04:27

“PECompact”+“重启验证”破解过程(2007年12月18日)

【破文标题】“PECompact”+“重启验证”破解过程(2007年12月18日)
【破文作者】Jacksunblack
【作者邮箱】[email protected]
【破解工具】PeiD v0.94;Ollydbg;LordPE;Import REConstructor
【破解平台】Windows XP sp2
【软件名称】心情日记本
【软件大小】3.56M
【原版下载】http://www.pcsoft.com.cn/Soft/Soft_10394.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:
0040100D    64:8925 0000000>mov dword ptr fs:,esp
00401014    33C0            xor eax,eax
00401016    8908            mov dword ptr ds:,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:
7C809AEC    FF75 0C         push dword ptr ss:
7C809AEF    FF75 08         push dword ptr ss:
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: //到此处
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:
00F60C0D    FF95 3B1F0010   call dword ptr ss:
00F60C13    8B46 0C         mov eax,dword ptr ds:
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:,eax   ; mydiary.005A2A40
006626D6    8BF0            mov esi,eax
006626D8    8B4B 14         mov ecx,dword ptr ds:
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:
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:
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:
7C801A38    FF75 1C         push dword ptr ss:
7C801A3B    FF75 18         push dword ptr ss:
7C801A3E    FF75 14         push dword ptr ss:
7C801A41    FF75 10         push dword ptr ss:
7C801A44    FF75 0C         push dword ptr ss:
7C801A47    FF70 04         push dword ptr ds:
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:,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:
00598B2D    E8 F6A9E6FF   call dumped_.00403528
00598B32    E8 799EE6FF   call dumped_.004029B0

继续按F8跟踪,到达:
00598C45    8B95 E4FCFFFF   mov edx,dword ptr ss:
00598C4B    58            pop eax
00598C4C    E8 7BC2E6FF   call dumped_.00404ECC
00598C51    0F85 AA000000   jnz dumped_.00598D01

注意此时的堆栈段:
0012FAF8   0107CB24ASCII "CB133A63E7AB9A63CB133A63E7AB9A63EFB1C1854CB176E0"
0012FAFC   0107CB8CASCII "11111111111111111111"   //破解过程中所输入的注册码
0012FB00   0107CB00ASCII "ODg5MjVBMzgyOTZGOEU1Mw"
0012FB04   0107CAB8ASCII "88925A38296F8E53"
0012FB08   0107CA80ASCII "ABCDE"                   //破解过程中所输入的注册名
0012FB0C   0107CA98ASCII "88925A38296F8E53"
0012FB10   0107CA4CASCII "C202BBB9B9931A4C"
0012FB14   0107C938ASCII "E:\DOWNLOAD\Mydiary2007\Mydiary2007\Mydiary.Keyfile"

在jnz语句上按“ENTER”键,来到它的目的代码段,可知此处跳转到了未注册的部分,因此,jnz上面的call为关键的判断部分。
00598D01    A1 A09A5A00   mov eax,dword ptr ds:
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相似,只是它只能用于异步读操作,并包含了一个完整的回调
      通过下断点,跟踪程序过程,找到关键的跳转和判断。从而实现破解的过程。

------------------------------------------------------------------------
【版权声明】请尊重原版软件!

unpack 发表于 2007-12-21 19:29:40

还不会破解这些但是在努力
学习了啊

darling995 发表于 2007-12-21 19:55:46

学习一下,试了可以做内存注册机。
附内存注册机:用法,先注册一下,然后运行注册机(因为是重启验证)

hdy981 发表于 2007-12-21 23:48:29

明码比较的,当然可以做成内存注册机了

pw2000 发表于 2007-12-22 09:43:52

谢谢分享....

zhoudongzhou 发表于 2007-12-22 10:22:15

学习,谢谢......

magic659117852 发表于 2007-12-22 16:09:17

/:014 详细的破文。。新手学习了

一杯白开水 发表于 2007-12-22 19:53:56

学习了

呵呵

xiaoqiang527 发表于 2007-12-27 18:42:13

我第一次学破解遇到的是个key.dat。的

可惜,没有明文显示注册码。

因为菜鸟不会看算法。就放弃了。

55555

hnld 发表于 2007-12-28 17:11:06

谢谢分享。又明白了不少
页: [1] 2
查看完整版本: “PECompact”+“重启验证”破解过程(2007年12月18日)