程序脱壳教程(exe文件脱壳步骤)

生活百科 2023-04-28 19:21生活百科www.xingbingw.cn

  程序脱壳教程(exe文件脱壳步骤)、本站经过数据分析整理出程序脱壳教程(exe文件脱壳步骤)相关信息,仅供参考!

  大家好,我是周杰伦。

  这里整合了之前自己学习软件的一些笔记和解包,希望能给学习软件反求和解包的童鞋一些帮助。

   1一些概念1.1加壳的全称应该是可执行程序资源的压缩,是保护文件的常用手段。加壳后的程序可以直接运行,不能查看源代码。在查看源代码之前,您必须使用shell。

  脱壳是使用特殊的算法对EXE和DLL文件中的资源进行压缩和加密。效果和WINZIP差不多,只是这个压缩文件可以独立运行,解压过程完全隐藏,全部在内存中完成。它们依附于原程序并通过Windows loader加载到内存中,然后在原程序之前执行以获得控制权。在执行过程中,对原程序进行解密还原,然后将控制权交还给原程序执行原代码部分。加入外壳后,原程序代码一般以加密形式存在于磁盘文件中,执行时才在内存中恢复,可以有效防止破解者非法修改程序文件,也可以防止程序被静态反编译。

  外壳的类型通常分为两类压缩外壳和加密外壳。压缩壳的特点是减少软件的规模,加密保护不是重点。加密外壳有很多种,不同的外壳有不同的侧重点。有些外壳只是简单的保护程序,有些则提供额外的功能,比如提供注册机制、使用次数、时间限制等。

   1.2 oep oep:(原始入口点),程序的入口点。软件加壳一般会隐藏程序的真实OEP(或者用一个假的OEP)。我们需要找到程序的真正OEP才能完成脱壳。

  一般使用Ollydbg等动态调试工具时,sheller会停在shell的预处理块。即在对程序的原代码块进行解压缩或解密之前,运行程序自脱壳模块后,会停留在程序脱壳前的OEP位置,这是转储程序的最佳时机。在脱壳时,可以通过在真正的OEP处放下int3断点来捕获程序代码段的完全还原状态。,找到脱壳程序的正确OEP成为人工脱壳的首要任务。

   1.3 Iatiat:(导入地址表),导入地址表。因为导入函数是由程序调用但其执行代码不在程序中的函数,所以这些函数的代码位于一个或多个dll中。PE文件加载到内存时,Windows loader加载DLL,用函数的实际地址链接调用导入函数的指令(动态连接)。此操作需要通过导入表来完成。导入的地址表是指标函数的实际地址。大部分脱壳机在运行时都会重新构建导入地址表,获取正确的脱壳机导入地址表也是手工脱壳机操作的一个关键问题。

   2部分脱壳方法2.1单步跟踪法单步跟踪法的原理是通过Ollydbg的单步(F8)、单步进入(F7)、运行到(F4)函数完整地走完程序的自脱壳过程,跳过循环恢复代码的一些片段,用单步进入来保证程序不会跳过OEP。这样,软件自动脱壳模块运行后,就可以到达OEP,转储程序。

   2.2 ESP法ESP法是炮击的利器,是最常用的炮击方法之一。

   ESP的原理在于程序中栈平衡的合理使用。在程序自解密或者自解压的过程中,很多shells会先堆栈当前寄存器的内容,比如pushad,解压后再堆栈之前的寄存器值,比如popad。,当寄存器从堆栈中释放出来时,程序代码往往会自动恢复,然后触发硬件断点。然后,在程序的当前位置,只需要几次单步跟踪就可以轻松到达正确的OEP位置。

   2.3内存镜像法(二次断点法)内存镜像法是在shell程序加载时,通过od的ALT M快捷键进入程序的虚拟内存段。然后,通过添加两次内存一次性断点,程序的正确OEP位置是re

  内存镜像法的原理是,当程序资源段和代码段发生断点时,一般程序在自解压或自解密时会先访问资源段获取所需资源,自动脱壳完成后再转回程序代码段。这时,当内存中断一次,程序就会在OEP处停止。

   2.4一步到OEP所谓一步到OEP的脱壳方法,就是根据脱壳的特点,找到最接近OEP的汇编指令,然后在程序到达OEP时,放下int3断点,转储程序。例如,在一些压缩的shells中,popad指令非常接近OEP或Magic Jump。所以使用Ollydbg的搜索功能,可以搜索到外壳的特征汇编代码,达到一步断点到达OEP的效果。

   2.5异常法(last exception method)异常法的原理是程序在自解压或自解密过程中可能会触发无数个异常。如果能定位到程序的一个异常位置,可能离自动脱壳完成位置很近。现在一次异常炮轰可以使用Ollydbg的异常计数器插件,先记录异常次数,然后重新加载,在一次异常时自动停止。

   2.6模拟跟踪法模拟跟踪法的原理是在Ollydbg下使用条件断点。SFX相当于一个自解压段。在自提取段的末尾(当eip的值转移到代码段时),接近OEP,这种跟踪方式会比较耗时。

   2.7“SFX”方法“SFX”方法利用了Ollydbg的OEP搜索功能,可以选择直接在od找到的OEP处停止程序。此时自解压已经完成,可以直接转储程序了。

   3下面给出了一些脱壳的做法。利用以上方法,尝试自己手动摘掉这些常用外壳的脱壳笔记。

   3.1UPX脱壳注意事项,脱壳检测

  ,把程序扔进OllyIce,你可以看到

  然后在这里尝试使用ESP定理即在第一次改变ESP时,为ESP的地址设置硬件字访问断点,使代码经过UPX算法还原后跳转到程序的正常入口。

  然后F5运行,并没有直接跳到程序入口处的大跳位置,可以看到UPX的大跳就在眼前

  所以恢复后的程序的入口点是0x00445151(你也可以通过退下和F4跳过回退的循环语句来看这个大跳转的位置。)接下来到大跳转位置,跳转到正常程序入口

  然后去掉硬件断点,使用LoadPE的dump函数来转储目标程序

  修正图像大小,然后选择完全脱壳,这样就可以得到转储第一步的程序,然后用ImportREC修复转储程序的OEP。OEP的信息可通过OD的转储功能查询或直接填写45151:

  在ImportREC中填写正确的入境地址,然后自动搜索IAT信息

  然后,单击获取输入表以获取IAT校正后的程序函数的输入表,然后单击显示无效函数。你很高兴的发现没有无效的函数,可以直接修复存档的文件。

  选择第一步刚转储的转储文件进行修复,修复后,脱壳完成

  在这里,对于压缩壳UPX,直接使用ESP定律,所以很容易找到OEP和dump程序。

   4.2 tElock外壳注意事项下面是一个tElock外壳

   1.先用最简单的一个异常方法先把程序扔进OllyIce,在OD调试选项里设置异常选项。

  只保留内存非法访问异常,然后使用异常计数器插件。使用前,清除断点设置

  等到程序正常运行,重新加载程序,然后选择第二步在一个异常之前停止

  然后用Alt M转到内存窗口,对主程序代码段下的内存断点执行SHIFT F9:

  这样,程序会在正确的OEP处中断,您可以选择从模块中删除分析,以显示正常分析的组件代码。然后使用LoadPE转储程序,并更正程序映像大小。在使用ImportREC v1.6F Fix版本,输入正确的OEP,获取函数输入表的信息时,会发现无效指针。第一种方法用于修复后,第三种方法可用于完全修复。

  点击修复转储,哟

   2.使用二级内存断点方法加载程序,忽略所有异常类型,然后在idata部分设置内存断点,然后SHIFT F9:

  停止后,在代码段设置内存断点,然后再SHIFT F9,可以直接到达正确的OEP:

  然后LoadPE转储,然后修复IAT。修复方法与方法1相同。

   3.修复函数表完成后寻找magic jump和dump程序前两步是添加内存断点(idata,code),然后定位到程序正确的OEP。

  然后,如果使用LoadPE dump进行后期修复,它将与前两个相同。这里,,使用ImportREC函数获得输入表中第一个位置的指针地址。

  然后,函数指针的偏移地址为0x005512C,加上基址后为0x045512C。此时,硬件在该位置访问双字断点。当SHIFT F9忽略异常执行后,tElock的CRC错误会因为断点而被触发

  所以要绕过CRC校验才能成功执行到硬件断点,所以要先挂起程序,然后用Alt F9返回用户代码。单击OK按钮后,程序暂停在调用ExitProcess的位置

  现在查找可以跳过这个出口的跳转(CRC判断跳转),然后修改跳过

  找到了应该修改的位置,修改后重新运行就会恢复,所以先记下这个跳转的地址,0x00469622。重新运行后,在idata中设置内存断点,SHIFT F9停止后,Ctrl G会找到修改点,然后进行修改。修改后设置之前的硬件断点,不会触发CRC校验错误。

  经过无数次的SHIFT F9后,在寄存器窗口中可以看到指针,并且可以正常显示

  然后F8在这个时候迈步,寻找魔法跳跃点.看萧声的大视频屏幕是通过分析疑似CRC跳转得到Magic Jump的位置

  在这里写下魔跳的地址是0x0046973B,然后清除udd文件,删除硬件断点,重新运行程序,然后停在idata下的内存断点,然后Ctrl G找到魔跳位置,修改跳转

  然后是代码段下的内存断点

  然后执行SHIFT F9,当它停止时,到达OEP的位置

  此时转储程序,IAT表已经修复,可以直接得到被加壳的程序

  在这里,我们尝试使用两种脱壳方法,通过提前寻找OEP,修复CRC校验后,直接转储IAT被修复的程序。

   3.3 PEncrypt炮轰笔记先把程序扔进OllyIce,然后程序就停在这里。这看起来相当奇怪

  好了,重新加载程序,在不忽略所有异常的情况下尝试使用一个异常方法,然后使用异常计数器插件,程序在一个异常处停止

  如果F8在这个时候下台,程序将触发异常处理,然后它不会到达OEP。这时,您需要查看堆栈数据

  此时,需要在0040CCD7处断开F2,然后执行SHIFT F9。可以跳过这个坑

  然后是F8F4公司的运营,一直到OEP:

  用LoadPE脱壳后再用ImportREC修复,虽然没有无效指针,但还是不能运行

  此时,使用LoadPE的重建PE功能

  那么它可以正常运行

  这个shell采用单步跟踪的脱壳方法,一路跳过程序“陷阱”,到达OEP。并利用LoadPE的rebuilding PE功能,对程序进行了重新构建,最终完成了这个加密外壳的整个解包过程。

   3.4变形弹壳脱壳注意事项检测弹壳

  使用ESP定律,先把程序扔进OllyIce,踏上F8,观察ESP的变化。ESP第一次变化时,在ESP对应的地址设置内存硬件访问字断点,然后SHIFT F9运行。程序停止后,取消硬件断点,执行F8:

  跳过与F4的向后跳(循环),然后一直向下看,直到你到达这里

  在这个jmp F4下,程序会跑掉。说明程序代码已经在这个循环中释放了,所以查一下这个循环中是否有条件的大跳转。很容易找到魔跳的位置,然后我们输入或者Ctrl G到00402666的位置,发现是OEP,重新分析,然后F2破点让程序去OEP:

  如果是FSG1.33,直接用LoadPE转储文件,然后用ImportREC修复,就可以正常shell了。在这里,当使用ImportREC来修复时,会出现一个无效的指针

  这里直接把这个指针切掉(或者删除),然后修复转储文件,发现无法正常打开

  !【在此插入图片说明】(https://img-blog . csdnimg . cn/6 B2 CB 9 be 0804 EB 4a 47 bbcb 665 cebf 62 f . png?x-oss- process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text _ Q1 netiba 5 luj 56 CB 54 as S5 ASC 5 pwy,size_12,color_FFFFFF,t_70,g_se,x_16)

  然后把修复好的程序扔进OllyIce,F9直接运行

  这里是在变形的外壳上加了一个隐藏桩,会导致程序异常退出。这里直接把nop掉或者把之前的jle (check)改成jmp,然后把修改后的文件另存为保存。然后你可以运行它。

  更多关于程序脱壳教程(exe文件脱壳步骤)的请关注本站。

Copyright@2015-2025 www.xingbingw.cn 性病网版板所有