Android逆向——脱壳解析

news/2025/3/14 22:55:13/

“壳”是一种对程序进行加密的程序,“壳”形象地表现了这个功能。我们可以把被加壳的程序当成食物,而加壳程序就是在外面加上一层坚硬的外壳,防止别人去窃取其中的程序。加壳后的程序依然可以被直接运行。在程序运行时壳的代码先运行,然后再运行原来的程序。主要目的是为了隐藏程序的OEP(入口点),防止外部软件对程序的反汇编分析或动态分析。许多病毒通过加壳来达到免杀的目的,但壳也用在保护正版软件不被破解。

脱壳的基础知识

壳是怎么装载的?

壳自从加到程序上以后就连在一起了,即对程序进行保护,防止被修改,也就是壳把程序给包裹起来了,而且原程序的数据也被压缩了。

装载的时候通常是先执行壳后再跳到真正的原程序OEP(程序入口点),这时开始运行原先没加壳的程序。运行顺序:执行带壳文件——执行壳——执行到程序入口点——运行未加壳的程序。

壳的分类

壳出于程序作者想对程序资源压缩、注册保护的目的,壳一般分为压缩壳和加密壳两类。

压缩壳:一般只对文件进行压缩处理,既压缩区段和一些资源压缩,以减少文件体积为目的如:ASPack、UPX、PECompact等

加密壳:跟压缩壳正好相反,一般是牺牲减少体积为代价,对文件进行加密处理,用上各种反跟踪技术保护程序不被调试、脱壳,如:ASProtect、Armadillo、EXECryptor等

但随着加壳技术的发展,这两类壳之间的界限越来越模糊,很多加壳软件既有压缩功能也有保护性能,而且现在很多加密壳达到壳中带肉,肉中带壳的地步了。

OEP (程序入口点)

OEP:Original Entry Point ,程序加壳前真正的入口点。

脱壳的基本步骤

查壳(PEID、FI、PE-SCAN)—>寻找OEP(OD)—>脱壳/Dump(LordPE、PeDumper、OD自带的脱壳插件、PETools)—>修复(Import REConstructor)

脱壳的演示

对于不同的壳,网上有很多对应的脱壳工具。在脱壳前一般先用查壳工具,查加的是什么壳,然后找到对应的脱壳工具进行脱壳。以之前的UPX壳压缩的upx_test.exe为例,进行脱壳演示。图是PEiD查壳结果,通过查壳我们知道这是UPX的壳,然后用对应的脱壳工具进行脱壳。

这里用的是UPXshell进行演示。将程序拖入到UPXshell中单击“GO”即可得到脱壳之后的程序。脱壳之后会覆盖原来的带壳的程序,所以在脱壳前要做好备份,如图所示:

脱壳是逆向分析的必备技能之一。虽然用软件脱壳十分方便,但还是会存在许多限制,如要找对应的脱壳软件,较新、较强的壳一般无法用软件脱壳等。所以还是有必要了解一些脱壳的基本知识。

(1)OEP

脱壳的第一步是找到源程序的OEP(Original Entry Point)。OEP标志是否已经运行到源程序。对于一些简单的压缩壳,找到OEP就意味着已经脱壳成功。

单步调试法:加壳程序开始运行时,栈的情况与解压后主程序的栈情况完全相同。所以很多加壳程序载入 OD 后都会停留在 pushad/pushfd 处,将原来的栈先保存下来,所以,pushad/pushfd肯定就有对应的popad/popfd。只要找到popad/popfd就可以快速地找到OEP。将upx_test.exe载入OllyDbg,一直按F8,如果遇到向上跳转就按F4运行到下一行。直到遇到popad,下面会有一个比较大的jmp跳转。跳转之后的地方就是程序的OEP,如图所示:

这里只介绍了比较简单而且比较通用的一种脱壳方法。实际中还有很多巧妙的方法,如ESP定律、利用编辑语言的特点等。

(2)内存映像转存

找到OEP之后,程序已经在内存中,这时内存中的程序最接近加壳前的程序。只需要将内存中的映像转存出来,一般的壳就结束了。内存映像转存(dump)工具有好多,如LordPE、PETools。而且OllyDbg中也有OllyDump插件可以使用。

