脱UPX的四种方法
- 格式:doc
- 大小:34.00 KB
- 文档页数:4
----------------<小A分>----------------一、概论壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳(强壳)两种"UPX" "ASPCAK" "TELOCK" "PELITE" "NSPACK(北斗)" ... "ARMADILLO" "ASPROTECT" "ACPROTECT" "EPE(王)" "SVKP" ...顾名思义,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。
当然加密壳的保护能力要强得多!-----------<小A分割线>-------------二、工具的认识OllyDBG ring3 shell层级别的动态编译工具、PEid、ImportREC、LordPE、softIce ring0级别调试工具-------------<小A分割>-------------------三、常见手动脱壳方法预备知识1.PUSHAD (入栈/压栈)代表程序的入口点,2.POPAD (弹栈/出栈)代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP/FOEP),只要我们找到程序真正的OEP,就可以立刻脱壳。
------------<小A分割线>--------------------方法一:单步跟踪法1.用OD载入,点“不分析代码!”2.单步向下跟踪F8,实现向下的跳。
也就是说向上的跳不让其实现!(通过F4)3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入7.一般有很大的跳转(大跨段),比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN 的一般很快就会到程序的OEP。
这里脱的是一个UPX的壳:
首先把程序扔到OllyIce里面可以看到:
然后这里尝试使用ESP定理:即在ESP第一次改变时,对ESP的地址设置硬件字访问断点,这样可以在代码被UPX算法还原之后,跳转到程序的正常入口处。
然后F5运行,并没有直接到跳转到程序入口处的大跳位置,但是可以看到UPX的大跳就在眼前= =:
所以被还原后的程序入口点就是0x00445151(通过单步往下走,F4略过往回走的循环语句,也可以看到这个大跳的位置。
P.S.关于UPX壳的原理可以看参考文献链接。
)接下来走到大跳位置,跳到正常程序入口处:
然后去掉硬件断点,并使用LoadPE的dump功能dump目标程序:
先修正映像大小,然后再选择完整脱壳,这样可以得到第一步dump的程序,然后再使用ImportREC修复dump程序的OEP,OEP的信息通过OD自带的dump 功能查询或者直接填45151:
将正确的入口地址(OEP——Original Entry Point)填入ImportREC中,然后自动搜索IAT信息:
然后点击获取输入表得到修正IAT之后的程序函数输入表,然后再点击显示无效函数,愉快地发现没有无效函数,那么就可以直接修复转存文件了。
选择刚刚第一步dump下来的转储文件进行修复,修复完成之后脱壳完成:
相关参考的文章:
/forum.php?mod=viewthread&tid=294773&extra=page%3D1 %26filter%3Ddigest%26digest%3D1
/thread-16381-1-1.html。
upx脱壳方法UPX是一种广泛使用的可执行文件压缩工具,它可以将可执行文件压缩为较小的体积,同时保持其功能和完整性。
然而,一些恶意分析人员和软件破解者可能会使用UPX脱壳方法来绕过防护措施,对恶意软件进行分析或篡改。
在本文中,我们将介绍一些常见的UPX脱壳方法,并提供解决方案以保护可执行文件的安全性。
UPX使用一种称为Pack算法的压缩算法,这使得破解者可以很容易地进行脱壳操作。
以下是一些常见的UPX脱壳方法:1. 使用UPX扩展工具:一些破解者使用特定的UPX扩展工具,如UPXGui或UPXShell,来脱去UPX压缩的可执行文件。
这些工具简化了脱壳过程,使得攻击者能够更快速地解压被保护的可执行文件。
2. 反汇编和调试:使用逆向工程技术,攻击者可以将被压缩的可执行文件通过反汇编和调试操作还原为原始代码。
一旦得到了原始代码,攻击者可以轻松地修改和分析它。
3. 替换UPX头部:攻击者可以通过替换UPX头部来绕过UPX压缩的可执行文件的保护。
UPX头部是一个特殊的标识符,帮助识别文件是否经过UPX压缩。
攻击者可以通过删除或替换UPX头部,从而使可执行文件看起来像是未经过UPX压缩的。
为了保护可执行文件免受UPX脱壳攻击,我们可以采取以下措施:1. 使用反脱壳技术:一些保护工具提供了反脱壳功能,用于检测和阻止UPX脱壳操作。
这些技术能够检测恶意破解工具,并阻止其对文件进行脱壳。
2. 文件完整性校验:通过计算可执行文件的哈希值或使用数字签名技术,可以确保文件的完整性。
任何对文件进行篡改的尝试都会被检测到,并阻止执行。
3. 加密和混淆:使用加密算法和代码混淆技术,可以使恶意分析人员难以直接分析和篡改文件。
加密和混淆能够增加破解者解密的难度和时间成本。
4. 运行时防护:一些安全软件提供了运行时防护功能,可以实时监控和阻止对可执行文件的脱壳和篡改操作。
这些工具可以提高系统的安全性,并保护文件免受UPX脱壳等攻击。
第三十四章-手脱UPX,修复IA T我们在上一章中给大家介绍了IT(导入表),IA T(输入函数地址表)的相关概念以及原理。
有的人可能会认为,我们只是想修复IA T呀,并不需要知道IA T的具体原理以及它是如何被填充的吧?不是有现成的IA T自动修复工具吗?可以很明确的告诉大家,了解操作系统是如何填充IA T的过程非常有必要的。
因为很多壳会检测这些常用的IA T修复工具,致其不能正常运行,在这种情况下,我们就需要自己进行相应的手工修复。
本章我们还是用最简单的CRACKME U PX作为例子,我们将对其进行脱壳以及修复IA T,让其能正常运行。
首先第一步我们来定位OEP,我们用OD加载CRACKME UPX。
这里我们用ESP定律来定位OEP,现在我们停在了入口点处,单击F7键执行PUSHAD。
在ESP寄存器值上面单击鼠标右键选择-Follow in Dump。
就可以在数据窗口中定位到刚刚PUSHAD指令保存到堆栈中的寄存器环境了,我们选中前4个字节,我们通过单击鼠标右键选择Breakpoint-Hardware,on access-Dword给这4个字节设置硬件访问断点。
运行起来,马上就断在了JMP OEP指令处。
我们直接按F7键单步到OEP处。
好了,现在我们处于OEP处,原程序区段已经解密完毕,我们现在可以进行dump了。
前面已经提到过,有很多dump的工具,OD有一个款插件OllyDump的dump效果也不错。
上一章中我们使用LordPE来进行dump 的,这里我们来使用另外一个工具PE TOOLS来进行dump。
我们用PE-TOOLS定位到CRACKME U PX所在的进程。
这里这个crackme.exe就是,因为我忘了把那个重命名的CRACKME UPX放到哪里去了,所以我又重新弄了一个新的,忘了改名字,直接命名为原来的名字crackme.exe了,当前这个crackme.exe进程停在了OEP处。
通达信主程序脱壳全记录(图文)UPX加壳入口第一句是PUSHAD;出口关键字POPAD;手动脱壳时,用Olldbg载入程序,脱壳程序里面会有好多循环。
对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。
第一步,先侦壳,侦壳工具为peid0.92,侦测结果如下:(图000)(图000)原来是UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo加的壳,UPX是一种压缩壳,强度很低。
第二步,我们请出调试利器:Ollydbg1.09,载入程序,出现提示:用F8进行单步跟踪,对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈那就是设置“断点”。
见上图(图004 005 006 007)下走。
(后面碰到类似的情况,处理方法一样。
)一直往下找,直到发现“POPAD”时,在其地址处设置“断点”―――“运行到选定位置F4”,然后继续F8往下走。
(图008 009)下走。
在走几行,就会出现上图画面,“00622838A”55 DB55 CHAR‘U’―――这是通达信主程序代码的真点击右键调出菜单,选择“用OllyDump脱壳调试进程”。
(图012)=========下图为重新载入已脱壳的新文件(图015)==========用“PEID”检测,提示已无壳。
(图016),但该文件还不能正常启动,因为“输入表”尚未修复。
第三步,就是修复程序的输入表。
使用importREC,这是最好用的输入表修复工具。
1、运行加壳的原版TDX主程序,启动importREC程序,(图018)在“附加一个活动进程”中选择“D:\通达信分析家l论坛版本\TDX.EXE”。
2、在“所需的IAT信息”中的“OEP”填入“0022838A”,点击“自动搜索”按钮,出现下图提示:(图019)3、点击“获取输入表”按钮:(图020)4、点击“修复转存文件”按钮,选择前面已完成脱壳的新文件,程序会自动生成一个新的“******_。
upx脱壳方法-回复UPX(Ultimate Packer for eXecutables)是一种广泛使用的可执行文件压缩器和脱壳器。
它采用了先进的压缩算法,能够有效地减小可执行文件的体积,同时保持文件的可执行性。
然而,有时我们需要对UPX压缩过的可执行文件进行脱壳操作,以便进行进一步的分析或修改。
本文将一步一步介绍UPX脱壳的方法。
第一步:准备工作在开始UPX脱壳之前,我们需要先准备一些工具。
首先,我们需要下载并安装IDA Pro。
IDA Pro是一款非常强大的逆向工程软件,可以帮助我们分析和修改可执行文件。
其次,我们还需要下载并安装UPX工具集,以便进行脱壳操作。
最后,我们需要找到一个已经被UPX压缩过的可执行文件,作为我们的实验对象。
第二步:分析可执行文件打开IDA Pro,并导入我们选定的UPX压缩文件。
通过IDA Pro的静态分析功能,我们可以获取有关该文件的一些基本信息,例如文件的入口点地址和函数列表等。
这将有助于我们在后续操作中准确定位需要脱壳的代码。
第三步:寻找脱壳代码在IDA Pro中,我们需要找到UPX的脱壳代码。
UPX脱壳的主要原理是在运行时将压缩过的可执行文件还原为原始的可执行文件。
因此,UPX脱壳代码的位置通常在程序的入口点之后。
我们可以通过在IDA Pro中分析可执行文件的反汇编代码,寻找与UPX脱壳相关的代码段或函数。
这些代码段或函数通常包含有关文件解压缩和内存映射的指令。
第四步:研究脱壳代码找到UPX脱壳代码后,我们需要仔细研究这段代码的逻辑和功能。
通常,UPX脱壳代码会包含一系列指令,用于解压缩数据并将其映射到内存中。
通过对脱壳代码的分析,我们可以了解到UPX是如何解压缩和还原可执行文件的。
第五步:修改脱壳代码在研究了脱壳代码后,我们可以尝试对其进行修改,以实现我们的需求。
可能的修改包括改变解压缩的方式、修改解压缩后的文件内容等。
通过在IDA Pro中编辑脱壳代码,我们可以实现对UPX脱壳过程的定制。
脱壳基础知识入门现在加解密发展己形成2个分支了,一个就是传统的算法,另一个就是加密壳。
越来越多的软件采用了密码学相关算法,现在要做出一个软件注册机己不象前几年那么容易,这就要求解密者必须要有一定的数学功底和密码学知识,而这些在短时间内是不容易掌握的。
除了密码学的应用,越来越多的软件加壳了,因此要求解密者必须掌握一些脱壳技术,这就使得壳成了解密必须迈过的一个门槛。
壳发展到今天,强度越来越高了,将许多人挡在门外,使得大家望壳兴叹。
另外,论坛现在两极分化比较严重,高手讨论的脱壳技术新手看不懂,很多人想学脱壳,但看到壳这么难,只好放弃了,造成新手与高手间一个断档,为了鼓励更多新人加入脱壳的行列,很有必要将壳有关知识总结一下。
主页提供的教学确实有点过时了,己到非更新不可了。
相对于密码学算法,脱壳并不难,只要肯花时间,短期内还是比较容易取得成绩的。
第一课 PE格式要想学脱壳,第一步就得掌握PE格式,PE是Portable Executable File Format(可移植的执行体)简写,它是目前Windows平台上的主流可执行文件格式。
Microsoft Visual C++提供的WINNT.H里有PE数据结构的完整定义。
推荐文档:ah007翻译的“PE文件格式”1.9版qduwg翻译的PE文件格式Iczelion's 的PE文件格式PE结构各字段偏移参考学习PE格式的方法是自己先准备一个十六进制工具,如HexWorkshop,WinHex,用这些工具打开一个EXE文件对照着学。
强烈推荐你用Stud_PE v.2.2.0.5这款工具辅助学习PE格式。
PE格式学习的重点是在输入表(Import Table)这块。
Stud_PE工具界面:PE结构图:第二课 SEH技术结构化异常处理(Structured Exception Handling,SEH)是Windows操作系统处理程序错误或异常的技术。
SEH是Windows操作系统的一种系统机制,与特定的程序设计语言无关。
---------------------------------------------------------------------------------手脱UPX的四种方法首先,查壳,使用PEID是UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo,使用FI 为UPX v1.08接下来用OD载入,提示为“压缩代码是否继续分析”,我们选择否我在这里介绍几种方法,请看我的操作。
方法1:单步跟踪(最常见的方法)0040E8C0 N> 60 pushad //停在这里了,我们F8单步0040E8C1 BE 15B04000 mov esi,NOTEPAD.0040B0150040E8C6 8DBE EB5FFFFF lea edi,dword ptr ds:[esi+FFFF>0040E8CC 57 push edi0040E8CD 83CD FF or ebp,FFFFFFFF0040E8D0 EB 10 jmp short NOTEPAD.0040E8E2 //跳》》》》0040E8E2 8B1E mov ebx,dword ptr ds:[esi] //跳到这里0040E8E4 83EE FC sub esi,-40040E8E7 11DB adc ebx,ebx0040E8E9 ^ 72 ED jb short NOTEPAD.0040E8D8 //这里要往回跳了0040E8EB B8 01000000 mov eax,1 //F4,然后继续F80040E8F0 01DB add ebx,ebx0040E8F2 75 07 jnz short NOTEPAD.0040E8FB //跳》》》》0040E8FB 11C0 adc eax,eax //来到这里,F8继续0040E8FD 01DB add ebx,ebx0040E8FD 01DB add ebx,ebx0040E8FF ^ 73 EF jnb short NOTEPAD.0040E8F00040E901 75 09 jnz short NOTEPAD.0040E90C //跳》》》》0040E90C 31C9 xor ecx,ecx //跳到这里,继续F80040E90E 83E8 03 sub eax,30040E90E 83E8 03 sub eax,30040E911 72 0D jb short NOTEPAD.0040E920 //跳》》》》0040E920 01DB add ebx,ebx //跳到这里,继续F80040E922 75 07 jnz short NOTEPAD.0040E92B //跳》》》0040E92B 11C9 adc ecx,ecx //跳到了这里,继续F80040E92D 01DB add ebx,ebx0040E92F 75 07 jnz short NOTEPAD.0040E938 //跳》》》0040E938 11C9 adc ecx,ecx //跳到这里,继续F80040E93A 75 20 jnz short NOTEPAD.0040E95C //跳》》》》0040E95C 81FD 00F3FFFF cmp ebp,-0D00 //来到这,继续F8 0040E962 83D1 01 adc ecx,10040E965 8D142F lea edx,dword ptr ds:[edi+ebp]0040E968 83FD FC cmp ebp,-40040E96B 76 0F jbe short NOTEPAD.0040E97C0040E96D 8A02 mov al,byte ptr ds:[edx]0040E96F 42 inc edx0040E970 8807 mov byte ptr ds:[edi],al0040E972 47 inc edi0040E973 49 dec ecx0040E974 ^ 75 F7 jnz short NOTEPAD.0040E96D //要往回跳了0040E976 ^ E9 63FFFFFF jmp NOTEPAD.0040E8DE0040E97B 90 nop0040E97C 8B02 mov eax,dword ptr ds:[edx]// F4,继续F8 0040E97E 83C2 04 add edx,40040E981 8907 mov dword ptr ds:[edi],eax0040E983 83C7 04 add edi,40040E986 83E9 04 sub ecx,40040E989 ^ 77 F1 ja short NOTEPAD.0040E97C0040E98B 01CF add edi,ecx0040E98D ^ E9 4CFFFFFF jmp NOTEPAD.0040E8DE //要往回跳了。
0040E992 5E pop esi //这里F4,继续F80040E993 89F7 mov edi,esi0040E995 B9 DD000000 mov ecx,0DD0040E99A 8A07 mov al,byte ptr ds:[edi]0040E99C 47 inc edi0040E99D 2C E8 sub al,0E80040E99F 3C 01 cmp al,10040E9A1 ^ 77 F7 ja short NOTEPAD.0040E99A //要往回跳了0040E9A3 803F 00 cmp byte ptr ds:[edi],0 //这里F4,继续F8 0040E9A6 ^ 75 F2 jnz short NOTEPAD.0040E99A //要往回跳了0040E9A8 8B07 mov eax,dword ptr ds:[edi] // F4,继续F8 0040E9AA 8A5F 04 mov bl,byte ptr ds:[edi+4]0040E9AD 66:C1E8 08 shr ax,80040E9B1 C1C0 10 rol eax,100040E9B4 86C4 xchg ah,al0040E9B6 29F8 sub eax,edi0040E9B8 80EB E8 sub bl,0E80040E9BB 01F0 add eax,esi0040E9BD 8907 mov dword ptr ds:[edi],eax0040E9BF 83C7 05 add edi,50040E9C2 89D8 mov eax,ebx0040E9C4 ^ E2 D9 loopd short NOTEPAD.0040E99F //要往回跳了0040E9C6 8DBE 00C00000 lea edi,dword ptr ds:[esi+C000> //F4继续F8 0040E9CC 8B07 mov eax,dword ptr ds:[edi]0040E9CE 09C0 or eax,eax0040E9D0 74 3C je short NOTEPAD.0040EA0E0040E9D2 8B5F 04 mov ebx,dword ptr ds:[edi+4]0040E9D5 8D8430 14EC00>lea eax,dword ptr ds:[eax+esi+>0040E9DC 01F3 add ebx,esi0040E9DE 50 push eax0040E9DF 83C7 08 add edi,80040E9E2 FF96 A0EC0000 call dword ptr ds:[esi+ECA0]0040E9E8 95 xchg eax,ebp0040E9E9 8A07 mov al,byte ptr ds:[edi]0040E9EB 47 inc edi0040E9EC 08C0 or al,al0040E9EE ^ 74 DC je short NOTEPAD.0040E9CC0040E9F0 89F9 mov ecx,edi0040E9F2 57 push edi0040E9F3 48 dec eax0040E9F4 F2:AE repne scas byte ptr es:[edi]0040E9F6 55 push ebp0040E9F7 FF96 A4EC0000 call dword ptr ds:[esi+ECA4]0040E9FD 09C0 or eax,eax0040E9FF 74 07 je short NOTEPAD.0040EA080040EA01 8903 mov dword ptr ds:[ebx],eax0040EA03 83C3 04 add ebx,40040EA06 ^ EB E1 jmp short NOTEPAD.0040E9E9 //要往回跳了0040EA08 FF96 A8EC0000 call dword ptr ds:[esi+ECA8]0040EA0E 61 popad //这里F4,继续F8 0040EA0F - E9 B826FFFF jmp NOTEPAD.004010CC //在这里直接跳到了OEP 》》》》004010CC 55 push ebp //来到这里,在此dump004010CD 8BEC mov ebp,esp004010CF 83EC 44 sub esp,44其他操作请看动画方法2:ESP定律手动脱壳0040E8C0 N> 60 pushad //停在这里了,我们F8单步0040E8C1 BE 15B04000 mov esi,NOTEPAD.0040B015 //ESP突现,0012FFA4dd 0012FFA4回车,断点--硬件访问--WORD,F9运行,直接来到这里0040EA0F - E9 B826FFFF jmp NOTEPAD.004010CC //来到这单步就到了OEP不详述,和方法一一样了方法3:内存镜像法(由于经过了方法2和方法3大家都熟悉了代码,我在这里就不写了)ALT+M打开内存找到.rsrc,F2下断,F9运行。
ALT+M打开内存找到UPX0,F2下断,F9运行0040EA01 8903 mov dword ptr ds:[ebx],eax//来到这,F8继续0040EA03 83C3 04 add ebx,40040EA06 ^ EB E1 jmp short NOTEPAD.0040E9E90040EA08 FF96 A8EC0000 call dword ptr ds:[esi+ECA8]0040EA0E 61 popad0040EA0F - E9 B826FFFF jmp NOTEPAD.004010CC其他的就不说了~请看动画。