exe脱壳机(怎么把exe程序去壳)
exe脱壳机(怎么把exe程序去壳),本文通过数据整理汇集了exe脱壳机(怎么把exe程序去壳)相关信息,下面一起看看。
这里整合了之前自己学习软件的一些笔记和解包,希望能给孩子一些帮助学软件逆向和解包的鞋。
shell的全称应该是可执行程序资源压缩,是保护文件的常用手段。加壳后的程序可以直接运行,但是不能查看源代码。在查看源代码之前,您必须使用shell。
脱壳是使用特殊的算法对EXE和DLL文件中的资源进行压缩和加密。效果和WINZIP差不多,只是这个压缩文件可以独立运行,解压过程完全隐藏,全部在内存中完成。它们依附于原程序并通过Windows loader加载到内存中,然后在原程序之前执行以获得控制权。在执行过程中,对原程序进行解密还原,然后将控制权交还给原程序执行原代码部分。加入外壳后,原程序代码一般以加密形式存在于磁盘文件中,执行时才在内存中恢复,可以有效防止破解者非法修改程序文件,也可以防止程序被静态反编译。
外壳的类型通常分为两类:压缩外壳和加密外壳。压缩壳的特点是减少软件的规模,加密保护不是重点。加密外壳有很多种,不同的外壳有不同的侧重点。有些外壳只是简单的保护程序,有些则提供额外的功能,比如提供注册机制、使用次数、时间限制等。
OEP:(原始入口点),程序的入口点。软件加壳一般会隐藏程序的真实OEP(或者用一个假的OEP)。我们需要找到程序的真正OEP才能完成脱壳。
一般使用Ollydbg等动态调试工具时,sheller会停在shell的预处理块。即在对程序的原代码块进行解压缩或解密之前,运行程序自脱壳模块后,会停留在程序脱壳前的OEP位置,这是转储程序的最佳时机。在脱壳时,可以通过在真正的OEP处放下int3断点来捕获程序代码段的完全还原状态。因此,找到脱壳程序的正确OEP成为人工脱壳的首要任务。
IAT:(导入地址表),导入地址表。因为导入函数是由程序调用但其执行代码不在程序中的函数,所以这些函数的代码位于一个或多个dll中。PE文件加载到内存时,Windows loader加载DLL,用函数的实际地址链接调用导入函数的指令(动态连接)。此操作需要通过导入表来完成。导入的地址表是指标函数的实际地址。大部分脱壳机在运行时都会重新构建导入地址表,因此获取正确的脱壳机导入地址表也是手工脱壳机操作的一个关键问题。
单步跟踪法的原理是通过Ollydbg的单步(F8)、单步进入(F7)、run-to (F4)函数完整地走完程序的自脱壳过程,跳过循环恢复代码的一些片段,用单步进入来保证程序不会跳过OEP。这样,软件自动脱壳模块运行后,就可以到达OEP,转储程序。
ESP法是脱壳的利器,是最常用的脱壳方法之一。
ESP的原理在于程序中栈平衡的合理使用。在程序自解密或者自解压的过程中,很多shells会先堆栈当前寄存器的内容,比如pushad,解压后再堆栈之前的寄存器值,比如popad。因此,当寄存器从堆栈中释放出来时,程序代码往往会自动恢复,然后触发硬件断点。然后,在程序的当前位置,只需要几次单步跟踪就可以轻松到达正确的OEP位置。
内存镜像的方法是在加载shell程序时,通过od的ALT M快捷键进入程序的虚拟内存段。然后,通过添加两次内存一次性断点,到达程序的正确OEP位置。
内存镜像法的原理是,当程序资源段和代码段发生断点时,一般程序会先访问资源段,以获得所需的r
所谓到达OEP的一步脱壳法,就是根据脱壳的特点,找到最接近OEP的汇编指令,然后在程序到达OEP时,到int3断点转储程序。例如,在一些压缩的shells中,popad指令非常接近OEP或Magic Jump。所以使用Ollydbg的搜索功能,可以搜索到外壳的特征汇编代码,达到一步断点到达OEP的效果。
最后一个异常方法的原理是程序在自解压或自解密的过程中可能会触发无数个异常。如果能定位到程序的最后一个异常位置,可能离自动脱壳完成位置很近。现在,最后一个例外炮轰可以使用Ollydbg # 的异常计数器插件,先记录异常的个数,然后重新加载,在最后一个异常时自动停止。
模拟方法的原理是使用Ollydbg来制作条件断点。SFX相当于一个自解压段。在自提取段的末尾(当eip的值转移到代码段时),接近OEP,但是这种跟踪方式会比较耗时。
SFX 方法利用了Ollydbg # 自带OEP搜索功能,并且可以选择直接在OD找到的OEP处停止程序。此时自解压已经完成,可以直接转储程序了。
以下是使用上述方法整理这些常见外壳并尝试手动去壳的去壳注意事项。
首先,检测外壳:
首先,把程序扔进OllyIce,你可以看到:
然后在这里尝试使用ESP定理:即在第一次改变ESP时,为ESP的地址设置硬件字访问断点,使代码经过UPX算法还原后跳转到程序的正常入口。
然后F5运行,它不t直接跳到节目入口处的大跳位置,但是可以看到UPX的大跳就在眼前:
所以恢复后的程序的入口点是0x00445151(你也可以通过退下和F4跳过回退的循环语句来看这个大跳转的位置。)接下来到大跳转位置,跳转到正常程序入口:
然后去掉硬件断点,使用LoadPE的dump函数来转储目标程序:
首先修正图像大小,然后选择完全脱壳,这样就可以得到转储第一步的程序,然后用ImportREC修复转储程序的OEP。OEP的信息可通过OD的转储功能查询或直接填写45151:
在ImportREC中填写正确的入境地址,然后自动搜索IAT信息:
然后,单击获取输入表以获取IAT校正后的程序函数的输入表,然后单击显示无效函数。你很高兴的发现没有无效的函数,可以直接修复存档的文件。
选择第一步刚转储的转储文件进行修复,修复后,脱壳完成:
在这里,对于压缩壳UPX,直接使用ESP定律,所以很容易找到OEP和dump程序。
这里泰拉克的外壳是什么:
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.在修复函数tabl后寻找magic jump和dump程序
然后,如果使用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被修复的程序。
先把程序扔进OllyIce,然后在这里停止,看起来相当奇怪:
好了,重新加载程序,在不忽略所有异常的情况下尝试使用最后一个异常方法,然后使用异常计数器插件,程序在最后一个异常处停止:
如果F8此时下台,程序会触发异常处理,然后它就赢了t达到OEP。这时,您需要查看堆栈数据:
此时,需要在0040CCD7处断开F2,然后执行SHIFT F9。可以跳过这个坑:
然后是F8F4公司的运营,一直到OEP:
用LoadPE脱壳后再用ImportREC修复,虽然没有无效指针,但还是可以测试运行:
此时,使用LoadPE的重建PE功能:
那么它可以正常运行:
这个shell使用单步跟踪的脱壳方法,跳过程序 陷阱 一路,最后到达OEP。并利用LoadPE的rebuilding PE功能,对程序进行了重新构建,最终完成了这个加密外壳的整个解包过程。
首先,检测外壳:
使用ESP定律,先把程序扔进OllyIce,踏上F8,观察ESP的变化。ESP第一次变化时,在ESP对应的地址设置内存硬件访问字断点,然后SHIFT F9运行。程序停止后,取消硬件断点,执行F8:
跳过与F4的向后跳(循环),然后一直向下看,直到你到达这里:
在这个jmp F4下,程序会跑掉。说明程序代码已经在这个循环中释放了,所以查一下这个循环中是否有条件的大跳转。它很容易找到magic jump的位置,然后我们输入或Ctrl G到00402666的位置,发现它OEP,重新分析,然后F2破点让程序去OEP:
如果是FSG1.33,直接用LoadPE转储文件,然后用ImportREC修复,就可以正常shell了。但是在这里,当使用ImportREC来修复时,会出现一个无效的指针:
这里直接把这个指针切掉(或者删除),然后修复转储文件,发现无法正常打开:
!【在此插入图片说明】(process=image/watermark,type _ zhjvawrzyw5zzmfsbgjhy2s,shadow _ 50,text _ Q1 netiba 5l uj 56 CB 54 as 5s C5 pwy,size _ 12,color _ ffffff,t _ 70,g _ se,x _ 16)
然后把修复好的程序扔进OllyIce,F9直接运行:
这里是在变形的外壳上加了一个隐藏桩,会导致程序异常退出。这里直接把nop掉或者把之前的jle (check)改成jmp,然后把修改后的文件另存为保存。然后你可以运行它。
更多exe脱壳机(怎么把exe程序去壳)相关信息请关注本站。