元芳科普 || 一个加固apk文件的破解之路

移动安全 2年前 (2022) admin
678 0 0
元芳科普 || 一个加固apk文件的破解之路


刷单诈骗中下载app是诈骗分子的惯用套路,当破案线索仅一个app时我们该如何开展工作呢?app可以为我提供哪些线索?


元芳科普 || 一个加固apk文件的破解之路


1

手机应用分析


办案过程往往很容易获得犯罪工具,例如受害人提供的某个诈骗软件,但是对其进行取证,找到证据链条却是困难重重;当我们对app进行侦查研究时,不能仅仅局限于apk本身,可以结合静态分析和动态分析。


静态分析在不运行代码的方式下,观察分析文件信息,在Android 平台上,静态分析就是分析apk安装包;动态分析在运行代码的情况下,通过跟踪分析相关的内存,如获取域名或IP等,挖掘可能存在的漏洞


静态分析通过反编译apk文件,分析其中的权限、组件、敏感函数等信息,这些可以弥补动态分析中因未触发恶意行为而漏掉的行为;反编译文件就是使APK变成我们可以阅读理解的文件,本次文章我们将重点为大家讲解静态分析的基础知识并分享一个AndroidManifest.xml加固分析的实际案例。



2

APK静态分析


APK (Android application package),Android应用程序包,是一个标准的 ZIP 文件,即 1.apk == 1.zip。


1

获取apk的方式


1. 通过下载链接下载apk文件;


2.安卓手机例如华为、小米可直接分享apk文件;


例如小米手机:长按app出现分享按钮:


元芳科普 || 一个加固apk文件的破解之路


可以将apk文件微信、QQ等应用内,如果分享至微信,后续解析文件需要将后缀更为.apk形式:


元芳科普 || 一个加固apk文件的破解之路


3.执行adb命令获取apk安装包;


第一步:下载并安装ADB

第二步:打开命令窗口执行adb命令


确定adb的安装位置


如果adb安装在D盘,需要进入到D盘执行命令,如下命令框输入d:


元芳科普 || 一个加固apk文件的破解之路


执行查询应用列表的命令


查看是否有root权限:adb shell


元芳科普 || 一个加固apk文件的破解之路


查看所有应用列表:adb shell pm list packages


元芳科普 || 一个加固apk文件的破解之路


查看系统应用列表:adb shell pm list packages -s


元芳科普 || 一个加固apk文件的破解之路


查看点三方应用列表:adb shell pm list packages -3:


元芳科普 || 一个加固apk文件的破解之路


结果示例


元芳科普 || 一个加固apk文件的破解之路


执行查询apk存储路径


根据包名找出apk在内部存储空间的路径:adb shell pm path com.taobao.idlefish(你需要查询的包名)


执行导出命令


使用adb pull命令将apk文件导出:

adb pull 

/data/app/com.taobao.idlefish-1/com.taobao.idlefish(你需要导出的apk文件的路径)


2

静态分析工具


手机应用分析


无糖浏览器的手机应用分析系统在不断升级更新后,已经可以破解大部分apk文件,因此,在破案过程中,可以直接上传解析试一下,该应用是将apk文件解压,然后将其中相关文件反编译,提取反编译之后的文件中有利于下一步工作的关键信息。界面展示如下:


基础信息


元芳科普 || 一个加固apk文件的破解之路


接入SDK信息


元芳科普 || 一个加固apk文件的破解之路


域名/IP信息


元芳科普 || 一个加固apk文件的破解之路


虚拟身份信息


元芳科普 || 一个加固apk文件的破解之路


签名信息


元芳科普 || 一个加固apk文件的破解之路


应用权限


元芳科普 || 一个加固apk文件的破解之路


apk反编译


当然除了无糖浏览器自带的工具可以反编译,还可以使用其他工具或提取方式例如:


使用工具


1. apktool (获取资源文件):

