【逆向分析篇】APK逆向脱壳过程

【逆向分析篇】APK逆向脱壳过程

简单写下Android应用(APK)的逆向脱壳过程—【蘇小沐】

文章目录

    • 【逆向分析篇】APK逆向脱壳过程
    • (一)Apk的文件结构
      • 1、META-INF目录
        • 1)MANIFEST.MF文件
        • 2)CERT.SF文件
        • 3)CERT.RSA文件
      • 2、classes.dex - dx文件
      • 3、res目录
      • 4、resources.arsc
    • (二)Apk静态分析
      • 1、样本详情
        • 1)样本来源
        • 2)样本包名及校验
      • 2、Apk包含调用权限及其SDK情况
      • 3、权限列表
      • 4、Apk查壳
    • (三)APK动态脱壳
      • 1、ADB命令连接模拟器
      • 2、push脱壳工具到指定位置
      • 3、APK提权
      • 4、执行脱壳程序
      • 5、退出
      • 6、分析脱壳后的.dex文件
      • 总结

(一)Apk的文件结构

App和Apk的区别,App是应用程序(Application)的缩写,包含Apk;而Apk是Android应用程序包(Android Application Package)的缩写,类似Symbian Sis或Sisx的文件格式,通过将APK文件直接传到Android模拟器或Android手机中执行即可安装;是Android操作系统使用的一种应用程序包文件格式。

一个完整的Apk文件包含有被编译的代码文件(.dex 文件)、文件资源(resources)、 assets、证书(certificates)、和清单文件(manifest file)。
在这里插入图片描述

1、META-INF目录

META-INF目录是Android 签名认证的目录,主要包含CERT.RSA、CERT.SF、MANIFEST.MF这三个文件。

Android机制要求会对每一个Apk文件都进行签名,在安装Apk文件的时候,Android系统通过对比该Apk签名信息程序的完整性,来判断程序是否有被恶意修改、添加、删除等操作,从而决定是否可以安装,该方法在一定的程度上是安全的,能保证自己的APK没有被其他人恶意的修改。

1)MANIFEST.MF文件

MANIFEST.MF文件Apk的摘要文件。程序遍历Apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。

2)CERT.SF文件

CERT.SF文件对摘要的签名文件。对前一步生成的MANIFEST.MF,使用SHA1-RSA算法,用开发者的私钥进行签名。在安装时只能使用公钥才能解密它。解密之后,将它与未加密的摘要信息(即,MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被异常修改。

系统在对程序进行验证的时候,用开发者公钥对不正确的签名文件进行解密,得到的结果和摘要文件(MANIFEST.MF)对应不起来,所以不能通过检验,不能成功安装文件。

3)CERT.RSA文件

CERT.RSA文件中保存了公钥、所采用的加密算法等信息;系统对签名文件进行解密,所需要的公钥就是从这个文件里取出来的。

2、classes.dex - dx文件

classes.dex - dx编译后的文件格式,class.dex本来是java编译出来的.classes文件,再次通过dx编译后的格式。要还原出Android源码,首先从这个文件下手,用特殊工具把.dex文件还原成.jar,再利用查看jar格式文件的工具,即可查看源代码。

3、res目录

res目录是Android 程序使用的资源文件都存在这个目录下,如图片文件等。

4、resources.arsc

resources.arsc,是编译好的二进制格式的资源信息,应用程序的语言文件。Apk文件在打包时,strings.xml中的字符串被加密存储为resource.arsc文件保存到Apk程序包中,当Apk被成功反编译后这个文件也被解密出来,可以透过这软件用AndroidResEdit等工具来进行编译。

(二)Apk静态分析

1、样本详情

1)样本来源

官网下的豌豆荚应用市场,链接https://www.wandoujia.com/apps/7833706。
在这里插入图片描述

图2-1 下载页面

2)样本包名及校验

在司法鉴定中,需要严格记录,以便随时可以回溯所有的操作,记录唯一性,下面对该多开Apk记录信息。

名称信息
名称com.xzj.multiapps_2.1.0_21000.apk
包名com.xzj.multiapps
版本2.1.0
APK入口com.xzj.multiapps
文件大小18362493字节
MD5a32d967182a8502d20003335478428f7
SHA-256cfe6e598278706502b1a97587e2a051002c9c91bd8501ef25238d82bf8663050

模拟器安装Apk,打开如下。
在这里插入图片描述
软件界面
在这里插入图片描述

