【软件名称】:艾克主页秀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 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、冷静,冷静,再冷静!!!!
注:有一个webshow.pin文件中保存了注册信息,你有功夫可以研究一下如何算注册码!
写完时已经 22:30 睡了! 886
chenjiwl