找回密码
 注册
搜索
热搜: 回贴

脱壳技术,Armadillo资料集锦,Armadillo

2010-1-30 18:18| 发布者: admin| 查看: 85| 评论: 0|原作者: 小可爱


脱壳技术,Armadillo资料集锦,Armadillo
2008年06月23日 星期一 下午 03:35
前段时间,我对Armadillo壳很感兴趣,于是收集了很多资料,想好好研究一番,



这些文章来自很多站点,感谢:看学论坛,白菜乐园,探索杂志……



最近又看到很多Cracker在对付Armadillo时遇到了麻烦,所以拿到新论坛共享



给大家.







*****************



第一章,大虾们的脱壳文章



*****************







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



(1).



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



标 题:手动脱壳的方法. (975字)



发信人:1212



时 间:2000-9-17 22:53:30



详细信息:







噫!我以前贴过Armadillo的脱壳方法,怎麽不能举一反三.



[目标软体]:VB power wrap V1.7



[保护机制]:Armadillo保护,防Soft-ICE,时间限制.



[使用工具]:1.Trw2000



2.Bw2000



3.Procdump32



4.Regmon



[手动脱壳]:1.第一次执行被Armadillo保护的软体,Armadillo会在C:\WINDOWS\TEMP\的目录



下解压一个Armxxxx.tmp的文件,这是保护系统的dll,程式用它Anti-Debugger,设置时间标志



等等,并将所取得的环境资讯写入注册表中,以供程式比对运用,这个Key的路径在



HKLM\Software\The Sillicon Realms Toolworks\Armadillo,故若你的软件试用期已过,你便



需要把这个Key删除,重新获得试用。



2.若你有安装Soft-ICE,须先把它移除,以利作业,首先执行BW2000,按track,再执行vbrap.exe,



首先在BW2000中显示004085BB,等到NagBox出现,按OK後会再出现一个位址0048535 C这是



VBRAP.tmp0的OEP这才是我们要的。



3.用Trw2000载入vbrap.exe,下faults off,再下G 0048535C等到NagBox出现按OK後程式会中断



在0048535C,再下makepe(不是很稳定)或下suspend用Procdump32,选VBRAP.tmp0,dump(full),



改OEP等於0008535C即可脱壳.



C-pen 2000\9\17



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



(2).



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



如何破解由Armadillo 1.8或1.8x保护的程序



程式猎人翻译



工具:



winhex 9.0



w32dasm 8.7 或8.9版本(译者:最好使用8.93 gold版)



不需要其它调试工具或一定不要运行它们。







无论你有无关于这新版本的经验或者没有掌握它,你在这里都可以学习到破解1.8或1.8x



版的知识,你只要认真学习就可以了。







我们要研究的对象是Stay On Pro3.2,如果你没有这个程序,你可以到www.Stayonpro.c



om处查找相应的程序下载。这是一个用于保持网络连接的软件。











在这里我将向大家介绍大部分版本的Armadillo基本保护,而那个软件连接网络的功能对



我们不是很有用的。如果如果你现在空闲没有事情可做的话,就来研究一下Armadillo保护



吧。







开始运行Armadillo保护的程序,通常都会在本地目录下生成一个临时文件(译者:这个



文件在开始时生成,结束时删除),所在目录是程序当前的目录或在一个临时的目录中,这



个文件名为armXXXX.tmp,文件是Armadillo access (security)DLL。当这个文件正在运行



时,就可以被拷贝和汇编。在新的版本中这个文件通常隐藏在user\local seting\temp 目



录中。







由CreateFileA创建的armXXXX.Tmp放在硬盘中并由主程序的LoadLibrary来调用,在Arma



dillo中所有功能好象都是在这里加载到内存中的,以达到提供重要数据的作用。







现在主程序调用解压和解密的函数,在特定的版本中这个函数为GetProgramIinfor,Get



ProgramInfo有检查softice的调试器及其它调试器的功能,这里通常使用以下几个步骤来破