下面就可以进行脱壳了。右键单击“push ebp”选择dump process,单击“dump”按钮脱壳。会生成一个脱壳后的程序,默认文件名会在原文件名后面加上“_dump”。最后进行查壳,显示已经无壳,并且成功运行,表示脱壳成功,如图所示:

(3)重建导出表

很多加密壳会对导入表做手脚。这时,就算成功脱壳,程序也是无法运行的。在导入表中起关键作用的是IAT,所以很多时候修复导出表也叫修复IAT。可以使用importREC重建导出表,如图所示:

以上为Android逆向的简单脱壳理解,Android逆向作为安全板块的应用还需要学习很多技术,如下路线图所示:摘要《Android逆向开发》

常用脱壳方法

  1. 单步跟踪法
  2. ESP定律法
  3. 内存镜像法(二次断点法)
  4. 一步到达OEP
  5. 最后一次异常法
  6. 模拟跟踪法
  7. “SFX”法

这些都是一些常用的脱壳方法,更详细的逆向内容记载在上面资料当中。


http://www.ppmy.cn/news/1106416.html

相关文章

为什么 Elasticsearch 中高基数字段上的聚合是一个坏主意以及如何优化它

Elasticsearch 是分布式搜索和分析引擎,是满足搜索和聚合需求的最受欢迎的选择。 Elasticsearch 提供了 2 种数据类型来存储字符串值: Text:- 在存储到倒排索引之前对这些内容进行分析,并针对全文搜索进行优化。 文本字段不允许…

【LeetCode刷题笔记】动态规划 — 70.爬楼梯

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

Android GUI系统之SurfaceFlinger(16)MessageBase解读

该系列文章总纲链接&#xff1a;Android GUI系统之SurfaceFlinger 系列文章目录 说明&#xff1a;以下代码分析均在android5.1.1_r3分支上 目录frameworks/native/services/surfaceflinger为root目录 1 MessageBase解读 1.1 源码实现分析 MessageBase源码实现如下&#xff…

Leetcode算法入门与数组丨1. 数据结构与算法简介

文章目录 前言1 数据结构与算法1.1 数据结构1.2 算法 2 算法复杂度2.1 算法复杂度简介2.2 时间复杂度2.3 空间复杂度 3 总结 前言 Datawhale组队学习丨9月Leetcode算法入门与数组丨打卡笔记 这篇博客以及接下来几篇将会是一个 入门型 的文章&#xff0c;主要是自己学习的一个…

docker启动MySQL报错:退出状态码1

docker启动mysql反复重启&#xff0c;通过 使用 docker logs 容器ID chown: cannot read directory /var/lib/mysql/: Permission denied 但是目录权限确认没问题&#xff0c;即使 chmod 777 还是报相同的错误&#xff0c;后来发现是selinux的问题 查看状态 getenforce 临时…

应用在触控一体机触摸屏中的电容式触控芯片

从智能手机出现以来&#xff0c;触控一体机行业迎来了飞速的发展&#xff0c;这种人机交互的方式&#xff0c;迅速改变了人们的生活&#xff0c;一时之间&#xff0c;触控无处不在&#xff0c;从智能手机延伸到平板电脑&#xff0c;再到商业领域的诸多触控产品&#xff0c;可以…

GO语言网络编程(并发编程)并发安全和锁

GO语言网络编程&#xff08;并发编程&#xff09;并发安全和锁 1. 并发安全和锁 有时候在Go代码中可能会存在多个goroutine同时操作一个资源&#xff08;临界区&#xff09;&#xff0c;这种情况会发生竞态问题&#xff08;数据竞态&#xff09;。类比现实生活中的例子有十字…

CE单相智能电力仪表ADL200

安科瑞 华楠 ADL200 单相电子式电能表主要用于计量低压网络的单相有功电能&#xff0c;同时可测量电压、电流、功率等电量&#xff0c; 并可选配 RS485 通讯功能&#xff0c;方便用户进行用电监测、集抄和管理。可灵活安装于配电箱内&#xff0c;实现对不同区域和不 同 负 荷 …