飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2272|回复: 4

[转贴]关于壳的知识

[复制链接]

该用户从未签到

发表于 2006-1-25 03:12:35 | 显示全部楼层 |阅读模式
现在加解密发展己形成2个分支了,一个就是传统的算法,另一个就是加密壳。越来越多的软件采用了密码学相关算法,现在要做出一个软件注册机己不象前几年那么容易,这就要求解密者必须要有一定的数学功底和密码学知识,而这些在短时间内是不容易掌握的。除了密码学的应用,越来越多的软件加壳了,因此要求解密者必须掌握一些脱壳技术,这就使得壳成了解密必须迈过的一个门槛。壳发展到今天,强度越来越高了,将许多人挡在门外,使得大家望壳兴叹。另外,论坛现在两极分化比较严重,高手讨论的脱壳技术新手看不懂,很多人想学脱壳,但看到壳这么难,只好放弃了,造成新手与高手间一个断档,为了鼓励更多新人加入脱壳的行列,很有必要将壳有关知识总结一下。www.pediy.com主页提供的教学确实有点过时了,己到非更新不可了。为此,整理这篇脱壳入门指导的文章,方便脱壳新手们学习。相对于密码学算法,脱壳并不难,只要肯花时间,短期内还是比较容易取得成绩的。   但是,不建议那些加解密刚入门,调试一个普通软件都费劲的朋友来脱壳。至少要等你有一定的调试技能再来学脱壳。也就是说必须掌握这篇文章所讲的东西:新手入门必读(FAQ)       在本篇文章没完成前,不欢迎转载!我会利用业余时间不断更新中,为保持文章连续性,因此锁帖,如学习过程中有问题请开新帖大家一起交流。这篇入门教学将长期置顶,以代替原来脱壳版块的FAQ,收集一些常见的脱壳问题。希望更多的朋友一起参与进来,如果想参与进来请告诉我撰写的主题,我会开通你跟此帖的权限。 注:本人水平有限,因此这篇文章只是负责将新手领进门,更深入技术的请参考论坛中的精华文章。由 kanxue 于 2006-01-15 19:01 最后编辑_____________________________@论坛是大家的,为大家服务的
                                   


         
       
        kanxue kanxue
查看公开的个人资料
给kanxue发送Email
查找kanxue更多帖子
列出kanxue的精华帖
访问kanxue的主页
坛主资 料: 注册日期: Apr 2004来自: 帖子: 1926精华: 2         2楼  2006-01-14,17:22            
第一课 PE格式    要想学脱壳,第一步就得掌握PE格式,PE是Portable Executable File Format(可移植的执行体)简写,它是目前Windows平台上的主流可执行文件格式。Microsoft Visual C++提供的WINNT.H里有PE数据结构的完整定义。推荐文档:  qduwg翻译的PE文件格式     Iczelion's 的PE文件格式  PE结构各字段偏移参考     学习PE格式的方法是自己先准备一个十六进制工具,如HexWorkshop,WinHex,用这些工具打开一个EXE文件对照着学。强烈推荐你用Stud_PE这款工具辅助学习PE格式。PE格式学习的重点是在输入表(Import Table)这块。Stud_PE工具界面: PE结构图:  由 kanxue 于 2006-01-15 18:14 最后编辑_____________________________@论坛是大家的,为大家服务的
                                           


         
               
        kanxue  kanxue
查看公开的个人资料
给kanxue发送Email
查找kanxue更多帖子
列出kanxue的精华帖
访问kanxue的主页
坛主资 料: 注册日期: Apr 2004来自: 帖子: 1926精华: 2         3楼  2006-01-14,17:26            
第二课 SEH技术    结构化异常处理(Structured Exception Handling,SEH)是Windows操作系统处理程序错误或异常的技术。SEH是Windows操作系统的一种系统机制,与特定的程序设计语言无关。   外壳程序里大量地使用了SEH,如果不了解SEH,将会使你跟踪十分困难。  SEH in ASM 研究(一)by hume     SEH in ASM 研究(二)by hume     Structured 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; _____________________________@论坛是大家的,为大家服务的
                                           


         
               
        kanxue  kanxue