解这个保护的程序。



1 三次调用creatfilea函数,分别使用文件名为"\\.\sice","\\.\ntice" "\\.\sice".(它



是加密的形式)如果它们存在或GetlastError返回值不等于2,则程序标记,将debug旗标设



为true。



2 调用IsDebuggerPresent来检测windows调试器是否存在,对于softice等硬件调试器可以



避开这个功能(译者:这个前后有点错误),如果检测到了,就将debug设true。



3 有的版本,有一个对话框提示用户,如果当前系统中有调试器,就请关闭后重新运行程序



。如果debug的值为true,就出现这个提示窗口。’



4 如果你现在看到“this use a secet key"这通常不是要求一个key,而是删除softice\th



e sililcon的注册键值。当你一步一步跟踪时,程序知道一个debugger在跟踪或程序没有正



确的调用代码出现上述问题。



5 INT3 ,这是最后的保护。在程序中使用一个伪装的中断来阻止程序的运行。有人会说,s



oftice不是不使用INT3,除非你自己设INT3为打开状态吗?错!在softice夸大了这个功能



,而是实际中ebp被设为“BCHK”,不是一个指针,而是实际文本。在softice运行时,它有



一个调用边界检查,对于“BCHK”加载到ebp中断点中(INT3)调用的句柄对softice进行边



界检查,softice不准备放入数据或堆栈也没有准备。为了解决这个保护,你将对IsDebugge



rPresent进行设断,你需要改变这个返回值,它是一个非常好的中断。。按F12从那个函数



返回,再按二次F12跳到原程序中,离开了security(armadillo)DLL,现在按F10(单步)一



段时间,你将达到INT3中断处,ebp初始化后停止,下R ebp=44444444命令,现在就可以按c



trl d退出ice了,这个目标程序就可以运行了。现在将如何去做呢?如果没有windows 或 s



oftice等调试工具,INT3将产生一个无句柄值,如果有则产生一个有值的句柄。







现在你知道了前面所述,你也不再需要任何上面的知识了(译者:下面方法是太高了,不



用使用softice等调试工具)。你能够使用简单的方法来破解Armadillo程序,它不需要确定



由何版本的Armadilo的加密形式,你将知道你的程序是否用1.8-1.8X加密。然而你需要知道



的是这个程序是由Armadilo保护的。其它有用的信息可以使用GetPrivateProFileString来



获得,它的相关方面可以告诉你其信息。想一想,一些程序员付$89.00来使用这个程序,唯



一可以免费的是工作在silicon Realm Toolwork的人员,现在我们就将完全使用它了。







1 不使用任何调试器(包括softice),开始运行保护的程序。你所需要的文件是你运行的



程序文件名。它由数字和“progname.tmpX"组成。如果你在开始运行“StayOnPro.exe"时,



你可以看到在当前目录中“StayOnPro.tmp()"的文件。使用ctrl c and ctrl V来拷贝这个



文件。



2 重命名这个文件为"StayOnPro(undilloed).exe"



3 开始winhex 9.0



4 按ALT F9开始处理内存部分



5 选拔stayonpro.tmp()为主内存



6 到地址0040000H处,通常这个地址是windows的exe文件开始处。如果你看到MZ字样就找到



了正确的首地址了。



7 现在我们要选择一个大的内存块。先从00400000H处开始到004323D6H处,选择这之间的内



存块。我们去除前面显示00字节的块。通常程序在00400600H或00401000处开始运行程序,



代码段通常在00401000H处开始。你将选择那些除了00块以外的所有块。第二个00字节块开



始于00423D7H,因此我们到达004323D6H,有时代码段从原来的00401000H处移到00400600H



处。Armadillo给出的代码标记是X的地方就为代码段开始的地方。



8 按CTRL C,拷贝选择的内存块。



9 选择文件/打开选项后选择打开stayonpro(undilloed).exe文件。



