小柏实战学习安卓图文教程-第五课-识别加固1

本节课主题:现在所有的app都有加壳,所以我们先识别壳,通过ApkScan-PKID 和 Detect It Easy (DIE);

 

tips: 前三课的知识足够用了,这节课开始就是真正的实战了,不同网络其他教程,都是从简单的开始,然而我们直接从最难的开始;万事开头难,加油!

(文字可能有点多,耐心读,识别加固的思路,经验和常识,你需要记下来的)

 

1.为了防止脱壳过程中触发某些app的保护机制(包括但不限于删除系统文件,格式化C盘等极端操作),所以需要先安装虚拟机vmware,所有操作都在虚拟机完成,要养成这个好习惯;

教程链接:https://www.cnblogs.com/shaun88/p/19455159

补充一个安装java开发环境的教程:https://www.cnblogs.com/shaun88/p/19457416

 

2.主流查壳工具对比

工具类别

工具名称

核心特点

识别方式

适用场景

专用查壳工具

ApkScan-PKID

专门为APK设计,轻量快速

特征匹配+模式识别

快速批量检测,初步筛查

 

Detect It Easy (DIE)

支持格式多,检测深度高

多引擎特征库扫描

深度分析,处理复杂情况

在线查壳平台

腾讯云移动安全

无需安装,专业分析

云引擎分析

快速检测,获取详细报告

 

Virustotal

多引擎对比,全球样本

57个杀毒引擎扫描

了解全球检测情况

逆向集成工具

Android Killer

一体化逆向环境

内置查壳模块

逆向流程中快速判断

手动分析方法

Lib特征分析

最准确,无工具依赖

文件结构+特征文件识别

精准识别,理解实现原理

一、ApkScan-PKID

工具简介

ApkScan-PKID 是专门为安卓APK设计的查壳工具,集成了多种检测引擎,能识别市面上大部分主流加固方案。

下载地址链接:https://pan.quark.cn/s/d8dfb3989875

 

1.物理机把下载好的压缩包解压后得到的jar,放到虚拟机里面;

物理机把下载好的apk样本文件,放到虚拟机里面;

image

image

 

2.打开ApkScan-PKID文件:

工具文件同级目录,右键, 打开cmd

image

 

3.输入命令:

java -jar .\ApkScan-PKID.jar

以此启动pkid

"java -jar .\" 然后tab 键,可以自动补齐命令

image

 

4.浏览样本文件:CrackMe.apk

image

 

5.正常现象,查不到加固信息,(毕竟实战嘛,怎么可能一下子就让你查到0.o)

image

 

总结pkid如下:

使用方法

  1. 启动jar包:也可以源码启动

  2. 加载APK:点击"选择APK"或直接将APK拖入窗口

  3. 查看结果:工具会自动分析并显示检测结果

检测结果解读举例:

================================
APK名称:com.example.app_v2.3.1
文件大小:45.2 MB
加固状态:● 已加固
加固厂商:腾讯乐固
加固版本:V3.7.0
特征识别:tencent.yun
风险等级:中等
================================

优点

  • 检测速度快,支持批量

  • 针对安卓加固优化

缺点

  • 对新型小众加固识别有限

  • 无法提供深度分析报告

二、Detect It Easy (DIE) - 专业级选择

工具简介

DIE 是一款功能强大的多格式查壳工具,虽然不是专门为安卓设计,但其强大的特征库能识别大量加固方案。

下载地址: 课件上面的连接给过了,本节课的工具都在里面了;

  • 官网:https://github.com/horsicq/Detect-It-Easy

  • 支持Windows/Linux/Mac

 

1.下载好压缩包,压缩包放到虚拟机中,然后在虚拟机中进行解压,就得到了die

image

2.双击打开die, 右上角打开目录选择样本文件,直接打开

image

image

image

 3.解析的信息出来了,别急,慢慢看,实战没你想的那么简单

image

 

4.慢慢分析:

4.1.关键发现是扫描结果中出现了"assets/main.apk"。这很特别,正常APK不会在assets里放另一个完整APK。这强烈提示这个APK使用了某种“加壳”保护——外壳APK内部包裹着真正的应用APK。这种技术类似于PC软件的“加壳”,外壳负责解密和加载核心代码。