2、Apk包含调用权限及其SDK情况

在Android诞生的那天起,Apk始终以zip作为文件格式。这样我们用解压软件直接解压Apk文件,就可以直接看到Apk的目录结构,下图是直接解压后的应用目录。
在这里插入图片描述

其中,AndroidManifest.xml是非常重要的一个文件,它是Android的清单文件,该文件中存放了Apk的大量配置信息,它记录着软件的一些基本信息,包括软件的包名、版本号、包名、应用权限、组件配置等。

文件是被加密存储进了Apk文件中的,直接解压出来的AndroidManifest.xml并不能直接看到其中的内容;我们需要使用gadx-gui等特定的工具来打开Apk,可以看到AndroidManifest.xml记载的程序各种信息。

gadx-gui工具打开Apk,可以看到AndroidManifest.xml记载的程序版本号、包名、应用请求权限等信息。
在这里插入图片描述

3、权限列表

很多Android应用和游戏中会存在一些恶意收集用户隐私的行为,Google对Android的"权限等级"分为"normal"、“dangerous”、“signature”、“signature|system”(或signatureOrSystem)四大类。

jadx-gui打开Apk,可以看到AndroidManifest.xml 标签内使用里面有很多的声明,"android.permission.xxx"的就是应用程序申请的具体权限要求,在权限列表中,我们可以看到,应用申请了哪些请求,下面将该Apk所要申请的(部分)权限列表如下。

