脱壳基础知识入门现在加解密发展己形成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操作系统的一种系统机制,与特定的程序设计语言无关。
外壳程序里大量地使用了SEH,如果不了解SEH,将会使你跟踪十分困难。
SEH in ASM研究(一)by humeSEH in ASM研究(二)by humeStructured Exception Handling加密与解密二版菜鸟学习笔记(2)-SEH结构化异常处理by ytcswb由于Ollydbg对SEH处理异常灵活,因此脱壳用Ollydbg会大大提高效率。
附CONTEXT结构环境:代码:typedef struct_CONTEXT{/*000*/DWORD ContextFlags;/*004*/DWORD Dr0;/*008*/DWORD Dr1;/*00C*/DWORD Dr2;/*010*/DWORD Dr3;/*014*/DWORD Dr6;/*018*/DWORD Dr7;/*01C*/FLOATING_SAVE_AREA FloatSave;/*08C*/DWORD SegGs;/*090*/DWORD SegFs;/*094*/DWORD SegEs;/*098*/DWORD SegDs;/*09C*/DWORD Edi;/*0A0*/DWORD Esi;/*0A4*/DWORD Ebx;/*0A8*/DWORD Edx;/*0AC*/DWORD Ecx;/*0B0*/DWORD Eax;/*0B4*/DWORD Ebp;/*0B8*/DWORD Eip;/*0BC*/DWORD SegCs;/*0C0*/DWORD EFlags;/*0C4*/DWORD Esp;/*0C8*/DWORD SegSs;/*0CC*/BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];/*2CC*/}CONTEXT;第三课认识壳1.什么是壳?在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。
它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。
由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳”了。
推荐文档:一切从“壳”开始描述壳的示意图:2.壳的加载过程这里谈的加壳工具不是WinZIP、WinRAR等数据压缩工具,而是谈压缩可执行文件EXE或DLL的工具。
加壳过的EXE文件是可执行文件,它可以同正常的EXE文件一样执行。
用户执行的实际上是外壳程序,这个外壳程序负责把用户原来的程序在内存中解压缩,并把控制权交还给解开后的真正程序,这一切工作都是在内存中运行的,整个过程对用户是透明的。
壳和病毒在某些方面比较类似,都需要比原程序代码更早的获得控制权。
壳修改了原程序的执行文件的组织结构,从而能够比原程序的代码提前获得控制权,并且不会影响原程序的正常运行。
这里简单说说一般壳的装载过程。
(参考了Ljtt以前写过的一篇文章)1)获取壳自己所需要使用的API地址如果用PE编辑工具查看加壳后的文件,会发现未加壳的文件和加壳后的文件的输入表不一样,加壳后的输入表一般所引入的DLL和API函数很少,甚至只有Kernel32.dll以及GetProcAddress这个API函数。
壳实际上还需要其他的API函数来完成它的工作,为了隐藏这些API,它一般只在壳的代码中用显式链接方式动态加载这些API函数:3个脱壳相关的重要函数介绍2)解密原程序的各个区块(Section)的数据壳出于保护原程序代码和数据的目的,一般都会加密原程序文件的各个区块。
在程序执行时外壳将会对这些区块数据解密,以让程序能正常运行。
壳一般按区块加密的,那么在解密时也按区块解密,并且把解密的区块数据按照区块的定义放在合适的内存位置。
如果加壳时用到了压缩技术,那么在解密之前还有一道工序,当然是解压缩。
这也是一些壳的特色之一,比如说原来的程序文件未加壳时1~2M大小,加壳后反而只有几百K。
3)重定位文件执行时将被映像到指定内存地址中,这个初始内存地址称为基地址(ImageBase)。
当然这只是程序文件中声明的,程序运行时能够保证系统一定满足其要求吗?对于EXE的程序文件来说,Windows系统会尽量满足。
例如某EXE文件的基地址为0x400000,而运行时Windows 系统提供给程序的基地址也同样是0x400000。
在这种情况下就不需要进行地址“重定位”了。
由于不需要对EXE 文件进行“重定位”,所以加壳软件把原程序文件中用于保存重定位信息的区块干脆也删除了,这样使得加壳后的文件更加小巧。
有些工具提供“Wipe Reloc”的功能,其实就是这个作用。
不过对于DLL的动态链接库文件来说,Windows系统没有办法保证每一次DLL运行时提供相同的基地址。
这样“重定位”就很重要了,此时壳中也需要提供进行“重定位”的代码,否则原程序中的代码是无法正常运行起来的。
从这点来说,加壳的DLL比加壳的EXE更难修正。
4)HOOK-API程序文件中的输入表的作用是让Windows系统在程序运行时提供API的实际地址给程序使用。
在程序的第一行代码执行之前,Windows系统就完成了这个工作。
壳一般都修改了原程序文件的输入表,然后自己模仿Windows系统的工作来填充输入表中相关的数据。
在填充过程中,外壳就可填充HOOK-API的代码的地址,这样就可间接地获得程序的控制权。
5)跳转到程序原入口点(OEP)从这个时候起壳就把控制权交还给原程序了,一般的壳在这里会有明显的一个“分界线”。
但现在的猛壳己没这界限了,壳里有肉,肉里有壳。
3.压缩引擎各类加壳软件,其压缩算法一般不是自己实现的,大多是调用其他的压缩引擎。
目前压缩引擎种类比较多,不同的压缩引擎有不同特点,如一些对图像压缩效果好,一些对数据压缩效果好。
而加壳软件选择压缩引擎有一个特点,在保证压缩比的条件下,压缩速度慢些关系不是太大,但解压速度一定要快,这样加了壳的EXE文件运行起来速度才不会受太大的影响。
例如下面几个压缩引擎就能满足这要求:1.aPLib压缩引擎/,这个库对于低于64K的文件压缩效果较好,速度较快。
2.JCALG1压缩引擎,相对于aPlib,JCALG1对于大文件效果好些。
3.LZMA压缩引擎/zh-cn/sdk.html,LZMA是7-Zip程序中7z格式的默认压缩算法,压缩率很高。
第四课常见压缩壳与加密壳加壳软件按照其加壳目的和作用,可分为两类:一是压缩(Packers),二是保护(Protectors)。
压缩这类壳主要目的是减小程序体积,如ASPacK、UPX和PECompact等。
另一类是保护程序,用上了各种反跟踪技术保护程序不被调试、脱壳等,其加壳后的体积大小不是其考虑的主要因素,如ASProtect、Armadillo、EXECryptor 等。
随着加壳技术的发展,这两类软件之间的界线越来越模糊,很多加壳软件除具有较强的压缩性能,同时也有了较强的保护性能。
1.ASPacK主页:/ASPack是款Win32可执行文件压缩软件,可压缩Windows32位可执行文件(.exe)以及库文件(.dll、.ocx),文件压缩比率高达40%~70%。
2.UPX主页:/UPX是一个以命令行方式操作的可执行文件经典免费压缩程序,压缩算法自己实现,速度极快,压缩比极高。
(开源)3.PECompact主页:/PECompact同样也是一款能压缩可执行文件的工具(支持EXE、DLL、SCR、OCX等文件)。
相比同类软件,PECompact 提供了多种压缩项目的选择,用户可以根据需要确定哪些内部资源需要压缩处理。
同时,该软件还提供了加解密的插件接口功能。
4.ASProtect主页:/ASProtect是一款非常强大的Windows32位保护工具,这4、5年来,其一直在更新进步。
其开发者是俄国人Alexey Solodovnikov。
它拥有压缩、加密、反跟踪代码、反-反汇编代码、CRC校验和花指令等保护措施。
它使用Blowfish、Twofish、TEA等强劲的加密算法,还用RSA1024作为注册密钥生成器。
它还通过API钩子(API hooks,包括Import hooks(GPA hook)和Export hooks)与加壳的程序进行通信。
甚至用到了多态变形引擎(Polymorphic Engine)。
反Apihook代码(Anti-Apihook Code)和BPE32的多态变形引擎(BPE32的Polymorphic Engine)。
并且ASProtect为软件开发人员提供SDK,实现加密程序内外结合。
更多与壳有关的描述参考:纵横间谁能相抗—论壳与加壳技术作者:forgot常见加密壳官方站点ASProtect /ACProtect /Armadillo /srt-news.shtmlEXECryptor /cgi-bin/anon-www.cgi//Obsidium http://www.obsidium.de/PESpin http://pespin.w.interia.pl/VMProtect http://www.polytech.ural.ru/Xtreme-Protector /xprotector/Themida/WinLicense /downloads.php第五课文件类型分析拿到一个壳,第一步就是用相关工具分析一下是什么壳,然后就可心中有数地跟踪分析。