逆向基础:软件手动脱壳技术入门

【调试原理】逆向peid-判定vc 以前一直认为一个工具只要会用就可以了,可是作为一名喜欢安全的渣渣来讲,会用还远远不够,你还得了解它,欺骗它,改造它,提升它! 上一篇文章讲了如何脱掉peid0.94版本的壳 [调试原理]逆向peid_脱壳 这一篇文章对peid开始逆向分析它的原理。开始的时候,从最简单的分析起:如何判断程序有vc编译器编译的。 逆向工具:ollydbg,ida,winhex 分析对象:peid v0.94( 阅读详情
AI摘要

本文详细介绍了软件脱壳的基本概念,包括加壳、OEP和IAT,并探讨了多种脱壳方法,如单步跟踪法、ESP定律法、内存镜像法等。通过实例解析了UPX、tElock、PEncrypt和FSG变形壳的脱壳步骤,展示了在动态调试工具Ollydbg中的具体操作,为新手提供了实用的脱壳技巧和实践经验。

前言:

大家好,我是周杰伦

这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文,希望能给新学软件逆向和脱壳的童鞋们一点帮助。

1 一些概念

1.1 加壳

加壳的全称应该是可执行程序资源压缩,是保护文件的常用手段。加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。

加壳是利用特殊的算法,对EXE、DLL文件里的资源进行压缩、加密。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。它们附加在原程序上通过Windows加载器载入内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密、还原,还原完成后再把控制权交还给原始程序,执行原来的代码部分。加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改,同时也可以防止程序被静态反编译。

壳的类型通常分为压缩壳和加密壳两类。压缩壳的特点是减小软件体积大小,加密保护不是重点。加密壳种类比较多,不同的壳侧重点不同,一些壳单纯保护程序,另一些壳提供额外的功能,如提供注册机制、使用次数、时间限制等。

1.2 OEP

OEP:(Original Entry Point),程序的入口点。软件加壳一般隐藏了程序真实的OEP(或者用了假的OEP), 我们需要寻找程序真正的OEP,才可以完成脱壳。

一般加壳程序在使用Ollydbg等动态调试工具时,会停在壳的预处理块。即处在对于程序原始代码块的解压或解密操作之前,在运行完程序自脱壳模块后,会停留在程序加壳之前的OEP位置,此时是dump程序的最佳时期。脱壳时在真实OEP处下int3断点,就可以捕捉到程序代码段完全恢复的状态。因此,寻找加壳程序的正确OEP,也成了手动脱壳时的第一要务。

1.3 IAT

IAT:(Import Address Table),导入地址表。由于导入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于一个或者多个DLL中。当PE文件被装入内存的时候,Windows装载器才将DLL 装入,并将调用导入函数的指令和函数实际所处的地址联系起来(动态连接),这操作就需要导入表完成。其中导入地址表就指示函数实际地址。多数加壳软件在运行时会重建导入地址表,因此获取加壳程序正确的导入地址表也是手动脱壳操作中的一个关键问题。

2 一些脱壳方法

2.1单步跟踪法

单步跟踪法的原理就是通过Ollydbg的单步(F8)、单步进入(F7)和运行到(F4)功能,完整走过程序的自脱壳过程,跳过一些循环恢复代码的片段,并用单步进入确保程序不会略过OEP。这样可以在软件自动脱壳模块运行完毕后,到达OEP,并dump程序。

2.2 ESP定律法

ESP定律法是脱壳的利器,是应用频率最高的脱壳方法之一。

ESP定律的原理在于程序中堆栈平衡的合理利用。由于在程序自解密或者自解压过程中,不少壳会先将当前寄存器内容压栈,如使用pushad,在解压结束后,会将之前的寄存器值出栈,如使用popad。因此在寄存器出栈时,往往程序代码被自动恢复,此时硬件断点触发。然后在程序当前位置,只需要少许单步跟踪,就很容易到达正确的OEP位置。

2.3内存镜像法(二次断点法)

内存镜像法是在加壳程序被加载时,通过OD的ALT+M快捷键,进入到程序虚拟内存区段。然后通过加两次内存一次性断点,到达程序正确OEP的位置。

内存镜像法的原理在于对于程序资源段和代码段下断点,一般程序自解压或者自解密时,会首先访问资源段获取所需资源,然后在自动脱壳完成后,转回程序代码段。这时候下内存一次性断点,程序就会停在OEP处。

2.4一步到达OEP

所谓的一步到达OEP的脱壳方法,是根据所脱壳的特征,寻找其距离OEP最近的一处汇编指令,然后下int3断点,在程序走到OEP的时候dump程序。如一些压缩壳往往popad指令距离OEP或者Magic Jump特别近,因此使用Ollydbg的搜索功能,可以搜索壳的特征汇编代码,达到一步断点到达OEP的效果。

2.5最后一次异常法

最后一次异常法的原理是,程序在自解压或自解密过程中,可能会触发无数次的异常。如果能定位到最后一次程序异常的位置,可能就会很接近自动脱壳完成位置。现在最后一次异常法脱壳可以利用Ollydbg的异常计数器插件,先记录异常数目,然后重新载入,自动停在最后一次异常处。

2.6 模拟跟踪法

模拟跟踪法的原理就是使用Ollydbg下条件断点,SFX相当于是一个自解压段,在自解压段结束时(eip的值转到代码段时),已经距离OEP很近,但是这种跟踪方法会比较耗时。

2.7 “SFX”法

“SFX”法利用了Ollydbg自带的OEP寻找功能,可以选择直接让程序停在OD找到的OEP处,此时自解压已经完成,可以直接dump程序。

3一些脱壳实践

下面给出整理的使用以上方法,自己尝试手动脱这几种常用壳的脱壳笔记。

3.1UPX脱壳笔记

首先进行侦壳:
在这里插入图片描述
首先把程序扔到OllyIce里面可以看到:
在这里插入图片描述
然后这里尝试使用ESP定理:即在ESP第一次改变时,对ESP的地址设置硬件字访问断点,这样可以在代码被UPX算法还原之后,跳转到程序的正常入口处。
在这里插入图片描述
然后F5运行,并没有直接到跳转到程序入口处的大跳位置,但是可以看到UPX的大跳就在眼前:

在这里插入图片描述
所以被还原后的程序入口点就是0x00445151(通过单步往下走,F4略过往回走的循环语句,也可以看到这个大跳的位置。)接下来走到大跳位置,跳到正常程序入口处:
在这里插入图片描述
然后去掉硬件断点,并使用LoadPE的dump功能dump目标程序:
在这里插入图片描述
先修正映像大小,然后再选择完整脱壳,这样可以得到第一步dump的程序,然后再使用ImportREC修复dump程序的OEP,OEP的信息通过OD自带的dump功能查询或者直接填45151:
在这里插入图片描述
将正确的入口地址填入ImportREC中,然后自动搜索IAT信息:
在这里插入图片描述
然后点击获取输入表得到修正IAT之后的程序函数输入表,然后再点击显示无效函数,愉快地发现没有无效函数,那么就可以直接修复转存文件了。
在这里插入图片描述
选择刚刚第一步dump下来的转储文件进行修复,修复完成之后脱壳完成:

在这里插入图片描述
这里对于压缩壳UPX,直接使用了ESP定律,可以很方便找到OEP并dump程序。

4.2 tElock脱壳笔记

这里脱的是一个tElock的壳:
在这里插入图片描述
1、先使用最简单的最后一次异常法:首先把程序扔到OllyIce里面设置OD调试选项中的异常选项,
在这里插入图片描述
仅保留内存非法访问异常,然后使用异常计数器插件,在使用前要清空断点设置:
在这里插入图片描述
等到程序正常运行后,重新加载程序,再选择第二步,停在最后一次异常之前:
在这里插入图片描述
然后用Alt+M转到内存窗口,对主程序code段下内存断点,SHIFT+F9执行:
在这里插入图片描述
这样程序就中断在了正确的OEP处,可以选择从模块中删除分析以显示正常分析的汇编代码。然后使用LoadPE dump程序,并修正程序映像大小。但是在使用ImportREC v1.6F Fix版,输入正确的OEP,获取函数输入表信息时,会发现无效的指针。使用方法一修复后,再使用方法三可以完全修复
在这里插入图片描述
再点击Fix dump,可以修复之前dump下来的程序,脱壳完成:
在这里插入图片描述
2、使用二次内存断点法:首先载入程序,将所有的异常类型忽略,然后在idata段设置内存断点, 然后SHIFT+F9:
在这里插入图片描述
停下来后再次在code段设置内存断点,再次SHIFT+F9执行,可以直接达到正确的OEP中:
在这里插入图片描述
然后LoadPE dump,然后修复IAT。修复方法同方法1。

3、寻找magic jump以及修复函数表完成后dump程序:前两步还是加内存断点(idata、code),然后定位到程序的正确OEP处
在这里插入图片描述
然后如果这时使用LoadPE dump后修复,就和前两种一样了。这里先是使用ImportREC获取函数输入表第一个位置的指针地址。
在这里插入图片描述
然后得到函数指针偏移地址在0x005512C,加上基地址后为0x045512C,这时在该位置下硬件访问双字断点。再重新SHIFT+F9忽略异常执行后,由于下了断点,会触发tElock的CRC校验错误:
在这里插入图片描述
所以这里要先绕过CRC校验,才能成功执行到硬件断点位置,所以首先暂停程序,然后使用Alt+F9返回用户代码。点击确定按钮后,程序暂停在调用ExitProcess的位置:
在这里插入图片描述
现在要向上找一找能跳过这个退出的跳转(CRC判断跳转),然后进行修改并跳过:
在这里插入图片描述
找到了应该修改的位置,但是如果修改之后重新运行是会被恢复的,所以先记下来这个跳转的地址,0x00469622。重新运行之后,在idata断设置内存断点,SHIFT+F9停下后,再Ctrl+G找到修改点再修改。修改完之后再设置之前的硬件断点,这样不会触发CRC校验错误了。

无数次的SHIFT+F9之后,在寄存器窗口可以看到指针以及能够正常显示:
在这里插入图片描述
然后此时F8单步,找magic jump……看小生大大的视屏是通过分析疑似CRC跳转得到magic jump的位置:
在这里插入图片描述
这里记下来magic jump的地址是0x0046973B,然后清空udd文件,删除硬件断点,再次重新运行程序,然后在idata下内存断点停住,然后Ctrl+G找到magic jump位置处,修改跳转:
在这里插入图片描述
然后在code段下内存断点:
在这里插入图片描述
然后SHIFT+F9执行,停下来就到了OEP的位置:
在这里插入图片描述
这时候再dump程序,IAT表已经被修复,可以直接获得脱壳版程序:
在这里插入图片描述
这里尝试使用了另外两种脱壳方法,并且通过预先找OEP的方式,修复了CRC校验后,直接dump到了IAT被修复了的程序。

3.3 PEncrypt脱壳笔记

在这里插入图片描述
先把程序扔到OllyIce里面,然后程序停在这里,看起来蛮怪的:
在这里插入图片描述
好吧,重新加载程序,尝试使用最后一次异常法,不忽略所有异常,然后使用异常计数器插件,程序停在最后一次异常处:
在这里插入图片描述
如果此时F8单步下去,程序会触发异常处理,然后又到不了OEP了。这时需要看一下堆栈数据情况:
在这里插入图片描述
这时需要在0040CCD7处F2下断点,然后SHIFT+F9执行,可以跳过这个坑:
在这里插入图片描述
然后接下来就是F8+F4的操作,一路直到OEP:
在这里插入图片描述
用LoadPE脱壳,然后用ImportREC修复后,虽然没有无效指针,但是还是不能运行:
在这里插入图片描述
这时候用LoadPE的重建PE功能:
在这里插入图片描述
在这里插入图片描述
然后就可以正常运行了:
在这里插入图片描述
这个壳使用了单步跟踪的脱壳方法,一路跳过程序“陷阱”,最后达到OEP。并且使用了LoadPE的重建PE功能,对程序进行了重建,最终完成了这个加密壳的脱壳全过程。

3.4 FSG变形壳脱壳笔记

首先进行侦壳:
在这里插入图片描述
使用ESP定律,首先把程序扔到OllyIce里面,F8单步走,观察ESP变化,在ESP第一次发生变化时,对ESP对应的地址处设置内存硬件访问WORD断点,然后SHIFT+F9运行,在程序停下来之后,取消硬件断点,进行F8单步:
在这里插入图片描述
用F4略过向后的跳转(循环),然后继续往下找,一直到这里:
在这里插入图片描述
在这个jmp下面F4,程序会跑飞。说明程序代码在这个循环中就已经释放完毕,所以向上找找这个循环中有没有带条件的大跳。这样很容易找到magic jump的位置,然后我们Enter或者Ctrl+G到00402666的位置,发现果然是OEP,重新分析,然后F2下断点,让程序走到OEP:
在这里插入图片描述
如果是FSG1.33,直接使用LoadPE dump文件,然后使用ImportREC修复,就可以正常脱壳了。但是这里在使用ImportREC修复时,会出现一个无效指针:
在这里插入图片描述
这里直接剪掉(或者删掉)这个指针,然后修复转存文件,发现无法正常打开:
在这里插入图片描述
然后再把修复后的程序,丢到OllyIce中F9直接运行:
在这里插入图片描述
这里是变形壳添加的一个暗桩,会导致程序出现异常退出,这里直接nop掉或者把之前的jle(校验)改成jmp,然后保存修改另存文件。然后就可以运行了
在这里插入图片描述

病毒分析-ollydbg脱壳的步骤和原理 启动OllyDbg,将需要脱壳的可执行文件加载到调试器中。OllyDbg会加载程序并停在程序的入口点(EP),但此时通常不是原始入口点(OEP)。 阅读详情

相关推荐

ollydbg教学篇

写之前先说点废话(谁扔的香蕉皮,鸡蛋^^^^^^^^^^^): ollydbg是个功能强大的软件,以前我也不用他(不习惯),而且很多经典教程都是用trw和softice作为示例工具写的. 初学者(注:和我一样的人)往往一开始就接触这些工具,做练习也就用这些工具!可以说已经上手了! 对ollydbg的动态调试功能也就陌生了! 现在一个很现实的问题让我改变了习惯,我的键盘鼠标是usb的,显示器也给

WiNrOOt的逆向工程专栏 7675

ollydbg脱壳教程

里面有10多个教程,这个要多谢那些录制的大哥,我来分享给大家认识

南邮 2024 软件安全 实验四 自动脱壳+手动脱壳

这次这个实验很简单,就是一个简单的脱壳,然后进行爆破就行了,解法非常的多这里不多讲,会简单讲一下特殊情况这个点开是这样子:然后放进peid里面查看,我这个是原版的PEid,所以显示出来是这样:会显示nothing found,但其实如果你使用吾爱破解的魔改过的peid,它就会显示具体的壳名:然后你点击右下角的那个箭头,里面会有很多的插件用来自动脱壳:你也可以使用这个通用脱壳器,但是脱壳后的程序无法运行,这个放到后面讲。

ARbing_an的博客 2555

逆向基础——软件手动脱壳技术入门

YHZX_2013 · 2015/09/07 14:06这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文,希望能给新学软件逆向和脱壳的童鞋们一点帮助。1 一些概念1.1 加壳加壳的全称应该是可执行程序资源压缩,是保护文件的常用手段。加壳过的程序可以直接运行,但是不能查看源代码。要经过脱壳才可以查看源代码。加壳是利用特殊的算法,对EXE、DLL文件里的资源进行压缩、加密。类似WINZIP 的效...

weixin_34248118的博客 989

UPX脱壳实战:从自动化工具到手动逆向的完整指南

在软件安全领域,可执行文件保护与逆向分析是核心议题。加壳技术通过压缩、加密和变形原始程序,旨在保护知识产权并增加逆向难度,其原理在于改变程序入口点并隐藏原始代码。理解这一机制对于软件安全分析、漏洞挖掘和恶意代码研究具有重要价值。脱壳作为逆向工程的基础技能,广泛应用于软件调试、安全评估和遗留系统分析等场景。本文聚焦于广泛使用的UPX压缩壳,深入解析其结构,并演示如何利用脱壳机工具及手动调试技术完成逆向分析,其中涉及内存转储和导入表修复等关键操作,帮助读者掌握从自动化到手动分析的完整攻防实战能力。

weixin_28716443的博客 759

CTF逆向-手动脱壳实战:从UPX压缩壳到攻防世界simple-unpack解析

本文以攻防世界CTF逆向赛题simple-unpack为例,详细解析了UPX压缩壳的手动脱壳实战流程。文章深入剖析了UPX壳的技术原理与行为特征,并重点介绍了利用ESP定律定位原始入口点(OEP)的核心方法,通过x64dbg调试器一步步演示了从查壳、下断点到内存转储与修复的完整操作,帮助逆向工程新手掌握脱壳的关键技能。

gg901的博客 926

Ollydbg手动脱壳得几点小结

手动脱壳 Ollydbg手动脱壳得几点小结:           一般认为手动脱壳的关键是找到软件的真正入口OEP,但是用ollydbg脱壳知道软件的真正入口OEP并不能解决问题,因为ollydbg的工作原理和softice、trw2000等的有所不同,在OEP未解压以前是不能在OEP设断上的,因此用ollydbg脱壳的关键是让程序中断在OEP,一旦中断在OEP脱壳就告完成。

vbsourcecode的专栏 3979

Android逆向基础入门

目录一、基础App数据抓取1、App抓包知识了解二、Android_apk逆向1、Android逆向名称2、jadx反编译工具3、JEB反编译工具 一、基础App数据抓取 1、App抓包知识了解 常用的拦截抓包工具有Charles、Fiddler、mitmproxy:大部分app使用的数据通信协议基于HTTP/HTTPS,可通过抓包查看来模拟url请求 常用的自动化工具有Appium、Airtest:就相当于web端的selenium 二、Android_apk逆向 1、Android逆向名称 每个a

十一姐的博客 2万+

ctf逆向中的工具脱壳和手动脱壳

逆向脱壳小结

2301_80313926的博客 4460

win脱壳1 -- 脱壳是什么 脱壳的技术有哪些 为什么要脱壳

脱壳 = 在调试器里让壳自己完成"解压 + 重建IAT",在它跳回 OEP 的瞬间截停,把内存镜像 dump 出来并修复 IAT。OEP 是"终点站"、IAT 是"待修复的零件"、加壳流程是"倒放的脱壳流程"——把执行时间线(加壳PE → EP → 解压 → 跳OEP)倒过来读,就是脱壳方法论本身。按"UPX 手动脱壳 → ESP 定律 → ASPack → 脱壳后修复 → 给自写 payload 加壳再自脱"的顺序练。

盾悟 8786

[1196]Android逆向工具【反射大师】脱壳实战

脱壳只是第一步,后面还有修改、调试、回编译,工作量都很大,以上就是脱壳环境搭建与脱某60壳实战的主要内容。壳确实脱了,但是没有修复步骤,比如修改Apk中的xml、程序入口等操作。这主要是由于不同的壳,修复步骤不同。分析代码这个步骤,完全是考验你的 Java 基本功 + 耐心,二者缺一不可。不过不要退缩,我们只要遵循一些技巧,就可以大幅减少工作量。由于分析过程比较繁琐,这里就不结合具体代码了,只做一些理论总结:1、从目标 API 开始入手,跟踪执行流程。

周小董 6483

逆向工具之脱壳神器反射大师(附脱壳环境搭建、脱壳实战)

  相信点击进入这篇博客的小伙伴都知道并且搞过App逆向,不过有时候会遇到各种加壳的App,不让你反编译。但是道高一尺,魔高一丈,有正向加密,就有逆向解密。今天博主带大家搭建脱壳环境,并且手动脱一个加了某60的壳的App。闲话少叙,直接开始吧! 逆向工具之搭建脱壳环境与脱壳实战目录一、`Android`系统二、安装Xposed框架1、下载`Xposed Installer`2、安装`Xposed Installer`三、安装`反射大师`1、下载`反射大师`2、安装`ReflectMaster`并授权四、脱壳

hestyle的博客 4万+

OllyICE使用教程

OllyICE使用教程有图,OllyICE使用说明与示例 OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可

x64dbg使用技巧及upx手动脱壳

专门负责对程序体积进行压缩,或者是保护一个程序不被非法修改、逆向分析的一类软件。壳通过附加自身代码在保护对象(原始程序)上,在操作系统对原始程序代码进行执行只求按获得程序控制权,进而对原始程序进行解压或解密等还原操作,完成操作后控制权将还给原始程序,程序的原始代码才开始被执行。壳主要有压缩壳和加密壳两种:加壳软件在运行时运行外壳代码,对程序进行解压操作或解密操作,所以对于比较简单的壳,

liulala987的博客 1万+

别再为Power BI瀑布图发愁了!用这个DAX公式+堆积柱状图,5分钟搞定现金流量表可视化

本文介绍了一种使用DAX公式和堆积柱状图快速实现Power BI现金流量表可视化的高效方法。通过详细的步骤和代码示例,帮助财务分析人员5分钟内完成专业级报表制作,解决传统瀑布图配置复杂、灵活性差的问题,显著提升工作效率。

weixin_28677005的博客 246

飞牛Docker部署Zerotier后无法访问?三步搞定SSH权限配置!

本文详细解析了在飞牛NAS上通过Docker部署Zerotier后无法访问的常见问题及解决方案。重点介绍了SSH权限配置、tun模块加载和Docker容器权限设置等关键步骤,帮助用户快速解决虚拟网络接口的权限问题,确保Zerotier节点间的正常通信。

qq_27496129的博客 788
上一篇: 新手入门二进制安全和网络渗透,该选哪个比较好?
下一篇: 怎么成为一个黑客?按照这个路线来
AI小模型
博客等级 码龄6年 6863粉丝 487原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小模型

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值