许可名称实现功能
android.permission.INTERNET连接网络(2G或3G)
android.permission.ACCESS_WIFI_STATE读取WiFi的连接状态
android.permission.WRITE_EXTERNAL_STORAGE写外部存储器(如:SD卡)
android.permission.ACCESS_FINE_LOCATION通过GPS芯片接收卫星的定位信息(高精度)
android.permission.ACCESS_COARSE_LOCATION通过WiFi、基站获取设备的经纬度信息(粗略定位)
android.permission.CHANGE_WIFI_STATE改变WiFi的连接状态
android.permission.ACCESS_NETWORK_STATE读取当前的网络信息状态,判断是否有效
android.permission.CHANGE_NETWORK_STATE改变网络状态
android.permission.READ_PHONE_STATE读取手机状态
android.permission.CAMERA访问照相机设备
android.permission.FLASHLIGHT访问闪光灯
android.permission.ACCESS_GPS获取GPS
android.permission.READ_EXTERNAL_STORAGE允许应用程序从外部存储读取
android.permission.REQUEST_INSTALL_PACKAGES允许应用程序请求安装软件包
android.permission.READ_LOGS读取系统底层日志
android.permission.RECEIVE_MMS接收彩信
android.permission.RECEIVE_SMS接收短信
android.permission.RECEIVE_WAP_PUSH接收WAP_PUSH信息
android.permission.SEND_SMS发送短信
android.permission.READ_SMS读取短信内容
android.permission.WRITE_SMS写短信
android.permission.PROCESS_OUTGOING_CALLS监视,修改或放弃播出电话
android.permission.CALL_PHONE打电话
android.permission.READ_CALL_LOG读取通话记录
android.permission.WRITE_CALL_LOG写入通话记录
android.permission.READ_SOCIAL_STREAM读取用户的社交信息流
android.permission.READ_PROFILE访问用户个人资料
android.permission.WRITE_PROFILE写入用户个人资料
android.permission.READ_USER_DICTIONARY读取用户词典
android.permission.WRITE_USER_DICTIONARY向用户词典中写入新词
android.permission.AUTHENTICATE_ACCOUNTS通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS允许程序访问额外的程序提供者指令
android.permission.CHANGE_WIFI_MULTICAST_STATE改变WiFi多播状态
android.permission.MOUNT_UNMOUNT_FILESYSTEMS挂载、反挂载外部文件系统
android.permission.BATTERY_STATS获取电池电量统计信息
android.permission.BODY_SENSORS允许传感器
android.permission.DISABLE_KEYGUARD禁用键盘锁
android.permission.EXPAND_STATUS_BAR允许程序扩展或收缩状态栏
android.permission.GET_ACCOUNTS访问GMail账户列表
android.permission.MANAGE_ACCOUNTS管理AccountManager中的账户列表
android.permission.CHANGE_CONFIGURATION允许当前应用改变配置,如定位
android.permission.WRITE_SETTINGS读写系统设置项
android.permission.GET_TASKS获取当前或最近运行的应用
android.permission.KILL_BACKGROUND_PROCESSES结束后台程序
android.permission.REORDER_TASKS重新排序系统Z轴运行中的任务
android.permission.RECORD_AUDIO录制声音通过手机或耳机的麦克
android.permission.BLUETOOTH连接配对过的蓝牙设备
android.permission.BLUETOOTH_ADMIN发现和配对新的蓝牙设备
android.permission.NFC执行NFC操作,用于移动支持
android.permission.MODIFY_AUDIO_SETTINGS修改声音设置信息
android.permission.VIBRATE允许震动
android.permission.USE_FINGERPRINT允许程序使用指纹设备
android.permission.CLEAR_APP_CACHE清除应用缓存
android.permission.GET_PACKAGE_SIZE获取应用的文件大小
android.permission.WRITE_SYNC_SETTINGS写入Google在线同步设置
android.permission.READ_SYNC_SETTINGS读取同步设置,读取Google在线同步设置
android.permission.READ_SYNC_STATS读取同步状态,获得Google在线同步状态
android.permission.SUBSCRIBED_FEEDS_READ访问订阅信息的数据库
android.permission.SUBSCRIBED_FEEDS_WRITE写入或修改订阅内容的数据库
android.permission.WRITE_CALENDAR允许程序写入用户的日程信息
android.permission.READ_CALENDAR允许程序读取用户的日程信息
android.permission.READ_CONTACTS允许应用访问联系人通讯录信息
android.permission.WRITE_CONTACTS允许应用写入联系人通讯录信息
android.permission.RESTART_PACKAGES结束任务通过restartPackage(String)方法,该方式将在外来放弃
android.permission.SET_TIME设置系统时间
android.permission.SET_TIME_ZONE设置系统时区
android.permission.SET_WALLPAPER设置桌面壁纸
android.permission.SET_WALLPAPER_HINTS设置壁纸建议
android.permission.USE_SIP允许程序使用SIP视频服务
android.permission.WAKE_LOCK允许程序在手机屏幕关闭后后台进程仍然运行
android.permission.SYSTEM_ALERT_WINDOW显示系统窗口
android.permission.SYSTEM_OVERLAY_WINDOW关闭系统窗口
android.permission.RECEIVE_BOOT_COMPLETED允许开机自启
android.permission.INSTALL_PACKAGES允许程序安装应用
android.permission.DELETE_PACKAGES允许程序删除应用
android.permission.CLEAR_APP_USER_DATA清除应用的用户数据
android.permission.WRITE_MEDIA_STORAGE写入媒体权限
android.permission.DEVICE_POWER允许访问底层电源管理
android.permission.BIND_APPWIDGET允许一个程序告诉appWidget服务需要访问小插件的数据库
android.permission.ACCOUNT_MANAGER获取账户验证信息,主要为GMail账户信息,只有系统级进程才能访问的权限
android.permission.READ_OWNER_DATA允许程序读取所有者数据
android.permission.WRITE_OWNER_DATA允许程序写入但不读取所有者数据
android.permission.ACCESS_WIMAX_STATE建立或中断 WiMAX 网络连接
android.permission.ACCESS_DOWNLOAD_MANAGER允许程序以管理员下载
android.permission.CHANGE_WIMAX_STATE更改 WiMAX 状态

4、Apk查壳

由于Android应用程序的代码都存储在dex文件中,在前面jadx-gui工具打开APK时,看到有qihoo.util,其使用某数字公司的壳进行了软件加固,导致我们无法直接查看.dex文件;我们要想得到dex文件,首先对该Apk进行脱壳操作,然后提取解密后的dex进行功能分析。( jadx-gui查看已加壳)
在这里插入图片描述

如果不清楚的话程序是否加壳,加了什么壳,我们可以借助Apktool Box等工具查壳,打开Apktool Box工具,将该Apk文件拖进去,点击查壳按钮,我们可以看到程序加了那种壳,如图显示该软件使用了360加固。
在这里插入图片描述

(三)APK动态脱壳

下面我们进行脱壳,首先打开模拟器安装好Apk文件,连接好模拟器后,进行脱壳操作,工具使用的是夜神模拟器,脱壳工具是drizzleDumper。

1、ADB命令连接模拟器