image

 

4.2继续看其他文件流,有很多ELF动态库(.so文件),分布在armeabi-v7a和x86架构目录下,是典型的安卓原生库结构。编译器信息显示主要使用GCC 4.7-4.9,目标系统是Android 4.1.1-5.0,说明这个APK兼容较旧Android版本。

image

 

4.3还发现一些特殊文件,比如assets/script.lr、luasocket_x86.zip、publicsuffixes.gz。luasocket暗示可能使用了Lua脚本引擎,这种技术在一些游戏或复杂应用中常见,用于逻辑热更新。

image

 

4.4技术画像详解

  1. 加固模式确认:双APK外壳

    最关键的证据是:Stream: APK(Deflate, "assets/proxy.apk")

    1. image

  2. 这证实了它采用经典的 “双APK”外壳方案

    • 外壳LoaderCrackMe.apk本身。它的唯一职责是解密、加载并运行 assets/proxy.apk

    • 核心应用assets/proxy.apk。这才是真正的业务应用,包名为 com.nx.proxy。我们的所有逆向目标(如算法、逻辑)都在这里。

  3. 多架构原生保护库(壳的引擎)

    扫描结果中大量出现的 libsc*.so(如 libsc16.so, libsc17.so, libsc18.so, libsc19.so)是加固厂商提供的核心保护库。它们的作用包括:

    • 解密与加载:解密 proxy.apk并在内存中动态加载。

    • 反调试:防止调试器附加。

    • 环境检测:检测是否运行在模拟器、ROOT环境或XPosed/Frida框架下。(这不是一个好消息,感觉我都不一定搞得定了)

    • 代码虚拟化/混淆执行:可能对关键代码进行保护。

  4. 依赖的第三方库

    • libopencv_java4.so:OpenCV计算机视觉库。表明核心应用可能涉及图像识别、扫码、人脸检测等功能。

    • libocapi.so:用途不明,可能是某个特定硬件或服务的SDK。

    • libc++_shared.so:C++标准库,说明保护库或核心应用部分使用了C++编写。

  5. 编译环境与目标

    • 编译器:GCC 4.6.x, 4.7, 4.8, 4.9。版本较老,可能与壳的开发时期有关,也意味着其对抗现代脱壳工具的能力可能存在已知漏洞(这可能是好消息)。

    • 目标系统:Android 4.1.x (Jelly Bean) 到 5.0 (Lollipop)。说明外壳最低兼容到这个版本,但并不代表它不能在新系统上运行。

 

总结die如下:

使用方法

  1. 启动DIE

  2. 将APK文件拖入窗口

  3. 查看"Signatures"选项卡

主要特征

  • 支持超过600种文件格式

  • 内置多种检测引擎

  • 可自定义特征库

  • 支持脚本扩展

适合场景

  • 需要对APK进行深度分析

  • 遇到ApkScan无法识别的加固

  • 需要了解详细的文件结构信息

三、在线查壳平台(便捷选择,不过个人觉得用处不大,只能当做交叉验证猜想的准确性而已)

1. Virustotal

网址https://www.virustotal.com

image

image

耐心等待结果后,下载完整报告,有6个报毒,别担心.

这个在线病毒检测结果说明了几点关键信息,但完全不必惊慌,这在逆向分析领域是非常常见的现象。

核心结论:这是一个安全的、用于学习的CrackMe程序