使用apktool工具查看apk的xml文件、AndroidManifest.xml和图片等;


2. dex2jar(源码文件获取):

classes.dex转换成jar包;


3. jd-gui (源码查看):

查看APK中classes.dex转化成出的jar文件;


其他方式


1)解压:将后缀apk改成zip文件,解压之后找到【AndroidManifest.xml】文件,此时该文件为二进制文件,我们可以准备一个Java包,使用这个也可以将.xml文件解析成明文。


apk分析


APK 的组成有 Dex 文件,资源,资源表和签名摘要信息等四部分组成,这四部分是不可或缺的,不然任何一个 OS都无法正常的运行你带 Activity 的 Android 应用。


元芳科普 || 一个加固apk文件的破解之路


META-INF 文件夹


用于保存 App 的签名和校验信息,以保证程序的完整性。当生成 APK 包时,系统会对包中的所有内容做一次校验,然后将结果保存在这里。而手机在安装这一 App 时还会对内容再做一次校验,并和 META-INF 中的值进行比较,以避免 APK 被恶意篡改。


res 文件夹


存放我们各种资源文件的地方,有图片,字符串,动画,音频等,还有各种形式的XML文件


Androidmanifest.xml 文件


AndroidManifest.xml是Android应用的入口文件,它描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的数据和启动位置。除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)


•文件结构


元芳科普 || 一个加固apk文件的破解之路


• <manifest>元素


包名:package也代表着唯一的application ID,用来发布应用。



元芳科普 || 一个加固apk文件的破解之路


•<uses-< span=””>permission> 元素:android限定了系统资源的使用,想网络设备、SD卡、录音设备等,如果希望应用去使用任何系统资源,都必须申请android的权限,这就是的作用。


格式:<user-permission android:name=”string” <=”” span=””>


元芳科普 || 一个加固apk文件的破解之路


•元素:<application>此元素描述了应用的配置。这是一个必备的元素,它包含了很多子元素来描述应用的组件,它的属性影响到所有的子组件。许多属性(例如icon、label、permission、process、taskAffinity和allowTaskReparenting)都可以设置成默认值。


元芳科普 || 一个加固apk文件的破解之路


• <activity>元素:该元素声明一个实现应用可视化界面的 Activity(Activity类子类)。这是元素中必要的子元素。所有 Activity 都必须由清单文件中的元素表示。任何未在该处声明的 Activity 对系统都不可见,并且永远不会被执行。


元芳科普 || 一个加固apk文件的破解之路


• <intent-filter>元素:指明这个 activity 可以以什么样的意图(intent)启动


元芳科普 || 一个加固apk文件的破解之路


•uses-sdk 描述应用所需的版本


元芳科普 || 一个加固apk文件的破解之路


•SDK配置信息:常见的SDK大多都会在该文件中写入配置信息,如APPID,APPSECERT等信息


元芳科普 || 一个加固apk文件的破解之路


注:如果您需要更全面的学习AndroidManifest.xml 是每个文件的相关信息,可以通过网站学习


网址为:https://www.cnblogs.com/shujk/p/14961572.html


dex 文件


Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据;


在进行apk分析时,有时需要分析数据包,可是有些数据包已经被加了防护,例如修改了某个校验参数,导致该apk不能通过互联网工具进行解析,但是可以正常在手机安装打开,此时我们需要对apk文件进行手动分析,找到对抗点然后修复文件。


3

某APK文件的

AndroidManifest.xml

加固案例


1

案例背景


元芳近期在整理案件时,发现一个比较经典的案例,案件信息采集如下:


受害人momo的邮箱经常会收到工作邮件,所以都会点开进去看看,8月1日早上的时候momo顺手点了个邮件,邮件内容为抖音点赞兼职的广告,闲的没事就加了群,开始管理员会直接在群里派单,并且有其他用户晒到账截图,完成5单以后,群管理员让大家下载一个app,说后续的任务直接在app里完成,群里也再派单,momo出于好奇便下载了管理员推荐的app接任务,完成任务后,momo打算体现app上的奖励,一个客服弹窗提示要缴纳保证金才能进行提现,保证金从几十元到后来变成几百元、几千元,直到momo发现自己银行卡提示余额不足时才意识到自己被骗了,累计损失了1w元,于是报警,提交了线索