首先,启动模拟器安装需要脱壳的应用程序,ADB命令连接模拟器,输入命令:“adb connect 127.0.0.1:62001”。
在这里插入图片描述

2、push脱壳工具到指定位置

接着adb 命令push drizzleDumper到模拟器的/data/local/tmp目录下,输入命令:“adb push drizzleDumper /data/local/tmp”。
在这里插入图片描述

3、APK提权

然后输入命令"adb shell chmod 0777 /data/local/tmp/drizzleDumper"、“adb shell”。
在这里插入图片描述

输入命令:“adb shell”

输入命令:“cd/data/local/tmp”

输入命令:“./drizzleDumper com.xzj.multiapps” 。
在这里插入图片描述

4、执行脱壳程序

这时候,回到模拟器,打开要脱壳的App,后就开始自动脱壳操作,如图所示为脱壳完成。
在这里插入图片描述

5、退出

最后输入命令:"exit"退出该模式。
在这里插入图片描述

6、分析脱壳后的.dex文件

我们回到模拟器的/data/local/tmp文件夹目录下,现在可以看到多了一个"XXX.dex"的文件(有的软件脱壳后存在多个.dex文件),说明已经反编译成功,脱壳出来了。
在这里插入图片描述

现在我们就可以用jadx-gui分析解密的com.xzj.multiapps_dumped_35.dex文件了。

在这里插入图片描述

总结

逆向是一个漫长的过程,以上只简单的对当前主流脱壳方法进行了脱壳分析,在网络的发展中,各种高级加壳、花壳、混淆技术等越来越高级,进阶Apk脱壳技术通过dump内存中处于解密状态的dex,进行修复分析,普通的逆向将难以应对。

公众号回复关键词【APK逆向】自动获取资源合集,如链接失效请留言,便于及时更新。

【声明:欢迎转发收藏,喜欢记得点点赞!转载引用请注明出处,著作所有权归作者 [蘇小沐] 所有】

【注:本文的软件资源等收集于官网或互联网共享,如有侵权请联系删除,谢谢!】

记录
开始编辑:2019年 12月 25日
最后编辑:2019年 12月 25日

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/260681.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HackTheBox - Medium - Windows - Aero

Aero 这个机器利用了今年比较新的cve,关于windows11的漏洞,类似于lnk、scf,但这个危害更高,通过易受攻击的windows11 利用theme、msstyles来实现RCE. Aero 是一台中等难度的 Windows 机器,最近有两个 CVE:…

手把手教你创建一个实时互动的AI数字人直播间!

数字人是什么?数字人是利用人工智能技术实现与真人直播形象的1:1克隆,即克隆出一个数字化的你自己,包括你的形象、表情、动作和声音都会被克隆下来,让你能够拥有接近真人的表现力。 1.首先您需要独立部署青否数字人SaaS系统&#…

2023 英特尔On技术创新大会直播 | 窥探未来科技的边界

2023 英特尔On技术创新大会直播 | 窥探未来科技的边界 写在最前面观后感其他有趣的专题课程 写在最前面 嘿,你是不是对科技和创新充满好奇?2023 英特尔 On 技术创新大会线上活动邀请你一起探索最前沿的科技世界! 这不仅是一场普通的聚会&…

关于“Python”的核心知识点整理大全31

目录 12.4.2 在屏幕上绘制飞船 alien_invasion.py ​编辑12.5 重构:模块 game_functions 12.5.1 函数 check_events() game_functions.py alien_invasion.py 12.5.2 函数 update_screen() game_functions.py alien_invasion.py 12.6 驾驶飞船 12.6.1 响应…

CVE-2023-33246 RocketMQ RCE漏洞

一、RocketMQ简介 RocketMQ是一款纯java、分布式、队列模型的开源消息中间件,主要用于在分布式系统中进行异步消息传递,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等功能。 RocketMQ有四个核心组成部分: NameServer&#xff1…

HTML5刷题笔记

在 HTML5 中,onblur 和 onfocus 是:事件属性 onblur 和 onfocus 属于焦点事件: onblur:失去焦点 onfocus:获取焦点 HTML5事件window 事件属性 针对 window 对象触发的事件: onafterprint script 文档…

数据结构课程设计

计算机科学与技术系 《数据结构课程设计》评分表 设计题目 39. 如下图所示,编写可视化算法将从顶点v能到达的最短路径长度为k的所有顶 点标记为红色(最短路径以路径上的边数计算)。 成绩 课 程 设 计 主 要 内 容 内容编写可视化算…

