飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6343|回复: 18

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

[复制链接]

该用户从未签到

发表于 2007-12-21 19:04:27 | 显示全部楼层 |阅读模式
【破文标题】“PECompact”+“重启验证”破解过程(2007年12月18日)
【破文作者】Jacksunblack
【作者邮箱】jacksunblack@163.com
【破解工具】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:[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相似,只是它只能用于异步读操作,并包含了一个完整的回调
      通过下断点,跟踪程序过程,找到关键的跳转和判断。从而实现破解的过程。

------------------------------------------------------------------------
【版权声明】请尊重原版软件!
PYG19周年生日快乐!

该用户从未签到

发表于 2007-12-21 19:29:40 | 显示全部楼层
还不会破解这些  但是在努力
学习了啊
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-10-14 20:16
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2007-12-21 19:55:46 | 显示全部楼层
    学习一下,试了可以做内存注册机。
    附内存注册机:用法,先注册一下,然后运行注册机(因为是重启验证)

    key.rar

    14.07 KB, 下载次数: 4, 下载积分: 飘云币 -2 枚

    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2018-3-5 11:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2007-12-21 23:48:29 | 显示全部楼层
    明码比较的,当然可以做成内存注册机了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-22 09:43:52 | 显示全部楼层
    谢谢分享....
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-22 10:22:15 | 显示全部楼层
    学习,谢谢......
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-22 16:09:17 | 显示全部楼层
    /:014 详细的破文。。新手学习了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-22 19:53:56 | 显示全部楼层
    学习了

    呵呵
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-9-7 09:38
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2007-12-27 18:42:13 | 显示全部楼层
    我第一次学破解遇到的是个key.dat。的

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

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

    55555
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-28 17:11:06 | 显示全部楼层
    谢谢分享。又明白了不少
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表