ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

脱壳日记-

2026/8/10 22:14:22 拓冰建站 浏览量
脱壳日记- 引入今天练习脱壳偶遇了一个非常不寻常的壳。PE查壳如下查不出来是一个Aspack变形壳。进去看见直接一个跳转跟进一下F8直接跑飞F7进call看看F8单步发现一直在这里循环0041862E下一个指令处F4发现直接跑飞了这是怎么回事别急先看一下代码猜想是循环到一定次数后不再跳转了执行了ret所以在后面F4会直接运行。直接在0041862E处下断开始F9数好次数发现第59次程序运行了那F9到58次然后F8单步。再次F8单步我们的猜想成立了ret处直接跳出了。接下来我们继续F8单步。一堆空指令别慌继续F8。发现了如下一段指令这是北斗壳不知道北斗壳的小伙伴我会在文末做出介绍直接搜索指令popadpopfd由于x32dbg似乎不能多行搜索我这里直接搜扫popad由于比较多进行挨个查找找到了还发现了一个小跳转F8跟进。OK来到了这里那我们直接进行ESP大法成功发现大跳转那么OEP 近在咫尺了。用x32dbg自带插件完美脱壳。附北斗壳nspack3.7)给没有见过的朋友入口处特点pushfdpushadcall XXXXOEP处特点popadpopfdjmp XXXX(一般为OEP)。25-3-7反调试壳对于一般的加密壳没有做反调试操作对于脱壳而言是比较友好的毕竟会有很多种方式进行脱壳。但是对于反调试的壳而言会出现一些非常奇怪的现象,例如以下日志展现的问题程序在入口处单步几次就出现一次C0000005无效内存访问异常然后反而直接将程序运行这是典型的人为陷阱异常。具体原理如下壳作者将代码中加入了人为异常陷阱程序自主运行时一切正常当调试器进行单步运行时实际上时在内存中读取数据后影响TF标志位int1异常来达到单步的目的。如果人为异常被调试器先行捕获程序下的底层钩子没有接到正常的异常处理话就判断为调试状态这时会直接跳过执行代码避免被调试直接达到运行弹出界面等处就是看见的异常后程序直接运行。那么如何来对付这种人为陷阱呢其实只需要不做任何操作让程序自身去处理即可脱壳的本质就是让程序运行到OEP时截断拿到真正的程序代码壳里面有什么操作完全不用关心。接下来以PECompact壳进行举例载入DIE拖入x32dbg中单步几次就是我上面的例子这时我们先进行区段查看发现只有两个区段而且.data数据段竟然后读写执行等权限这是明显不正常的判断为进行了区段合并。将所有的解密以及运行操作都在一个区段中执行。这个时候下区段内存访问断点来判断是否解密完毕明显没有意义。可以下常见的内存操作断点即程序解密后给一片内存空间进行执行断在此处加密数据已经解密完毕可以快速到达OEP。你可能疑惑为什么要下断点因为在单步调试时有人为陷阱干扰调试让调试难以进行下断点在断下之前异常全部交给程序自己处理所以不会有任何影响。在内存操作已经接近OEP就算有反调试代码也会很少。执行Virtualalloc Virtualfree断点这里使用插件一键下断手动命令下断也是可以的。程序没跑完说明进行了内存分配接下来单步跟进即可马上到达OEP单步后发现大跳转前两行命令进行堆栈保留操作明显是OEP入口脱壳成功