《网络设备配置与管理》综合训练,华为ensp测试,MSTP\VRRP\OSPF\RIP\BGP\路由引入

1.设备基础信息配置 (1)根据表2IPv4地址分配表,修订所有设备名称。 (2)根据公司网络规划,在所有交换机上创建VLAN10、VLAN20。为了保证不同交换机上的同一个VLAN的成员之间能够相互通信,需要配…

同一个数组中对象去重

封装方法 fn1 (tempArr) {this.echartList.map(item > {for (let i 0; i < item.data.length; i) {for (let j i 1; j < item.data.length; j) {if (item.data[i].deviceId item.data[j].deviceId && item.data[i].time item.data[j].time && it…

[网络安全]在win2000虚拟机上创建隐藏账户

手工创建隐藏账户 1.你需要一台win2000 2.winR->cmd->regedt32 增加HEY_LOACL_MACHINE\SAM\的权限,标头有安全&#xff0c;点击&#xff0c;然后勾选 3.新建账号&#xff0c;例如HiddenAccount$($表示在命令行下不现实此用户&#xff09; net user HiddenAccount$ 123456…

Linux:ELF 可执行文件的解析与其加载的原理

文章目录 ELF 可执行文件需要的前置知识ELF 可执行文件的程序头部表 加载可执行目标文件QA加载器如何工作&#xff1f; 参考 ELF 可执行文件 我们已经看到链接器如何将多个目标文件合并成一个可执行目标文件。我们的 C程序&#xff0c;开始时是一组 ASCII 文本文件&#xff0c…

实验4.3 动态路由RIPv2协议的配置

实验4.3 动态路由RIPv2协议的配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.配置交换机和路由器的接口的IP地址等参数。2.配置动态路由RIPv2协议&#xff0c;实现全网互通。 六、任务验收七、任务小结八、知识链接1&#xff0e;RIP协议简介2&#xff0e…

Linux开发工具——vim篇

vim开发工具的使用 文章目录 vim开发工具的使用认识vimvim常用三种模式vim正常模式命令集模式切换移动光标删除文字赋值替换撤销上一次操作更改跳到指定的行 vim末行模式命令集列出行号跳到文件中的某一行&#xff1a;保存文件离开vim查找字符&#xff1a; 总结题外话&#xff…

spring之面向切面:AOP(2)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》 《高效算法》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 一、二叉树的遍历1.1 链式结构二叉树的创建1.1 二叉树结构图 二、 前序遍历代码演示&#xff1a;2.1 前序遍历递…

万兆网络之疑难杂症(二)

症状&#xff1a;测线仪8芯全亮&#xff0c;网速只有百兆 某台计算机测速发现只有90多M/s速度&#xff0c;关于iperf测速可以参考之前的文章 万兆网络之线路测速 Win11系统查看网络属性为1000Mbps&#xff0c;还是扯皮的装修方&#xff0c;4个工位只布了2条线&#xff0c;还…

智慧安防视频监控EasyCVR如何通过回调接口向第三方平台推送RTSP视频通道离线通知

安防视频监控系统EasyCVR能在局域网、公网、专网等复杂的网络环境中部署&#xff0c;可支持4G、5G、WiFi、有线等方式进行视频的接入与传输、处理和分发。平台能将接入的视频流进行汇聚、转码、多格式输出和分发&#xff0c;具体包括&#xff1a;RTMP、RTSP、HTTP-FLV、WebSock…

海康威视IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)

漏洞介绍 海康威视IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版本存在操作系统命令注入漏洞&#xff0c;该漏洞源于文件/ph…

Linux网络编程(一):网络基础(下)

参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 网络编程 1. 协议的概念 1.1 什么是协议 从应用的角度出发&#xff0c;协议可理解为 “规则”&#xff0c;是数据传输和数据解释的规则 假设&#xff0c;A、B双方欲传输文件&#xff0c;规定&#xff1a; 第一次&#xff…

【Redis】五、Redis持久化、RDB和AOF

文章目录 Redis持久化一、RDB&#xff08;Redis DataBase&#xff09;触发机制如何恢复rdb文件 二、AOF&#xff08;Append Only File&#xff09;三、扩展 Redis持久化 面试和工作&#xff0c;持久化都是重点&#xff01; Redis 是内存数据库&#xff0c;如果不将内存中的数据…