查看公开的个人资料
给kanxue发送Email
查找kanxue更多帖子
列出kanxue的精华帖
访问kanxue的主页
坛主资 料: 注册日期: Apr 2004来自: 帖子: 1926精华: 2         4楼  2006-01-14,17:27            
第三课 认识壳 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压缩引擎 http://www.ibsensoftware.com/,这个库对于低于64K的文件压缩效果较好,速度较快。2. JCALG1压缩引擎,相对于aPlib,JCALG1对于大文件效果好些。3. LZMA压缩引擎 http://www.7-zip.org/zh-cn/sdk.html,LZMA 是 7-Zip 程序中 7z 格式 的默认压缩算法,压缩率很高。由 kanxue 于 2006-01-15 10:09 最后编辑_____________________________@论坛是大家的,为大家服务的
                                           


         
               
        kanxue  kanxue
查看公开的个人资料
给kanxue发送Email
查找kanxue更多帖子
列出kanxue的精华帖
访问kanxue的主页
坛主资 料: 注册日期: Apr 2004来自: 帖子: 1926精华: 2         5楼  2006-01-14,17:30            
第四课 常见压缩壳与加密壳     加壳软件按照其加壳目的和作用,可分为两类:一是压缩(Packers),二是保护(Protectors)。压缩这类壳主要目的是减小程序体积,如ASPacK、UPX和PECompact等。另一类是保护程序,用上了各种反跟踪技术保护程序不被调试、脱壳等,其加壳后的体积大小不是其考虑的主要因素,如ASProtect、Armadillo、EXECryptor等。随着加壳技术的发展,这两类软件之间的界线越来越模糊,很多加壳软件除具有较强的压缩性能,同时也有了较强的保护性能。1. ASPacK   主页:http://www.aspack.com/    ASPack是款Win32可执行文件压缩软件,可压缩Windows 32位可执行文件(.exe)以及库文件(.dll、.ocx),文件压缩比率高达40%~70%。  2. UPX主页:http://upx.sourceforge.net/    UPX是一个以命令行方式操作的可执行文件经典免费压缩程序,压缩算法自己实现,速度极快,压缩比极高。(开源)3. PECompact主页:http://www.bitsum.com/   PECompact同样也是一款能压缩可执行文件的工具(支持EXE、DLL、SCR、OCX等文件)。相比同类软件,PECompact提供了多种压缩项目的选择,用户可以根据需要确定哪些内部资源需要压缩处理。同时,该软件还提供了加解密的插件接口功能。  4. ASProtect主页:http://www.aspack.com/    ASProtect是一款非常强大的Windows 32位保护工具,这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           http://www.aspack.com/  ACProtect           http://www.acprotector.com Armadillo           http://www.siliconrealms.com EXECryptor          http://www.strongbit.com/ Obsidium            http://www.obsidium.de/  PESpin              http://pespin.w.interia.pl/  VMProtect           http://www.polytech.ural.ru/  Xtreme-Protector    http://www.oreans.com/xprotector/ Themida/WinLicense  http://www.oreans.com 本站的工具栏目:    http://www.pediy.com/tools/packers.htm 由 kanxue 于 2006-01-15 18:32 最后编辑_____________________________@论坛是大家的,为大家服务的
                                           


         
               
        kanxue  kanxue
查看公开的个人资料
给kanxue发送Email
查找kanxue更多帖子
列出kanxue的精华帖
访问kanxue的主页
坛主资 料: 注册日期: Apr 2004来自: 帖子: 1926精华: 2         6楼  2006-01-15,11:13            
第五课 文件类型分析    拿到一个壳,第一步就是用相关工具分析一下是什么壳,然后就可心中有数地跟踪分析。文件分析工具有PEID,FileInfo等。1.PEiD   PEiD的GUI界面操作非常方便直观。它的原理是利用查特征串搜索来完成识别工作的。各种开发语言都有固定的启动代码部分,利用这点就可识别出是何种语言编编译的。同样,不同的壳也有其特征码,利用这点就可识别是被何种壳所加密。PEiD提供了一个扩展接口文件userdb.txt ,用户可以自定义一些特征码,这样就可识别出新的文件类型。   有些外壳程序为了欺骗PEiD等文件识别软件,会伪造启动代码部分,例如将入口代码改成与Visual C++ 6.0所编程程序入口处类似代码,即可达到欺骗目的。所以,文件识别工具所给出的结果只是个参考,文件是否被加壳处理过,还得跟踪分析程序代码才可得知。 可参考这个文档了解如何伪装:让侦测工具把壳识别为VC++7.0的源代码   。目前Hying的壳PE-Armor伪装能力是最强的:     PEiD分析不出类型的文件就报告是“Nothing found *”,如出现这情况一般都是未知壳或新版的壳。下面PEiD识别出这个软件是用Asprotect 1.2x加的壳。  2.FileInfo   FileInfo(简称Fi)另一款不错的文件检测工具。Fi运行时是DOS界面,在DOS窗口中运行程序相当不便,建议采用下面的技巧:1.用鼠标将文件拖到Fi主文件上。2.将Fi快捷方放进Windows的SendTo文件夹里.以后要分析某文件,只需右击“发送到”功能就可打开Fi。      FileInfo升级慢,其识别库不能自定义。而PEiD升级比较频繁,用户也可自定义特征码,因此PEiD用的比较普遍。   有时,FileInfo和PEID会报“PE Win GUI”,Win GUI就是Windows图形用户界面程序统称,表明程序可能没加壳。但不排除也有加壳的可能性,下图是一个ExeCryptor 2.2x的壳,FileInfo报“*PE Win GUI *section* ??”,其不能识别出来。识别信息中带了个问号,表明FI对给出的结果不是太肯定。 _____________________________@论坛是大家的,为大家服务的
                                           


         
               
        kanxue  kanxue