10 将指针放在有4D标记的块上,选择编辑/剪粘板数据/写入选项,出现一个对话框显示写



入的偏移量为0时,按ok。



11 保存文件



12 现在stay on pro 就已经被完全解密了。你可以很轻松的对它进行反汇编和追踪了。



13 你需要一个调试器了吗?不需要,说感谢自己吧。







下面是如何破解出Armadillo 1.80-1.8X本身和Armadillo 1.80-1.8X程序。







1 不使用任何调试器(包括softice),开始保护的程序。你所需要的是你运行的程序文件



名。它由数字和“progname.tmpX"组成。如果你在开始运行“Armadillo.exe"时,你可以看



到在当前目录中“Armadillo.tmp()"的文件。使用ctrl c and ctrl V来拷贝这个文件。



2 重命名这个文件为"Armadillo(undilloed).exe"



3 开始winhex 9.0



4 按ALT F9开始处理内存部分



5 选拔Armadillo.tmp()为主内存



6 到地址0040000H处,通常这个地址是windows的exe文件开始处。如果你看到MZ字样就找到



了正确的首地址了。



7 现在我们要选择一个大的内存块。先从显示4D字样的00400000H处开始到0041894bH处,选



择这之间的内存块。



8 按CTRL C,拷贝选择的内存块



9 选择文件/打开选项后选择打开Armadillo(undilloed).exe文件,



10 将指针放在有4D标记的块上,选择编辑/剪粘板数据/写入选项,出现一个对话框显示写



入的偏移量为0时,按ok。



11 保存文件



12 现在Armadillo 1.8 就已经被完全解密了或者说这个程序已经没有保护了。



13 不幸的运行程序的话将出现错误,为什么吗?程序的头信息已经指向另一个错误的地址



了。我们将如何查找代码位置呢?向下看:



14 现在我们需要w32dasm来攻击它了。



15 反汇编那个前面保存后的Armadillo(undilloed).exe文件。



16现在查找程序开始时的位置。经验告诉我所有windows的程序入口都调用GetCommandLineA



,GetStartupInfoA,GetModuleHandleA,GetVersion和ExitProcess。对于这个程序我们查



找到GetVersion函数。忽略第一个和第二个查找的结果,因为它们仅是import table的映射



,第三个也不是一个正确的,这是一个GetVersionEx,它不是我们要找的。第四个才是正确



的。



17 现在看一下,对于这个函数,我们可以利用一些或所有的功能。这个最象是windows入口



点。



18 下一步将是查找NOP或RET。这个RET的地址为412D3D。这就知道入口值为412D40(译者:



RET为两个字节)。关闭w32dasm。



19 现在就可以处理了。打开winhex,载入armadillo1.8x(unarmed).exe文件。



20 在E0处开始程序头,在108H是入口点(译者:这时是指偏移量)



21 在108H处我们将要写32—bit入口数据。



22 入口点的值为00412d40。减去虚似地址的偏移量就可以得到正确的值。程序在00400000H



处为入口值,因此412d40-400000=12d40。现在就将00012d40替换就可以了。



23 在windows中大的数通常写在后,如:40 2d 01 00。写40H到文件中108H,2D到109H,01



H到10AH处和00H到10BH处。



24 Armadillo 1.8x 或它保护的程序就完全破解了。



25 你需要使用调试器吗?不需要,说谢谢你自己吧。







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



(3).



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



标 题:关于Armadillo 1.8x-2.x的anti-debug&加壳原理初步探讨和脱壳方法 (12千字)



发信人:leo_cyl1



时 间:2002-4-11 12:14:54



详细信息:











目标软件:Wealth-Lab Developer 2.0



目标文件:WealthLab.exe



加壳方式:Armadillo 1.8x-2.x



使用工具:WinDbg或trw2000, peditor, WinHex 10.2 SR-2,m$的win32 sdk文档







URL: http://www.silicmdr.com/downloads/WealthLabSetup.exe