这个检测结果不仅没有危险,反而印证了我们之前所有的技术分析。下面是详细解读:


  1. 为什么会被标记为“恶意”?

  • 低检出率65家厂商中只有6家报告,比例极低(约9.2%)。这表明绝大多数顶级安全厂商(如卡巴斯基、ESET、赛门铁克等,从图中看未检出)都认为它是安全的

  • 报毒厂商的特征:图中显示报毒的厂商(如 IkarusK7GW)通常以激进、高误报的启发式检测闻名。它们很可能检测到了以下“可疑”特征,而这些特征正是我们分析过的保护机制:

    1. 加固/加壳行为CrackMe.apk使用的商业加固技术(libsc*.so等),其代码特征和行为模式(如动态解密、加载隐藏的DEX)与部分恶意软件为了躲避查杀而使用的技术高度相似。安全软件无法区分这是“保护”还是“躲避”,所以会触发警报。

    2. 敏感权限与高危行为:应用可能申请了网络、存储等权限,并且有从assets加载并执行代码的行为,这触发了“风险软件”或“潜在不受欢迎程序”的检测规则。

  • 报毒名称分析

    • PUP/Android.Malct.xxxxxxPUP意为“潜在不受欢迎的程序”,不是病毒。

    • Android.Riskware.Agent.OLVRiskware意为“风险软件”,指其行为有潜在风险。

    • Android.Os.Evo/ Trojan:这些是最常见的误报名称,通常指其使用了“进化性”的加壳或混淆技术。

  简单说:安全软件把它“保护自己代码的技术”误判为“恶意软件隐藏自己的技术”了。

  2. 这个结果对我们意味着什么?

  1. 印证了我们的技术分析:在线检测结果证实了这个APK确实使用了强保护/加壳技术。这和我们发现的libsc*.so、双APK结构、加密的Lua脚本等完全吻合。它不是一个人畜无害的“Hello World”程序,而是一个有实战价值的练习目标。

  2. 说明它是“良民”:真正的、广泛传播的恶意软件,在VirusTotal上的检出率会非常高(通常超过40/65)。仅有6家报毒,且是大厂未报、小厂误报的模式,基本可以断定这是一个用于安全研究、CTF比赛或逆向学习的合法CrackMe程序

  3. 无需担心安全问题:只要你在虚拟机或专用测试机中运行和分析它(正如我们之前一直强调的),就绝对安全。它的“恶意”行为仅仅是保护自己,不会格式化你的电脑或窃取数据。

 

总结在线查壳平台如下:

特点

  • 57个杀毒引擎同时扫描

  • 全球样本对比

  • 历史版本分析

注意事项

  • 上传的文件会被公开

  • 不适合敏感应用检测

在线平台优缺点

优点

  • 无需安装软件

  • 分析全面专业

  • 持续更新引擎

缺点

  • 需要上传APK(隐私风险)

  • 依赖网络连接

  • 可能有文件大小限制

 

四、手动解压样本后分析lib目录:

1.将 CrackMe.apk重命名为 .zip并解压。

image

2.全部解压缩一下,查看assets和lib目录

image

image

image

image

image

 

3.关键发现详解

3.1. 双APK核心结构

assets目录中存在 main.apk​ 和 proxy.apk,这证实了“外壳加载器+内嵌应用”的经典加固模式。其中:

  • main.apk​ 很可能是主要的应用程序模块,包含用户界面和核心逻辑。

  • proxy.apk​ 可能是一个代理或通信模块,用于处理网络请求、与服务器交互或管理插件。

3.2. 脚本驱动与图像识别

  • script.lr:这是一个关键文件。.lr扩展名常见于加密或打包的Lua脚本。这强烈表明该应用的大部分业务逻辑是用Lua编写的,并通过脚本引擎动态执行。逆向的关键之一就是解密和分析此脚本。

  • eng.traineddata:这是 Tesseract OCR 引擎的英文语言训练数据文件。这意味着应用具备文字识别(OCR)功能,例如从图片中提取文字、验证码识别等。

  • luasocket_arm.zipluasocket_x86.zip:这是Lua的网络库luasocket,针对ARM和x86架构分别打包。它使得Lua脚本能够进行网络通信。

3. 多架构原生保护

lib目录下包含 armeabi-v7a(32位ARM设备) 和 x86(模拟器) 两个子目录,其中应包含加固厂商的 libsc*.so​ 系列保护库。这确保了应用在真机和模拟器上都能运行并被保护。

 