查看公开的个人资料
给kanxue发送Email
查找kanxue更多帖子
列出kanxue的精华帖
访问kanxue的主页
坛主资 料: 注册日期: Apr 2004来自: 帖子: 1926精华: 2         7楼  2006-01-15,16:22  第六课 寻找OEP           
第六课 寻找OEP     一般的压缩壳,如Aspack等都有专用的脱壳机  。而加密壳(如ASProtect,Armadillo) 一般很少有脱壳机,必须手工脱壳。手工脱壳一般情况是分三步:一是查找程序的真正入口点(OEP);二是抓取内存映像文件;三是输入表重建。(当然现在的加密壳复杂些,要考虑更多的东西)   OEP是Original Entry Point缩写,即程序加壳前的真正的入口点。   外壳初始化的现场环境(各寄存器值)与原程序的现场环境是相同的。加壳程序初始化时保存各寄存器的值,外壳执行完毕,会恢复各寄存器内容。其代码形式一般如下:    PUSHFD         ; 将标志寄存器入栈保存    PUSHAD         ; push eax, ecx, edx, ebx, esp, ebp, esi, edi    ……           ; 外壳代码部分    POPAD          ; pop edi, esi, ebp, esp, ebx, edx, ecx, eax    POPFD          ; 恢复标志寄存器    JMP OEP        ; OEP: ……          ; 解压后的程序原代码   为了讲述方便,本节用UPX加壳的Win98记事本来演示。首先用PEid查看加壳前的记事本:     PEid显示Notepad.exe程序是用Microsoft Visual C++ 6.0编译的,接下来用UPX来加壳,方法是开个DOS窗口,用命令upx notepad.exe。如下图所示:    这时再用PEid查看加壳的文件,PEid会给出如下信息:UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo    UPX的壳可以用UPX.exe自身来脱,命令是:upx -d 文件名 。一些变种的UPX壳用UPX.EXE自身脱不了,这时可以试试UPX ShellEx 这款工具。本节实例下载:notepad.upx.rar    脱壳前建议用PE工具LordPE打开目标文件查看一下区块,以尽可能地多了解一些信息,对脱壳有帮助,如下图:  1.根据跨段指令寻找OEP   推荐用Ollydbg来调试脱壳,比SoftICE和TRW2000方便多了。运行Ollydbg,点击菜单“选项/调试设置”,将第一次暂停设在WinMain函数上。再用Ollydbg打开实例notepad.upx.exe就可中断在外壳的入口点处了:  上图相关代码如下:0040E8C0 >  60              pushad     //一开始Ollydbg就会中断这行,这个就是外壳的入口点,注意这个pushad指令    绝大多数加壳程序在被加密的程序中加上一个或多个段,所以依据跨段的转移指令(JMP)就可找到真正的入口点,此时就会有POPAD/POPFD指令出现。UPX 用了一次跨段的转移指令(JMP),在跳到OEP处会看到虚拟地址的值有一个突变,此时就能确定OEP了。    UPX壳比较简单,大家不必要跟踪去找这个跨段的转移指令,中断WinMain后,只需要在Ollydbg里往下翻屏,就会发现这个跨段转移指令:  上图相关代码如下:0040EA0E    61              popad            //注意这里的popad指令,和开始的pushad对应             0040EA0F  - E9 B826FFFF     jmp     004010CC  //这里跳到OEP,将光标移到这,按F4执行到这行   这一句0040EA0F   jmp  004010CC 就是跳到OEP的指令,执行到这,UPX外壳己将程序解压完毕,并模拟Windows加载器的将原始程序加载到内存,004010CC 就是映射到内存目标程序的入口点,此时就可抓取内存映像文件了。2.根据堆栈平衡原理找OEP   这个堆栈平衡原理网上一些文章也称ESP定律,关于其找OEP原理这篇文档描述的比较详细:寻找真正的入口(OEP)--广义ESP定律 作者:Lenus操作方法:多数壳在运行到OEP的时候ESP=0012FFC4,这就是说程序的第一句是对0012FFC0进行写入操作,只要在0012FFC0下硬件写入断点(命令行里键入HW 12FFC0),我们就能停在OEP的第二句处。   用OllyDBG重新加载实例程序notepad.upx.exe,在命令行下硬件写断点:     按F9执行程序,就会中断在OEP第二行:  此时如果将光标向上移,会发现第一句代码变乱了:004010C7    000D 0A000055  add     [5500000A], cl004010CD    8BEC           mov     ebp, esp这是因为Ollydbg将数据当汇编代码来分析了,你可以按 Ctrl+ALT+向上光标键 将当前显示的代码向上滚动一个字节就可看到正确的汇编代码了:004010CC    55              push    ebp004010CD    8BEC            mov     ebp, esp   //中断在这行004010CF    83EC 44         sub     esp, 44004010D2    56              push    esi004010D3    FF15 E4634000   call    [4063E4]                         ; kernel32.GetCommandLineA中断后,别忘点击菜单“调试/硬件断点/”打开硬件断点面板,将刚才的硬件断点删除。  小知识: 硬件断点的原理 作者:Lenus  3.根据编译语言特点找OEP   各类语言编译的文件入口点都有一些规律,可以这利用这点来寻找入口点。1)Delphi程序执行程序,用LordPE(或Prodump)选dump(full)脱壳,存为dump.exe。接着用Hex Workshop打开dump.exe,搜索文本“runtime”,搜到后,向前查找离“runtime”最近的十六进制数字“55 8B EC”,数字所在的地址就是程序的OEP。2)Visual C程序可以利用Visual C启动部分的几个函数GetCommandLineA(W)、GetVersion、GetModuleHandleA(W)、GetStartupInfoA(W) 等来定位程序的OEP。   常见的各类编译语言的入口汇编代码都要熟悉,因为一些加密强壳会偷OEP处的代码到壳里,一般情况各编译语言入口代码都相同,到时只需要直接引用相关程序的入口代码,这给我们恢复代码带来方便。由 kanxue 于 2006-01-15 19:11 最后编辑_____________________________@论坛是大家的,为大家服务的
                                           


         
               
        kanxue  kanxue
