首页
社区
课程
招聘
有感于朋友们的鼓励,再送上艾克主页(*)2005 找破点,打SMC补丁(新手教程)
发表于: 2004-12-2 08:17 9004

有感于朋友们的鼓励,再送上艾克主页(*)2005 找破点,打SMC补丁(新手教程)

2004-12-2 08:17
9004

【软件名称】:艾克主页(*)2005  找破点,打SMC补丁(新手教程)
【大    小】:624 KB (638,976 字节)
【下载地址】:自己去找
【软件限制】:功能限制
【软件简介】:艾克主页(*)2005是一款功能强大的网页制作辅助工具,它可以轻松的给您的网页增加眩目的特效,并且可以直接通过网页模板制作基本的网页文件!同时还具有网页加密/压缩等功能。
【作    者】:chenjiwl         [email]chenjiwl@sina.com[/email]
【破解平台】: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     ax, word 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     esi, dword ptr ds:[ecx+esi-4]               >>源地址
00402B43  |.  8D7C>lea     edi, dword 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     ecx, eax                        >>>>>>>>>>>>>>>>>>硬件中断在这里
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     edx, dword ptr ds:[eax+ebx]
0040577E   . |01F0 add     eax, esi
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、冷静,冷静,再冷静!!!1

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

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

                                                    [email]chenjiwl@sina.com[/email]

附件:webshow5_ccww.rar


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (20)
雪    币: 187
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
超强,学习ing...:D
2004-12-2 08:38
0
雪    币: 41
活跃值: (198)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
真是好文章,又学一招,哈。

有点不明:
mov     byte ptr ds:[405779], 0EB  
这样也行?
代码区的内存属性好象是不可写的吧
2004-12-2 08:51
0
雪    币: 227
活跃值: (241)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
在Windows环境下是平坦内存cs,ds都是一个地址,
一般加壳的程序,其代码区段都是可写的
2004-12-2 08:55
0
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
5
精彩,收藏吧
2004-12-2 09:42
0
雪    币: 41
活跃值: (198)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最初由 vipchenji 发布
在Windows环境下是平坦内存cs,ds都是一个地址,
一般加壳的程序,其代码区段都是可写的


也就是说代码区的属性也可以是RW的,对吧
由于加壳过了,所以其代码区的属性事先已经被改成RW,所以这里不需要调用VirtualProtectEx

是不是这样呢?
2004-12-2 11:08
0
雪    币: 97697
活跃值: (200744)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
支持!!!
2004-12-2 16:39
0
雪    币: 227
活跃值: (241)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
8
最初由 sqhua 发布


也就是说代码区的属性也可以是RW的,对吧
由于加壳过了,所以其代码区的属性事先已经被改成RW,所以这里不需要调用VirtualProtectEx

........


完全正确啊!!!
2004-12-3 08:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好文,好文学习学习
2004-12-3 09:01
0
雪    币: 690
活跃值: (1826)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
10
用keymaker做内存布丁就可以拉
2004-12-3 09:32
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11
收藏,支持:D
2004-12-3 10:37
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
晕啊好像这的人很小啊
2004-12-3 15:06
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
支持!!!
收藏
2004-12-3 23:31
0
雪    币: 159
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
好,支持!
2004-12-4 21:57
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
好文,适合偶这样的菜鸟~~
2004-12-8 17:12
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我怎么不会啊
2004-12-9 11:14
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
强啊,学习中,给你顶上
2004-12-9 16:00
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
收藏,支持
2004-12-13 14:04
0
雪    币: 239
活跃值: (220)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
19
送你:爆王!称号!哈哈
2004-12-13 16:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
2005-1-16 19:23
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
偶的作法一向是以稳健著称,一般不出手,出手必出精!

建议换点有难度的。 ;)
2005-1-16 20:44
0
游客
登录 | 注册 方可回帖
返回
//