好友
阅读权限40
听众
最后登录1970-1-1
|
【文章标题】 简单的SMC带壳补丁(QQ农场小帮手去广告)
【作者名称】 llpplplp
【电子邮箱】 6285688@qq.com
【软件名称】 QQ农场小帮手v1.31版
【软件简介】 偷菜的= =!
【下载地址】 http://bbs.nn47.com/qqfarm/QQ农场小帮手1.31.rar
【加壳方式】 ASPack 2.12
【使用工具】 PEID,OD,LORDPE
【破解平台】 Win9x/NT/2000/XP
【破解声明】 纯粹游戏,大侠们不要见笑哈
【版权声明】 欢迎大家自由转载,但是请保持文章的完整性并注明出处
【破解内容】------------------------------------------------------
本文只是探讨一下简单的带壳补丁,如果您只是想去广告,当然可以选择脱壳后直接打补丁更方便快捷。再就是试试Peace2008的破文生成器,这么好的工具都出来了,不用用怎么行呢^ ^,文章比较简单,大家别笑话哈~~
首先用PEID查壳为ASPack 2.12的壳,OD加载程序,用ESP定律先走到程序OEP,ESP定律我就不说了哈~
00406EFC 68 D4C44000 push 0040C4D4 ; OEP
00406F01 E8 F0FFFFFF call 00406EF6 ; jmp 到 msvbvm60.ThunRTMain
00406F06 0000 add byte ptr [eax], al
00406F08 48 dec eax
00406F09 0000 add byte ptr [eax], al
00406F0B 0030 add byte ptr [eax], dh
程序是VB编写,我们用Ultra String Reference插件查找一下unicode字符串,看看能不能找到它的广告地址,我们可以看到
Ultra String Reference, 条目 74
Address=00437F57
Disassembly=mov dword ptr [ebp-90], 0041C410
Text String=http://nn47.com/ad/ad.htm
Ultra String Reference, 条目 169
Address=00451233
Disassembly=mov eax, 0041DCB0
Text String=http://bbs.rcqn.net/ad/xl.htm
程序是调用了存放于0041c410的http://nn47.com/ad/ad.htm广告地址和存放于0041DCB0的http://bbs.rcqn.net/ad/xl.htm广告地址,我们需要把他填充00以去掉广告,很多人填充掉后发现还是有广告弹出,那是因为程序初始化的时候还会生成广告地址,我们先让程序运行,再在内存中搜索一下http://bbs.rcqn.net/ad/xl.htm就会发现了
OK,我们在网址上下内存访问断点,看看是哪里调用它,中断后我们向上找跳转跳过它
004C5C09 51 push ecx
004C5C0A FF15 18114000 call dword ptr [401118] ; msvbvm60.__vbaVarTstLt
004C5C10 0FBFD0 movsx edx, ax
004C5C13 85D2 test edx, edx
004C5C15 0F84 DA000000 je 004C5CF5 ; 就是你了,改为jmp直接跳过去
004C5C1B C745 FC 1000000>mov dword ptr [ebp-4], 10
004C5C22 C745 BC C8B0510>mov dword ptr [ebp-44], 0051B0C8
004C5C29 C745 B4 0840000>mov dword ptr [ebp-4C], 4008
004C5C30 B8 10000000 mov eax, 10
004C5C35 E8 D60DF4FF call 00406A10 ; jmp 到 msvbvm60.__vbaChkstk
004C5C3A 8BC4 mov eax, esp
004C5C3C 8B4D B4 mov ecx, dword ptr [ebp-4C]
好了,去广告的地址和跳转我们找到了,下面来看看怎么进行SMC补丁
用OD重新载入程序,因为代码已经被ASPACK压缩了,我们来看看我们要修改的地方在何处被解压,我们来到http://nn47.com/ad/ad.htm的地址0041C410下内存写入断点,运行后断下
00527177 8BB5 52010000 mov esi, dword ptr [ebp+152]
0052717D C1F9 02 sar ecx, 2
00527180 F3:A5 rep movs dword ptr es:[edi], dword p>; 中断在这里
00527182 8BC8 mov ecx, eax
00527184 83E1 03 and ecx, 3
00527187 F3:A4 rep movs byte ptr es:[edi], byte ptr>
00527189 5E pop esi
0052718A 68 00800000 push 8000
0052718F 6A 00 push 0
00527191 FFB5 52010000 push dword ptr [ebp+152]
00527197 FF95 51050000 call dword ptr [ebp+551]
0052719D 83C6 08 add esi, 8
005271A0 833E 00 cmp dword ptr [esi], 0
005271A3 ^ 0F85 1EFFFFFF jnz 005270C7 ; 循环比较区块是否恢复完毕
005271A9 68 00800000 push 8000
005271AE 6A 00 push 0
005271B0 FFB5 56010000 push dword ptr [ebp+156]
005271B6 FF95 51050000 call dword ptr [ebp+551]
005271BC 8B9D 31050000 mov ebx, dword ptr [ebp+531]
005271C2 0BDB or ebx, ebx
我们可以选择在005271A9处进行补丁,因为这时候区块已经全部解压完毕,但005271A9的代码是动态生成的,如果在这里补丁,我们还要确定005271A9处的代码是在何处被解压的,因此我们选择到下面来补丁
005273A9 8985 A8030000 mov dword ptr [ebp+3A8], eax
005273AF 61 popad ; 根据堆栈平衡原理,我们知道在这里壳代码已经执行完毕
005273B0 75 08 jnz short 005273BA ; 跳到程序OEP
005273B2 B8 01000000 mov eax, 1
005273B7 C2 0C00 retn 0C
005273BA 68 FC6E4000 push 00406EFC ; 将动态生成的OEP压栈
005273BF C3 retn
005273C0 8B85 26040000 mov eax, dword ptr [ebp+426]
在这之前我们还要确定一下SMC代码的存放位置,这里要求文件解压后这个位置不能被覆盖或者被调用,我们来用LORDPE查看程序区块
图中.null区块为外壳部分,我们选它尾部的空白部分来存放补丁代码,OD中我们按Alt+M查看.null区块代码,并选择尾部的0052C4CB地址来作为补丁空间,OK,下面我们把
005273B0 jnz 005273BA
改为
005273B0 jmp 0052C4CB
在0052C4CB处写入补丁代码
0052C4CB C605 B0DC4100 0>mov byte ptr [41DCB0], 0
0052C4D2 C605 10C44100 0>mov byte ptr [41C410], 0
0052C4D9 C605 155C4C00 E>mov byte ptr [4C5C15], 0E9
0052C4E0 C605 165C4C00 D>mov byte ptr [4C5C16], 0DB
0052C4E7 C605 175C4C00 0>mov byte ptr [4C5C17], 0
0052C4EE C605 1A5C4C00 9>mov byte ptr [4C5C1A], 90 ; 以上为补丁数据
0052C4F5 ^ 0F85 BFAEFFFF jnz 005273BA
0052C4FB B8 01000000 mov eax, 1
0052C500 ^ E9 B2AEFFFF jmp 005273B7 ; 跳回原地址
OK,将修改后的结果用OD保存到文件,修改完毕,这样就实现了带壳补丁了。 |
|