查看公开的个人资料
给kanxue发送Email
查找kanxue更多帖子
列出kanxue的精华帖
访问kanxue的主页
坛主资 料: 注册日期: Apr 2004来自: 帖子: 1926精华: 2         8楼  2006-01-15,19:52  第七课 Dump内存映像           
第七课 Dump内存映像      外壳程序解压还原后就会跳到OEP处执行,此时内存映像文件是己解压的程序。这时就可抓取内存映像文件了(该过程称为Dump)。当然不一定非要在程序原入口点抓取,只要能保证内存映像文件是己还原的就行了。    有关Dump技术的原理大家可以参考:浅谈脱壳中的Dump技术  作者:Lenus     继续上一个实例notepad.upx.exe,到OEP后就可以Dump取内存映像文件:004010CC    55             push    ebp004010CD    8BEC           mov     ebp, esp004010CF    83EC 44        sub     esp, 44   运行LordPE.EXE,点击Options,默认选项如下:    默认选上“Full dump:paste header from disk”,PE头的信息直接从磁盘文件获得。设置好后,在LordPE的进程窗口选择notepad.upx.exe,点击右键,执行“dump full”菜单命令。如图:    将内存抓取的文件另存为dumped.exe,此时程序还不能运行,接下来就是重建输入表。

[ 本帖最后由 Nisy 于 2006-1-25 01:30 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2006-1-25 09:30:31 | 显示全部楼层
我要好好的学习下~
PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 15:01
  • 签到天数: 1479 天

    [LV.10]以坛为家III

    发表于 2006-1-25 19:26:13 | 显示全部楼层
    要好好学习,好好看。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-1-26 18:15:57 | 显示全部楼层
    收下先,慢慢看
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-1-28 08:07:11 | 显示全部楼层
    收藏啦,好东西,谢谢楼住分享!!!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表