本文作者:leo_cyl







论题中关于Armadillo 外壳的讨论很少,以前hying曾经写过一些,但很少人能理解,现在就







以Wealth-Lab Developer 2.0为例子初步探讨对付Armadillo 外壳的方法。因为我在xp下没装s-ice







,只有WinDbg可用,所以本文兼做WinDbg的简单教学吧,同时为照顾使用trw2000的朋友,我会列出







等价的trw命令。







Armadillo 外壳反跟踪和反dump挺强的,(至少用procdump不行)。当我们运行







WealthLab.exe后,在Program Files\Wealth-Lab Developer 2.0目录下产生WEALTHLAB.TMP0文件。







这是个不能运行的脱壳文件,也是Armadillo 外壳的至命弱点。







(一)对anti-debug的分析







首先WealthLab.exe通过CreateFileA 产生ArmXXXX.tmp 文件(在window的temp目录)并作为







dll载入,Armadillo的一些重要功能在ArmXXXX.tmp中,它的一个主要引出函数是GetProgramInfo,







作用是un-packing 和 un-encrypting ,还有就是检查系统中有无调试器。



用WinDbg载入WealthLab.exe,因为Armadillo采用seh技术改变程序的流程,所以使用以下命







令“sxd *”就是告诉WinDbg捕获异常后不要处理,有原程序处理,对应trw2000的命令是“faults







off”,另外Armadillo 调用IsDebuggerPresent来判断系统中有无调试器,如果用trw2000,当然检







查不到,但用WinDbg时要下断点“bp IsDebuggerPresent”,然后f5执行……中断后来到这里:







kernel32!IsDebuggerPresent:



77e52e92 64a118000000 mov eax,fs:[00000018]



77e52e98 8b4030 mov eax,[eax 0x30]



77e52e9b 0fb64002 movzx eax,byte ptr [eax 0x2]



77e52e9f c3 ret 《==== eax=1表示系统有调试器,所以将eax改为0



(如果用trw2000,忽略这里)







然后f5执行……中断后来到这里:



04064be 33854cfbffff xor eax,[ebp-0x4b4]



004064c4 8be8 mov ebp,eax



004064c6 b804000000 mov eax,0x4



004064cb cc int 3 〈==== seh技术!



004064cc 8b0dbc574100 mov ecx,[image00400000 0x157bc (004157bc)]







看一下seh链“dd fs:0”最后查到地址40a944。下命令“gn 40a944”(trw2000中要用 INT3HERE







OFF命令,并下断点bpx 40a944)来到这里:



0040a944 55 push ebp



0040a945 8bec mov ebp,esp



0040a947 83ec08 sub esp,0x8



0040a94a 53 push ebx



0040a94b 56 push esi



0040a94c 57 push edi



0040a94d 55 push ebp



0040a94e fc cld



……



……







以上代码产生ArmXXXX.tmp,并获得引出函数地址(在此忽略),执行到00406807 时将调用







GetProgramInfo







004067f6 mov dword ptr [ebp-0x134],0x4157dc



00406800 lea ecx,[ebp-0x154]



00406806 push ecx



00406807 call dword ptr [ebp-0x490]{ARM1!GetProgramInfo (1000b0c0)} 〈=进入



0040680d add esp,0x4



00406810 and eax,0xff



00406815 test eax,eax



00406817 jnz image00400000 0x6823 (00406823)







进入ARM1!GetProgramInfo (1000b0c0)后来到这……







1000913c 8065d800 and byte ptr [ebp-0x28],0x0



10009140 8365fc00 and dword ptr [ebp-0x4],0x0



10009144 0f018dbcfdffff sidt [ebp-0x244] 〈==[ebp-0x244]中防入idt表



1000914b 8b85befdffff mov eax,[ebp-0x242]



10009151 83c008 add eax,0x8 〈=== int2 handle的地址



10009154 8b18 mov ebx,[eax]



