[
会员中心
] [
发布文章
][
发布软件
] [
中文繁體
]
文章
·
资料
电脑软件
手机软件
网站源码
电脑·手机·网络
学习
话题
娱乐
故事
文化·历史
国学典籍
法律法规
操作系统
网络
办公·文件
音频视频
图形图像
硬件·驱动程序
行业
教学学习
编程
游戏
安卓
苹果
鸿蒙
其他
ASP
ASP.NET
JSP
PHP
HTML
·
CSS
·
JavaScript
本 站 搜 索
文章
软件
[选项]
文章类别:
[全部]
电脑·手机·网络
话题
故事
文化·历史
娱乐
学习
法律·法规
国学典籍
搜索选项:
文章编号
文章标题
文章作者
文章来源
相关链接
关键字词
文章标签
文章内容
软件类别:
[全部]
操作系统
网络
办公·文件
音频视频
图形图像
行业
编程
教学学习
游戏
硬件·驱动程序
安卓系统
苹果系统
鸿蒙系统
其他系统
HTML·CSS·JavaScript
ASP
JSP
PHP
ASP.NET
搜索选项:
软件编号
软件名称
软件作者
软件来源
相关链接
关键字词
软件标签
软件简介
发 送 文 章
Armadillo3.60 加壳的EXE文件脱壳全过程
〖
评论()
〗〖
留言
〗〖
收藏
〗
收信地址
填写收信人的电子邮箱
邮件主题
填写邮件主题
邮件内容
【目标软件】WINME下的记事本【加壳方式】Armadillo3.60CopyMem-ll+Debug-Blocker【调试环境】:WinXP、Ollydbg、PEiD、LordPE、ImportREC1.6F1.前言为了练习脱壳,前一段时间从网上下了一个Armadillo3.60,然后给记事本加壳,当然本人初学破解,参考了很多大虾们的文章,然后自己模仿脱壳,可是当我修改了MagicJump后,用401000段“内存断点”大法想到达那个盼望已久的OEP的时候,意外出现了:程序终止,退出!是我做法错误,然后我又实验了N遍,依然如此,为什么?随后又在论坛不停的搜索着,想找一些有关的知识,终于找到了(抱歉,忘记了作者是谁),而且解决了这个问题,为了使象我一样初学者不要重蹈覆辙,我决定详细的写一写,也许你认为很简单,那么请略过。2.脱壳过程(分以下几步进行)设置Ollydbg忽略所有的异常选项,用IsDebug1.4插件去掉Ollydbg的调试器标志。(1)查找OEP用OD中载入程序,下bpWaitForDebugEvent,F9运行,中断如下:77E93A07k55pushebp====中断在此处,清除断点77E93A088BECmovebp,esp77E93A0A83EC68subesp,6877E93A0D56pushesi77E93A0EFF750Cpushdwordptrss:[ebp+C]查看堆栈窗口:0012DAC000423D67/CALL到WaitForDebugEvent来自NOTEPAD.00423D610012DAC40012EB84|pDebugEvent=0012EB84====注意这里0012DAC8000003E8\Timeout=1000.ms在0012EB84所在的行上点击右键选“转存中跟随”。然后再下bpWriteProcessMemory,F9运行77E41A90k55pushebp====中断在此处77E41A918BECmovebp,esp77E41A9351pushecx77E41A9451pushecx77E41A958B450Cmoveax,dwordptrss:[ebp+C]看数据转存窗口:0012EB840100000040070000...@..0012EB8C5C01000001000080\....€0012EB940000000000000000........0012EB9CCC10400002000000?@....0012EBA400000000CC104000....?@.0012EBACCC10400000000000?@.....红色字体的4010CC就是OEP,这样我们接着来第2步(2)dump文件现在我们重新用OD中载入程序,下硬件断点,heWaitForDebugEvent,F9运行,中断如下:77E93A07k55pushebp====中断在此处,删除断点77E93A088BECmovebp,esp77E93A0A83EC68subesp,6877E93A0D56pushesi77E93A0EFF750Cpushdwordptrss:[ebp+C]Alt+F9返回,搜索常数FFFFFFF8,来到(004243D6处):0042438A\83BDD0F5FFFFcmpdwordptrss:[ebp-A30],0====参考文章里提到的关键代码00424391.0F8CA9020000jlNOTEPAD.00424640====跳转到00424640处,因此在00424640处下断点00424397.8B8DD0F5FFFFmovecx,dwordptrss:[ebp-A30]0042439D.3B0DE4454500cmpecx,dwordptrds:[4545E4]004243A3.0F8D97020000jgeNOTEPAD.00424640004243A9.8B9544F6FFFFmovedx,dwordptrss:[ebp-9BC]004243AF.81E2FF000000andedx,0FF004243B5.85D2testedx,edx004243B7.0F84AD000000jeNOTEPAD.0042446A004243BD.6A00push0004243BF.8BB5D0F5FFFFmovesi,dwordptrss:[ebp-A30]004243C5.C1E604shlesi,4004243C8.8B85D0F5FFFFmoveax,dwordptrss:[ebp-A30]004243CE.2507000080andeax,80000007004243D3.7905jnsshortNOTEPAD.004243DA004243D5.48deceax004243D6.83C8F8oreax,FFFFFFF8=====搜索来到这里,向上看004243D9.40inceax004243DA33C9xorecx,ecx004243DC.8A88802A4500movcl,byteptrds:[eax+452A80]004243E2.8B95D0F5FFFFmovedx,dwordptrss:[ebp-A30]004243E8.81E207000080andedx,80000007004243EE.7905jnsshortNOTEPAD.004243F5004243F0.4Adecedx004243F1.83CAF8oredx,FFFFFFF8004243F4.42incedx004243F533C0xoreax,eax004243F7.8A82812A4500moval,byteptrds:[edx+452A81]004243FD.8B3C8D60E244movedi,dwordptrds:[ecx*4+44E260]00424404.333C8560E244xoredi,dwordptrds:[eax*4+44E260]0042440B.8B8DD0F5FFFFmovecx,dwordptrss:[ebp-A30]00424411.81E107000080andecx,8000000700424417.7905jnsshortNOTEPAD.0042441E00424419.49dececx0042441A.83C9F8orecx,FFFFFFF80042441D.41incecx0042441E33D2xoredx,edx00424420.8A91822A4500movdl,byteptrds:[ecx+452A82]00424426.333C9560E244xoredi,dwordptrds:[edx*4+44E260]0042442D.8B85D0F5FFFFmoveax,dwordptrss:[ebp-A30]00424433.99cdq00424434.B91C000000movecx,1C00424439.F7F9idivecx0042443B.8BCAmovecx,edx0042443D.D3EFshredi,cl0042443F.83E70Fandedi,0F00424442.03F7addesi,edi00424444.8B15D4454500movedx,dwordptrds:[4545D4]0042444A.8D04B2leaeax,dwordptrds:[edx+esi*4]0042444D.50pusheax0042444E.8B8DD0F5FFFFmovecx,dwordptrss:[ebp-A30]00424454.51pushecx00424455.E8FF1F0000callNOTEPAD.004264590042445A.83C40Caddesp,0C0042445D.25FF000000andeax,0FF====从这里开始修改00424462.85C0testeax,eax00424464.0F84D6010000jeNOTEPAD.00424640在0042438A处下硬件执行断点,F9运行到0042438A处,得到ebp-A30=12EB70,这样上述的修改地方修改为:0042445DFF0570EB1200incdwordptrds:[12EB70]0042446390nop00424464^E921FFFFFFjmpNOTEPAD.0042438A把12EB70处置0,去掉所有断点,并在00424640处下断,F9运行,断住。好了,所有代码都强制解压完成。运行LordPE,有2个关于NOTEPAD的进程,选择第2个,即可完全dump出来了。(3)修复IAT表因为Armadillo的壳使得ImportREC的"IATAutoSearch"失效,所以必须确定IAT的RAV以及大小,为此我们用OD载入刚刚DUMP出来的文件,来确定IAT的RAV以及大小,载入之前先修改入口点为10CC,然后载入:004010CCd55pushebp004010CD8BECmovebp,esp004010CF83EC44subesp,44004010D256pushesi004010D3FF15F4734000calldwordptrds:[4073F4]====注意这里004010D98BF0movesi,eax我们可以随便找一个CALL入手确定IAT的RAV以及大小(不妨找看到的第一个CALL)。光标定位到数据转存窗口中,然后Ctrl+G,4073F4,可以看到:004072E4BE7D000000000000緘......004072ECD723DA7746BA3C00?趙F?.004072F4F059DA77CC5EDA77餣趙蘜趙..........(省略若干)004073DC7D15F577909B3C00}鮳悰.004073E40338E5776731E5778鍂g1鍂004073EC3C51E577972DE577Q鍂?鍂004073F4C7C33C00459AE577敲.E氬w====到达这里,由此处向上和向下看004073FC91B23C008DB83C00懖.嵏.0040740450883C00CE8A4777P?.螉Gw..........(省略若干)00407504EC72D177119AD177靣褀氀w0040750C0681D177D33DD177佈w?褀0040751437893C00B32232767?.?2v0040751C39DC33763BC232769?v;?v00407524101D3476D68B32764v謰2v0040752CB7443376701B3276稤3vp2v004075348B883C0000000000媹.....这样IAT的大小是终点-始点=00407530-004072EC=244,RVA=72EC。为什么是这样呢,我们看到很多77XXXXXX之类的,而到了00407534处是8B883C00,为了确定其是否在IAT内,我们可以在OD的CPU窗口内定位光标到401000处,然后Ctrl+B,填入347540,结果搜索不到,而307540能够搜索到,是JMP[407530],因此确定IAT的终点点是407530,用同样的方法可以确定起点点是4072EC。好了,IAT的RAV以及大小确定了,现在就要修复IAT了,用OD再一次载入未脱壳的程序,bpDebugActiveProcess,F9断下。看堆栈窗口:0012DAC400423BDB/CALL到DebugActiveProcess来自NOTEPAD.00423BD50012DAC800000324\ProcessId=324=====子进程句柄0012DACC0012FF2C打开另一个OD附加324这个子进程。然后ALT+F9返回程序:00433999N-EBFEjmpshortNOTEPAD.ModuleEntryPoint====中断在此处,还原代码0043399BECinal,dx0043399C|.6AFFpush-10043399E|.68503C4500pushNOTEPAD.00453C50还原00433999处代码代码,EBFE改为558B,接下来就要按照FLY等大虾们的方法了。在接下来的步骤中前一部分可以参考Fly的《壹次脱壳法——Armadillo双进程标准壳快速脱壳》,我们从MagicJump,避开IAT加密开始,取消以前断点,下断:BPGetModuleHandleA+5,77E59F98/0F8423060000jekernel32.77E5A5C1====中断在此处,注意看堆栈77E59F9E|FF742404pushdwordptrss:[esp+4]77E59FA2|E855080000callkernel32.77E5A7FC77E59FA7|85C0testeax,eax在这里中断若干次,注意堆栈窗口的变化,当出现:......0012BF2000AAC807返回到00AAC807来自kernel32.GetModuleHandleA0012BF2400ABD6C8ASCII"kernel32.dll"0012BF2800ABE67CASCII"VirtualAlloc"0012BF2000AAC824返回到00AAC824来自kernel32.GetModuleHandleA0012BF2400ABD6C8ASCII"kernel32.dll"0012BF2800ABE670ASCII"VirtualFree"0012BC9800A9799B返回到00A9799B来自kernel32.GetModuleHandleA0012BC9C0012BDD4ASCII"kernel32.dll"然后Alt+F9返回,00A97995FF15C480AB00calldwordptrds:[AB80C4];kernel32.GetModuleHandleA00A9799B8B0DE011AC00movecx,dwordptrds:[AC11E0]====返回到这里00A979A189040Emovdwordptrds:[esi+ecx],eax00A979A4A1E011AC00moveax,dwordptrds:[AC11E0]00A979A9393C06cmpdwordptrds:[esi+eax],edi00A979AC7516jnzshort00A979C400A979AE8D85B4FEFFFFleaeax,dwordptrss:[ebp-14C]00A979B450pusheax00A979B5FF15CC80AB00calldwordptrds:[AB80CC];kernel32.LoadLibraryA00A979BB8B0DE011AC00movecx,dwordptrds:[AC11E0]00A979C189040Emovdwordptrds:[esi+ecx],eax00A979C4A1E011AC00moveax,dwordptrds:[AC11E0]00A979C9393C06cmpdwordptrds:[esi+eax],edi00A979CC0F84AD000000je00A97A7F====MagicJump,修改为JMP00A979D233C9xorecx,ecx00A979D48B03moveax,dwordptrds:[ebx]修改了上面的MagicJump后,清除所有断点,Alt+M,在401000上下内存访问断点,F9运行,这次中断到了OEP,然后运行ImportREC,选择324这个进程,OEP填:10CC,RVA:72EC,SIZE:244,然后“GetImports”,再按“ShowInvalid”地址,剪掉修复抓取文件,程序能够正常运行,至此脱壳完毕!第一次用OD脱壳,感觉就是爽,和Softice比起来,感觉OD脱壳很方便
文章网址:
https://dangbai.cn/Article.asp?ID=10000543
填写邮件内容
发信地址
填写发信人的电子邮箱
邮件签名
填写邮件签名
验证码
填写验证码,单击刷新验证码
程序执行中,请稍候...
发送协议
·欢迎使用本站在线文章发送系统。
·不得使用本站在线发送邮件系统发送垃圾邮件、广告邮件。
·如果收信人地址或其服务器出现错误,可能无法成功发送。
·如果有什么问题,或者意见建议,请联系[
网站管理员
]。
当百网
本站使用【啊估文章软件站】网站系统
〖
网站管理员留言簿
〗