4.关键发现与深度分析

  1. 保护核心 (libsc*.so)

    • 文件极小(5-6KB),这极不寻常。通常,完整的加解密逻辑库不会这么小。

    • 推测:这四个文件可能只是“桩”模块“加载器”。它们的主要功能是:

      • 动态加载隐藏在 assets/目录中(如文件 0, 1, 2)的真正、体积更大的保护逻辑。

      • 实现反调试、环境检测等轻量级检查。

      • 提供一个极简的接口,供外壳的 classes.dex调用,从而启动整个保护流程。

  2. 功能核心 (libopencv_java.so)

    • 体积巨大(armeabi-v7a版10MB,x86版36MB),这证实了OpenCV计算机视觉库被完整打包。

    • 作用:这是实现二维码识别、图像特征匹配、人脸检测、图片预处理等核心功能的引擎。这个CrackMe的挑战很可能围绕“图像识别”展开。

  3. 专用OCR库 (libocapi.so)

    • 结合 assets/eng.traineddata文件,说明应用除了通用的OpenCV,还集成了一款专用的OCR引擎,用于高精度文字提取。这可能是验证的另一个维度。

  4. 辅助模块 (libassist.so)

    • 从名称推测,可能是实现某些工具函数、算法或作为libopencv_java.solibocapi.so之间的桥梁。

  5. 多架构支持

    • 同时提供 armeabi-v7a(32位真机) 和 x86(模拟器) 版本,说明开发者考虑了app在模拟器中使用的场景。x86​ 版本的 libopencv_java.so更大,是因为模拟器环境不同。

 

所以这是一个典型的、多层次的、功能指向明确的商业级加固样本,其复杂性和完整性远超普通“破解练习”,极具学习和实战价值。

好的这节课就先讲这两个工具,简单总结一下:

 

五、实战查壳流程建议

新手推荐流程

  1. 第一步:使用ApkScan-PKID快速扫描

  2. 第二步:使用Detect It Easy (DIE)快速扫描并分析

  3. 第三步:如有疑问,手动解压检查lib目录

专业分析流程

  1. 初步筛查:ApkScan-PKID或DIE

  2. 在线验证:上传到Virustotal对比

  3. 手动确认:解压分析文件结构

  4. 深度分析:使用专业工具进一步分析

查壳结果记录表

建议建立自己的样本库,记录查壳结果:

应用名称

版本

文件大小

加固状态

加固厂商

特征文件

检测工具

应用A

v3.2.1

68MB

已加固

腾讯乐固

libmain.so

ApkScan

应用B

v5.1.0

42MB

未加固

-

-

手动验证

应用C

v2.0.3

35MB

已加固

360加固

libjiagu.so

DIE

六、重要安全建议

1. 虚拟机操作

强烈建议在虚拟机中进行所有逆向操作:
- 使用VMware或VirtualBox创建隔离环境
- 定期创建快照,方便恢复
- 避免在主力机上操作

2. 样本管理

  • 建立独立的样本库目录

  • 按加固类型分类存放

  • 记录每个样本的检测结果

  • 定期更新样本库

3. 工具更新

  • 定期更新查壳工具

  • 关注新的加固技术

  • 参与安全社区讨论

七、常见问题解答

Q1:所有工具都检测不到加固,是不是就没加固?

不一定。可能是:

  1. 使用了新型或小众加固方案

  2. 加固特征被隐藏或修改

  3. 工具特征库未更新

解决方法:手动解压分析,特别关注lib目录和AndroidManifest.xml。

Q2:不同工具检测结果不一致怎么办?

正常现象。不同工具的检测引擎和特征库不同。

建议

  1. 以手动分析结果为准

  2. 使用多个工具交叉验证

  3. 参考在线平台的检测结果

Q3:如何判断加固强度?

参考指标

  1. 加固厂商:主流厂商>小众厂商

  2. 特征复杂度:多层保护>单层保护

  3. 反调试措施:有反调试>无反调试

  4. 代码混淆程度:高级混淆>简单混淆

八、学习资源推荐

学习社区

样本获取

  • 应用商店历史版本

  • 第三方APK下载站

  • 开源应用(对比加固前后)

九、总结

查壳是安卓逆向的第一步,也是至关重要的一步。通过本文介绍的工具和方法,我们可以:

  1. 快速判断APK是否被加固

  2. 准确识别加固厂商和类型

  3. 选择合适的逆向策略和方法

记住:没有完美的加固,只有还没找到的漏洞。掌握查壳技能,是我们逆向之路上的第一把钥匙。

 

posted on 2026-01-09 09:24  shaun88  阅读(314)  评论(0)    收藏  举报

导航