10009156 83c010 add eax,0x10 〈===int3 handle的地址



10009159 8b00 mov eax,[eax]



1000915b 25ffff0000 and eax,0xffff



10009160 81e3ffff0000 and ebx,0xffff



10009166 2bc3 sub eax,ebx 〈== int2,3 handle的地址相减



10009168 83f81e cmp eax,0x1e



1000916b 7547 jnz ARM1!ReleaseHook 0x3c5b (100091b4)



1000916d 8b8548fcffff mov eax,[ebp-0x3b8]



10009173 050c010000 add eax,0x10c







这是第二个anti-debug代码,判断int2,3 handle地址的距离,正常的话小于0x1e。如果安装了







int3 handle(某些调试器会)的话,大于0x1e。奇怪的是WinDbg不能走完这段代码,在1000914b







处异常(trw2000就可以)。所以在10009144 处,我把eip改到10009168,并改eax小于0x1e。







f5继续执行,其间在kernel32!IsDebuggerPresent又会中断一次,将返回值改为0;来到这里:







1000b82e push ebx



1000b82f push 0x3



1000b831 push ebx



1000b832 push eax



1000b833 call ARM1!GetProgramInfo 0x8c8 (1000b988)



1000b838 pop ecx



1000b839 push eax



1000b83a call dword ptr [10013048]{kernel32!CreateFileA (77e5a837)}



1000b840 cmp eax,0xffffffff



1000b843 jz ARM1!GetProgramInfo 0x78e (1000b84e)



1000b845 push eax



1000b846 call dword ptr [ARM1!NukeNow 0x6da1 (10013044)]



1000b84c jmp ARM1!GetProgramInfo 0x799 (1000b859)



1000b84e call dword ptr [10013060]{ntdll!RtlGetLastWin32Error}



1000b854 cmp eax,0x2



1000b857 jz ARM1!GetProgramInfo 0x79d (1000b85d)



1000b859 mov byte ptr [ebp-0x1],0x1







eax为"\\.\SICE", "\\.\NTICE", 和 "\\.\SIWDEBUG" ,哈哈,检测s-ice!如果它们存在或







RtlGetLastWin32Error(win98是GetLastError )不等于2,将设立DEBUG 标志。注意这里重复3次















以上是anti-debug的分析,对付它的方法大家都知道了吧! :)







(二)脱壳







WealthLab.exe运行后,在工作目录下产生WEALTHLAB.TMP0文件。这是个不能运行的脱壳文件







。把改名为WEAL-NUPACK.exe。用peditor查看,OEP是4086fc。用WinHex 10.2打开,发现从0x400到







0x40400共256k的内容被添入0x58,即 pop eax的机器码。只要找回这部分代码就是完整的脱壳文件







了。但不能用procdump,系统会崩溃,幸好WinHex提供了类似功能。先用peditor的FLC计算器计算







0x400和0x40400的虚拟地址,分别是0x401000,0x441000。



WealthLab.exe运行后,在运行WinHex ,按ALT F9 开始内存编辑,选WEALTHLAB.TMP0进程,







来到偏移0x401000初,选0x401000到0x441000(共256k)的一块内存,复制下来,并把它粘贴到







WEAL-NUPACK.exe对应的地方(0x400到0x40400共256k)。



到此已经把加壳文件还原了,但还是不能运行!why?呵呵……因为OEP不对嘛!







(三)找OEP



前面两步还挺容易,找OEP却把我难住了,足足花了3个小时才找到。因为外壳和原程序在两个







不同的进程中,地址空间不一样,debug起来有困难,幸好我们知道是外壳产生了原程序的进程,所







以断点CreateProcessA是关键!



从新载入WealthLab.exe,躲过anti-debug,继续从第一步描述的地址开始,下断点“bp







CreateProcessA”,来到这里:







:00408908 6820594100 push 00415920



:0040890D 8D45B8 lea eax, dword ptr [ebp-48]



