欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

浅谈UPX壳

程序员文章站 2022-07-05 22:50:40
文/图 汤力加壳软件可分为两类:一类是压缩,一类是保护。压缩的目的是减少程序体积,如ASPack、UPX、PECompact等。保护是为了防止程序被跟踪和调试,如ASProtect、幻影。壳的...
文/图 汤力
加壳软件可分为两类:一类是压缩,一类是保护。压缩的目的是减少程序体积,如ASPack、UPX、PECompact等。保护是为了防止程序被跟踪和调试,如ASProtect、幻影。壳的存在会让我们找不到程序的真实入口点,从而不能正确的分析反汇编程序,也就对程序起到了一定的保护作用。下面我们一起来认识一下一个程序有壳和没有壳的区别以及带UPX壳的一些特征,同时,我们也可以了解一下PE文件的结构。开始之前我们先准备一下工具,具体包括UPX1.24(Win32 console version)、OllyDbg、LordPE,以及自编的VC++小程序(本例中该程序叫dasmtest.exe,无dll,有一个按钮,按下后弹出一个“hello”对话框)。
这个UPX版本是一个控制台程序,也就是说我们要在DOS或者命令行下使用它。在命令行下将源程序加壳,会看到压缩率、文件格式以及加壳成功的提示,如图1所示。注意UPX命令后面的文件名要带上exe扩展名,不然会报“找不到文件”错误。
浅谈UPX壳
图1
对于没有加壳的源EXE文件,大小是20KB,加壳后是6.5KB。用LordPE查看两个文件的相关内容,如图2和图3所示。通过两图的比较,我们可以看到加壳后重要的变化有:程序的入口点(EntryPoint)和文件块数(NumberOfSections),当然,像文件对齐(FileAlignment)和映像大小(SizeOfImage)也会有改变。
浅谈UPX壳
图2 源EXE
浅谈UPX壳
图3 加壳后EXE
而加壳后程序入口点(EntryPoint)的改变就是这个壳困扰我们的地方。我们点LordPE的Sections按钮,查看两个文件的块信息,如图4和图5所示。可以很清楚的对比出,未加壳的源文件拥有的块名称是一个正常的PE文件所有的块名称(注意,如果发布VC++程序的时候选择的是debug版本,则会有reloc节),加壳后很明显的有UPX的痕迹。UPX将重新组织区块,并且VSize(虚拟尺寸)和Roffset(相对偏移)也显得很完整。

浅谈UPX壳
图4 源EXE
浅谈UPX壳
图5加壳后EXE
我们再来看看用OllyDbg进行调试的信息。如图6所示,源EXE程序于00401700正常的入口点(图2中能查看到的信息)开始被调试,模块在dasmtest中(标题栏显示module dasmtest)。加壳后的程序于004069B0入口(图3中能查看到的信息)开始被调试,模块依然显示在dasmtest中(标题栏显示module dasmtest),显然这不是程序的真正入口处,而是一些迷惑我们的信息,要在加壳后的文件中找到真正的入口,我们得跟踪到如图8所示的地址。在00406B08处的“JMP dasmtest.00401700”才会跳到程序的真正入口,跳进去以后,就和我们没加壳的源程序反汇编代码一样了。
浅谈UPX壳
图6 源EXE
浅谈UPX壳
图7 加壳后EXE
浅谈UPX壳
图8 加壳后EXE
至此,我们可以总结一下UPX壳让程序做了哪些变化:文件大小、程序的入口点、程序区块名称和程序调试信息。
其实,在OllyDbg中要找出UPX加壳文件的程序真正入口地址还是很简单的,在图7中第一句是PUSHAD,这是壳在保护现场环境,那么在OllyDbg中不需要跟踪,只需向下翻屏幕,看到“POPAD,JMP********”,就是真正的入口点了。我们可以在POPAD的下一句按下F2设置断点,让程序一开始就运行到这里,则前面的所有壳的干扰就可以被我们绕过了