元芳科普 || 一个加固apk文件的破解之路


元芳发现无糖浏览器的手机应用分析系统无法正常解析该APK文件,也无法使用apktool进行正常的分析工作,AndroidManifest.xml无法被解出,报错如下:


元芳科普 || 一个加固apk文件的破解之路


•通过搜索相关错误,推测AndroidManifest.xml可能被针对性

进行了加固处理,首先使用apktool导出AndroidManifest.xml,加上 -r 参数


元芳科普 || 一个加固apk文件的破解之路


在test目录中,可以找到AndroidManifest.xml文件,

可以使用在线的 https://hexed.it/进行查看,但是无法清晰查看AndroidManifest的结构,我们可以改用010editor进行查看。


2

加固分析


使用010editor查看文件


1. 使用010editor

打开AndroidManifest.xml文件


元芳科普 || 一个加固apk文件的破解之路


2. 打开模板文件 AndroidManifest.bt ,

open template –> 选择第5步下载的 bt文件。


元芳科普 || 一个加固apk文件的破解之路


3. 运行模板文件


元芳科普 || 一个加固apk文件的破解之路


4. 运行结果如下


元芳科普 || 一个加固apk文件的破解之路


使用AXMLPrinter2排查错误


为了进一步分析AndroidManifest.xml是哪里出了问题,下载 AXMLPrinter2.jar 对AndroidManifest.xml文件进行分析,下载文件解压备用


1. 使用AXMLPrinter2打开


元芳科普 || 一个加固apk文件的破解之路


2. 发现报错如下


元芳科普 || 一个加固apk文件的破解之路


3. 这个报错的意思是程序希望读取到的是 0x80003,结果却读取到一个 0x80000,0x080003 即 08 00 03,AndroidManifest.xml  是小端模式,所以在文件里存储的应该是 03 00 08,而 03 00 08 00 是 一个正常的 AndroidManifest.xml 的 magic number(用来标记这个文件是一个 AndroidManifest.xml 的数字)。


所以,通过这个报错,我们可以知道目标 xml文件,将 magic number修改成了AXMLPrinter2 不认识的 00 00 08 00,正确的应该是 03 00 08 00。如下图所示:


元芳科普 || 一个加固apk文件的破解之路

恶意的xml文件


元芳科普 || 一个加固apk文件的破解之路

正常的xml文件


当我们遇到这种恶意修改参数时,我们可以进行三个修复步骤:


•修复1:使用 010editor 将 magic number  改为正常的 03 00 08 00


修复后再次运行AXMLPrinter2,发现依然报错。


元芳科普 || 一个加固apk文件的破解之路


NegativeArraySizeException,这个错误应该是指创建数组时,数组的大小使用了负数。说明目标xml可能还修改了其它位置,可以肉眼对比以下恶意的xml和正常的xml文件,是否还有不同。


元芳科普 || 一个加固apk文件的破解之路

stylePoolOffset 被修改


简洁界面展示模式,可方便用户快速的进行APK文件上传和最近分析文件记录的查看。


•修复2:使用010editor将scStylePoolOffset修复为 00 00 00 00


元芳科普 || 一个加固apk文件的破解之路


修复后,再次运行AXMLPrinter2,报出新的错误,说明上一个错误,正是由于scStylePoolOffset引起。


元芳科普 || 一个加固apk文件的破解之路


编写脚本解析STRINGCHUNK


再修复以上两处后,发现依然无法正常解析,但是AXMLPrinter2的报错信息不明确,已经无法继续进行错误排查,为了更好的排查问题,我们使用nodejs自行编写脚本,尝试对AndroidManifest.xml里的字符串部分进行解析