:00408910 50 push eax



:00408911 6A00 push 00000000



:00408913 6A00 push 00000000



:00408915 6A04 push 00000004



:00408917 6A00 push 00000000



:00408919 6A00 push 00000000



:0040891B 6A00 push 00000000







* Reference To: KERNEL32.GetCommandLineA, Ord:00CAh



|



:0040891D FF15D4004100 Call dword ptr [004100D4]



:00408923 50 push eax



:00408924 8B4D08 mov ecx, dword ptr [ebp 08]



:00408927 51 push ecx







* Reference To: KERNEL32.CreateProcessA, Ord:0044h



|



:00408928 FF1544004100 Call dword ptr [00410044]



:0040892E 85C0 test eax, eax



:00408930 7527 jne 00408959



:00408932 C705E057410009000000 mov dword ptr [004157E0], 00000009







外壳在这里产生WEALTHLAB.TMP0进程,在此前已经把环境变量和命令行参数设定好了。f10执行10多







行来到这里:











* Reference To: KERNEL32.ResumeThread, Ord:022Ch



|



:00406DC1 FF152C004100 Call dword ptr [0041002C]







……



……



……







* Reference To: KERNEL32.GetExitCodeProcess, Ord:010Bh



|



:00406DE2 FF1540004100 Call dword ptr [00410040]



:00406DE8 81BD4CF2FFFF03010000 cmp dword ptr [ebp FFFFF24C], 00000103



:00406DF2 7423 je 00406E17



:00406DF4 C705E05741000A000000 mov dword ptr [004157E0], 0000000A







……



……



……







* Reference To: KERNEL32.Sleep, Ord:0296h



|



:00406E19 FF1558004100 Call dword ptr [00410058]



:00406E1F 8B1524594100 mov edx, dword ptr [00415924]



:00406E25 52 push edx







* Reference To: KERNEL32.SuspendThread, Ord:0298h



|



:00406E26 FF1554014100 Call dword ptr [00410154]



:00406E2C 83F8FF cmp eax, FFFFFFFF



:00406E2F 7530 jne 00406E61







……



……



……







* Reference To: KERNEL32.GetThreadContext, Ord:0167h



|



:00406E6F FF1538004100 Call dword ptr [00410038]



:00406E75 85C0 test eax, eax



:00406E77 7530 jne 00406EA9



:00406E79 C705E05741000A000000 mov dword ptr [004157E0], 0000000A



:00406E83 A124594100 mov eax, dword ptr [00415924]







注意,实际上外壳自身作为调试器来启动WEALTHLAB.TMP0进程,把WEALTHLAB.TMP0进程挂起后调用







GetThreadContext获得线程Context即“线程上下文”,如果不懂的话,请看看有关操作系统原理的







书吧。获得线程Context有什么用呢?等一下有说明……,继续执行:







* Reference To: KERNEL32.ResumeThread, Ord:022Ch



|



:00406ED2 FF152C004100 Call dword ptr [0041002C]



:00406ED8 E9EAFEFFFF jmp 00406DC7







……



……



……







* Reference To: KERNEL32.VirtualProtectEx, Ord:02C4h



|



:00406F08 FF1558014100 Call dword ptr [00410158]



:00406F0E 85C0 test eax, eax



:00406F10 7523 jne 00406F35



:00406F12 C705E05741000A000000 mov dword ptr [004157E0], 0000000A







……



……



……







:00406F35 8D8554F2FFFF lea eax, dword ptr [ebp FFFFF254]



:00406F3B 50 push eax



:00406F3C 6A02 push 00000002



:00406F3E 6894554100 push 00415594



:00406F43 8B0DCC224100 mov ecx, dword ptr [004122CC]



:00406F49 330DD8224100 xor ecx, dword ptr [004122D8]



:00406F4F 330DE0224100 xor ecx, dword ptr [004122E0]



:00406F55 330DF0224100 xor ecx, dword ptr [004122F0]



