• 标 题:有感于朋友们的鼓励,再送上艾克主页秀2005 找破点,打SMC补丁(新手教程)
  • 作 者:vipchenji
  • 时 间:2004-12-02,08:17
  • 链 接:http://bbs.pediy.com

【软件名称】:艾克主页秀2005  找破点,打SMC补丁(新手教程)
【大    小】:624 KB (638,976 字节)
【下载地址】:自己去找
【软件限制】:功能限制
【软件简介】:艾克主页(*)2005是一款功能强大的网页制作辅助工具,它可以轻松的给您的网页增加眩目的特效,并且可以直接通过网页模板制作基本的网页文件!同时还具有网页加密/压缩等功能。
【作    者】:chenjiwl         chenjiwl@sina.com
【破解平台】:Windows xp
【目    标】:找到爆破点,再打SMC补丁
【难度系数】:★☆☆☆☆(容易) 
【相关工具】:Ollydbg 1.10 Fly修改版,DeDe,aspackdie,Peid

【作者声明】: 主要是想给自己的主页做些特效,所以对它下了手,很容易的,可以做新手的教程。SMC部分系自己乱搞,请多指导!

【详细过程】
        偶的作法一向是以稳健著称,一般不出手,出手必出精!

        废话少说,开工!

        安装程序先!

  打开安装目录,这里偶给大家推荐一个软件(Total Commader),一个很强的文件管理软件。

        一眼看去,不少文件!恩,还有几个DLL文件,先用Peid查一查吧!

  眨眼的功夫已经出来了! 全部都是用ASPack 2.1 加的壳!

       用aspackdie脱了再说!又眨了一下眼,已经搞定。

       再用Peid查脱出来的程序,是Delphi编的程序,可以用上DeDe了。

       ---------------------------------------------------------------------------------
       热身已经完成。

       请看我的标准动作:

       第一步:试一试

           打开软件,界面很漂亮(一定用了SuiPack的控件),下面的状态条显示未注册!:=(,
       随便试几个功能。在打开网页模板时弹出了提示框,上面说了:不给钱,不让用。
       再转到注册窗口,随便输入电邮地址,用户名和注册码,再点确定。没反映?作者
       有一定的反侦察能力!!!

           大大的狡猾,死了死了的有!

       ---------------------------------------------------------------------------------

       第二步:挖一挖
           该用DeDe了,用DeDe将脱壳后的程序载入分析,一分钟就OK了,转到"Forms",
       只有五个窗口,其中有两个是读数据库的窗口,是Delphi自带的,不用管。
           还有三个:Ta_frm_load,Ta_frm_main,Tgetcol
       一个是封面窗口,一个是主窗口,另一个是颜色拾取窗口。
           重点在Ta_frm_main,请转到"Procedures"页面,在左边框中选择frm_main,右边框中
       的过程定义十分清晰(作者的编程风格不错,偶编程序重来没写过一个正式的名称!)。

     作者真是体贴我们啊!!! 秒秒钟,我就找到了注册框中“确定”按钮的过程:

                btn_reg_okClick      00574948(这就是入口地址,在olldbg中有用)

  双击这一项,转到相应的代码,请定位到下面的位置:

---------------------------------------------------------------------------------
       * Reference to object Treginfo
|
005749E0   8B0D00DA4F00           mov     ecx, [$004FDA00]

* Reference to: System.@CopyRecord;
|
005749E6   E8850CE9FF             call    00405670
005749EB   803D3C03580000         cmp     byte ptr [$0058033C], $00   //这里就是比较点
005749F2   746F                   jz      00574A63          //如果注册码不正确就跳走!!!!!!
005749F4   6A02                   push    $02
005749F6   66A1A84A5700           mov     axword ptr [$00574AA8]
005749FC   50                     push    eax
005749FD   6A00                   push    $00
005749FF   8D45C4                 lea     eax, [ebp-$3C]
00574A02   8B0D20035800           mov     ecx, [$00580320]

* Possible String Reference to: '      软件已经成功注册给:'
|
00574A08   BAB44A5700             mov     edx, $00574AB4              //正确就到这里读恭喜的信息了
---------------------------------------------------------------------------------
  OK!很简单,看来只要将上面这个关键跳处理一下就可注册成功了!

    在这里我要停一下,让大家分析一下了!下面这一段代码给我们什么启示?

005749EB   803D3C03580000         cmp     byte ptr [$0058033C], $00   //这里就是比较点
005749F2   746F                   jz      00574A63          //如果注册码不正确就跳走!!!!!!

        想出来了吗?
        我来分析一下吧,很简单,即然在这里有一个比较[0058033C]中的值的指令,
    就一定会有一个指令向[0058033C]中写一个值,不然它比较个屁啊!
        明白了吗!明白了就继续!

       ---------------------------------------------------------------------------------
     第三步:动一动
          用Olldbg将脱壳后的程序载入! 记得上面的分析吗!
          0058033C这个地址是我们的关键。
          点击左下方的内存框,按Ctrl+G,填入0058033C, 转到这个地址,选择第一个数值,再
    点右键,选择“断点”--“硬件访问”--“byte”。(任何指令访问这个地址都会中断下来)
          按F9运行程序

    很快会停在00402B4F:
-------------------------------------------------------------------------------
00402B3F  |> \8D74>lea     esidword ptr ds:[ecx+esi-4]         >>源地址
00402B43  |.  8D7C>lea     edidword ptr ds:[ecx+edi-4]         >>目的地址
00402B47  |.  C1F9>sar     ecx, 2               >>拷贝的个数
00402B4A  |.  78 1>js      short unpacked.00402B5D
00402B4C  |.  FD   std
00402B4D  |.  F3:A>rep     movs dword ptr es:[edi], dword ptr ds:[esi]  >>这里就是在给[0058033C]拷贝数据
00402B4F  |.  89C1 mov     ecxeax                        >>>>>>>>>>>>>>>>>>硬件中断在这里
00402B51  |.  83E1>and     ecx, 3
00402B54  |.  83C6>add     esi, 3
00402B57  |.  83C7>add     edi, 3
00402B5A  |.  F3:A>rep     movs byte ptr es:[edi], byte ptr ds:[esi]
00402B5C  |.  FC   cld
00402B5D  |>  5F   pop     edi                                                       ;  unpacked.004FDA4E
00402B5E  |.  5E   pop     esi                                                       ;  unpacked.004FDA4E
00402B5F  \.  C3   retn
-------------------------------------------------------------------------------
      上面的rep指令就是给[0058033C]这个地方做标记的。但这条指令还只是一个杀手,要找到
  下指令的人。请右下角的堆栈窗:
-------------------------------------------------------------------------------
0012FAF0   004FDA4E   unpacked.004FDA4E
0012FAF4   0012FB4C
0012FAF8   00405785   返回到 unpacked.00405785 来自 <unpacked.@Move> >>>>>>>>>>>就是这个东西了!
-------------------------------------------------------------------------------
      在堆栈窗中第三行上点右键,选择“反汇编中跟随”,CPU代码窗中就转到相应的地址!
-------------------------------------------------------------------------------
00405779   . /7E 0>jle     short unpacked.00405785   >>>>>>>>>>>如果这里跳走了,就不会复制数据!很重要,SMC中会用
0040577B   . |8D14>lea     edxdword ptr ds:[eax+ebx]
0040577E   . |01F0 add     eaxesi
00405780   . |E8 9>call    <unpacked.@Move>              >>>>>>>>>>>这个是调用杀手的代码
00405785   > \5D   pop     ebp                                                       ;  unpacked.004FDA4E
00405786   .  5F   pop     edi                                                       ;  unpacked.004FDA4E
00405787   .  5E   pop     esi                                                       ;  unpacked.004FDA4E
00405788   .  5B   pop     ebx                                                       ;  unpacked.004FDA4E
00405789   .  C3   retn
-------------------------------------------------------------------------------
      再按F9运行,又会被断下来,又是一个类似的代码:
-------------------------------------------------------------------------------
005692BE      803D>cmp     byte ptr ds:[58033C], 0      >>>>比较标志点
005692C5  |.  74 2>je      short unpacked.005692EE      >>>>跳走
-------------------------------------------------------------------------------
      到这里,我想不用再跟了!直接将所有cmp byte ptr ds:[58033C], 0改成
cmp   byte ptr ds:[58033C], 1就可以了。

      试一试再说。
      在CPU代码窗中点选右键“搜索”---“全部命令”
      填入:     cmp byte ptr ds:[58033C], 0
      找出了九处代码,全部改了,不要问我如何改!!!!!
      再将代码另存,也不要问我如何存!!!!!!!!!!!!!!!

      试一试!一切OK了,已经注册了!网页模板也可以用了!

      到现在好像已经完成了吧!如果只是自己用,是已经可以了!可是好东东,一定要给大家分享!
      还得做一个补丁!!
      如果直接提供脱壳后的程序,好像太大了。只能用SMC补丁了。继续吧!!!

       ---------------------------------------------------------------------------------
      第四步:改一改
      SMC是做什么?说白了,我们要在未脱壳的程序上下手,在程序解压完成之后,没跳到OEP之前,
      对程序打好所有的补丁。
      整个流程是这样的:
                 1、找到一个适当的切入点
                 2、找一个空白的位置,以填入补丁代码
                 3、直接给[58033C]这个标志点填入1
                 4、同时要禁止向[58033C]填数据(就是要将jle   short unpacked.00405785改成jmp short unpacked.00405785)
      当这四项任务完成以后,程序的补丁就打好了!
      让我们开始:
                 1、找到一个适当的切入点
              Aspack的壳很好脱,切入点也很好找,一个简单的办法,按ctrl+f,输入popad,
      转到这里:
-------------------------------------------------------------------------------------------
005E44F3   .  61   popad                                       //转到这里
005E44F4   .  75 0>jnz     short webshow5.005E44FE             //这里就是一个很好的切入点*********************
005E44F6   .  B8 0>mov     eax, 1
005E44FB   .  C2 0>retn    0C
005E44FE   >  68 0>push    0              //SMC处理后,回到这里
005E4503   .  C3   retn                                       //转到OEP处
-------------------------------------------------------------------------------------------
                 2、找一个空白的位置,填入补丁代码
             不能随便找一个空白位置的,一个很容易的办法,在代码窗口点右键:
      “复制到可执行文件”--“选择部分”,在弹出的窗口中,转到最后的部分,有一堆空白的位置,
       选择一个位置吧,我选择了0009BFC1(文件偏移地址),先记下来!在这个位置点右键,选择“在反
       汇编中查看镜像”就转到CPU窗口中对应的位置{{记好这个地址(逻辑地址)}}了,

                 3、直接给[58033C]这个标志点填入1
                按空格键,进行汇编,改成:

005E65C1    C605 3>mov     byte ptr ds:[58033C], 1                  >>>这里给标志点置1

                 4、同时要禁止向[58033C]填数据(就是要将jle   short unpacked.00405785改成jmp short unpacked.00405785)
                再按空格键,继续汇编,改成:

005E65C8    C605 7>mov     byte ptr ds:[405779], 0EB      >>>>>将jle改成jmp (机器码7E改为EB)

                处理完之后返回按空格键,继续汇编,改成:

005E65CF  ^ E9 2AD>jmp     webshow5.005E44FE          >>>SMC完成返回

                切入点的跳转还没有做,再回到005E44F4:
                按空格键,进行汇编,改成:

005E44F4   /E9 C82>jmp     webshow5.005E65C1                       >>>>跳到SMC代码的入口

      OK!OK!到这里,整个补丁流程就完了,很容易吧!保存吧。
      注意了!建议每次修改一块代码后就保存到一个文件中,再打开这个文件,继续修改,不然会丢数据的。
      原因自己看!!!!!!
       
      OK了,请将全部修改过的程序改个名,再用KeyMaker做个补丁吧,送给大家做纪念!


      这里我把我的补丁给大家,大家可以比较一下,修改后的程序与原程序的区别,就可以知道工作流程了。

       ---------------------------------------------------------------------------------
     后记:
         1、在找到关键点后,要分析它的来龙去脉,逆向思考。
         2、SMC补丁是一项很麻烦的工程,要考虑很多方面,比如,节区是否可写等等
         3、冷静,冷静,再冷静!!!!

     注:有一个webshow.pin文件中保存了注册信息,你有功夫可以研究一下如何算注册码!


    
                                         写完时已经 22:30  睡了! 886
  
                                                        chenjiwl