•STRINGCHUNK解析说明


元芳科普 || 一个加固apk文件的破解之路


例如:我们想知道第一个字符串是什么?


1. 从scStringOffsets[0],可以得到第一个字符串的相对位置(偏移),是 0


2. 那么第一个字符串的真实位置为 基准位置(scStringPoolOffset) + 相对位置 = 1392 + 0。


3. 由于还有一个文件头(8个长度),所以这个字符串在整个文件里的位置 = 真实位置+头长度 = 1392 + 8 = 1400 (16进制 = 0x578)


4. 所以我们到文件的 0x578处,可以查看对应的字符串。


元芳科普 || 一个加固apk文件的破解之路


STRINGCHUNK是用来存放androidmanifest.xml里所有用到的字符串的一块区域,紧跟在 header后面。


元芳科普 || 一个加固apk文件的破解之路


自行写编写脚本如下:


元芳科普 || 一个加固apk文件的破解之路


在解析stringchunk时发生错误,报错如下,说明在stringchunk部分存在问题:


元芳科普 || 一个加固apk文件的破解之路


首先,我们根据stringchunk的scStringCount显示,一共有2901个字符串(string)


元芳科普 || 一个加固apk文件的破解之路


但是使用js代码,读取索引等于341号的字符串时发生错误。使用010Editor查看索引等于341号的字符串位置。


元芳科普 || 一个加固apk文件的破解之路


可以看到这个字符串的位置位于文件的第7602181个偏移处,而整个文件的长度都只有10W字符长度,说明从341号索引开始的字符串,应该是无效的,也就是被恶意插入的。


所以可以推测出,实际字符串的个数,应该只有341个(索引 0 -> 索引 340)。


修复3:将scStringCount修改为 341


元芳科普 || 一个加固apk文件的破解之路


修改完成后,重新运行模板(快捷键:F5)!


运行模板完成后,再次查看 scStringOffset,可以看到,索引号最多到 340了


使用编辑器修复xml


经过这3个修复之后,再次运行AXMLPrinter2,可以发现,不报错了,能够正常运行了,但是会输出一堆非预期的字符,将输出结果保存下来,


元芳科普 || 一个加固apk文件的破解之路


使用编辑器(例如vscode)打开result.txt,然后切换为GBK编码,结果如下图所示:


元芳科普 || 一个加固apk文件的破解之路


吃吗小伙子。。。。。吃!!!


通过查看以上result.txt,可以知道这里实际上是将xml里的 namespace名称(xmlns:),改成了一个超长的字符串,让xml看起来不可读。通常情况下,xmlns = android,那么解决方法也简单,我们只需要将xml里的这些“恶意”字符串全部替换为正常的android即可:


元芳科普 || 一个加固apk文件的破解之路


使用vscode编辑result.txt (编码选择GBK)进行正则替换:


元芳科普 || 一个加固apk文件的破解之路


最后可以看到xml回归正常:


元芳科普 || 一个加固apk文件的破解之路


4

无糖浏览器下载方式


  //  

无糖浏览器-您身边的办案助手。


你可以根据操作系统的不同,从下面的地址下载最新的安装包程序http://browser.nosugar.tech


下载成功后,点击无糖浏览器的程序即可启动,双击后点击“接受”按钮,再点击“安装”即可成功安装。


温馨提示:注册时可使用邀请码【YZZAIJG4NP9J】快速开通完整权限哟。


 无 糖 浏 览 器 


如有疑问,可以扫描下方二维码,进入无糖学院


元芳科普 || 一个加固apk文件的破解之路

原文始发于微信公众号(无糖反网络犯罪研究中心):元芳科普 || 一个加固apk文件的破解之路

版权声明:admin 发表于 2022年9月8日 下午6:33。
转载请注明:元芳科普 || 一个加固apk文件的破解之路 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...