:00406F5B 51 push ecx



:00406F5C 8B1520594100 mov edx, dword ptr [00415920]



:00406F62 52 push edx







* Reference To: KERNEL32.WriteProcessMemory, Ord:02E9h



|



:00406F63 FF1534004100 Call dword ptr [00410034]



:00406F69 85C0 test eax, eax



:00406F6B 7523 jne 00406F90







看看上面代码,呵呵…… 原来外壳将WEALTHLAB.TMP0进程的部分段(即内容是0x58的那部分)设为







类似不可读写或执行的属性,来触发自己解码。前面说过外壳将作为调试器而WEALTHLAB.TMP0正好







是被调试器!具体可看看hying以前关于Armadillo 外壳的帖子,精华里有。



继续执行:







:00407035 6A64 push 00000064







* Reference To: KERNEL32.Sleep, Ord:0296h



|



:00407037 FF1558004100 Call dword ptr [00410058]



:0040703D 8B0DD4224100 mov ecx, dword ptr [004122D4]



:00407043 330DF8224100 xor ecx, dword ptr [004122F8]



:00407049 330DE0224100 xor ecx, dword ptr [004122E0]



:0040704F 330DF0224100 xor ecx, dword ptr [004122F0]



:00407055 898D18F3FFFF mov dword ptr [ebp FFFFF318], ecx



:0040705B 8D9560F2FFFF lea edx, dword ptr [ebp FFFFF260]



:00407061 52 push edx



:00407062 A124594100 mov eax, dword ptr [00415924]



:00407067 50 push eax







* Reference To: KERNEL32.SetThreadContext, Ord:0283h



|



:00407068 FF158C004100 Call dword ptr [0041008C] 〈==关键啊!!!



:0040706E 85C0 test eax, eax



:00407070 7523 jne 00407095







外壳调用SetThreadContext来改变WEALTHLAB.TMP0进程的eip来达到改变EOP的目的!!!



关于SetThreadContext的说明请看MSDN文档。其中edx是Context指针,edx b8是eip的值;



下命令“dd edx b8"将看到OEP的地址是006a19c4。(有关Context结构请看附录),用peditor将







WEAL-NUPACK.exe的OEP改为006a19c4,到此脱壳完成,脱壳文件完美运行!!







(四)总结



外壳作为调试器来调试加壳程序,并利用类似页异常的处理方式来动态解码,利用调试函数







SetThreadContext来动态改变加壳程序的OEP,达到隐藏OEP的目的。



其实相对来说,Armadillo 比aspr要容易多了,(如果你对window的调试原理有了解的话)如







果再加上类似aspr的花指令和反反复复的seh,来加强反静态分析,应该是个保护很强的外壳。



在命令行键入D 005B60C0看到下面内容



005B60C0 77 21 EE 00 A9 48 EE 00 0E BB EF 00 C6 82 EE 00



005B60D0 B6 B8 EF 00 53 07 EE 00 41 07 EE 00 17 0E EE 00



005B60E0 99 8B EE 00 6F A9 F2 00 EA 77 F0 00 1B CD FA 00



005B60F0 3C EA F3 00 7C C3 F2 00 74 73 F4 00 9E 22 F3 00



005B6100 D2 DC F3 00 5A A2 F1 00 F8 BA F3 00 4B E4 FA 00



005B6110 C3 EA EF 00 44 30 F4 00 14 C5 F2 00 F5 D9 F3 00



005B6120 58 ED EF 00 E0 86 EE 00 60 85 EE 00 F6 49 EE 00



005B6130 19 86 EE 00 F3 A4 F2 00 8D 49 EE 00







注意看看005B6110开始的4个字节内容 C3 EA EF 00,即调用程序入口地址为00efeac3。



我们在ollydbg中再选择OLE32.DLL模块,看到的地址,对比一下发现果然有问题。


最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 23:24 , Processed in 0.187464 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部