刷单诈骗中下载app是诈骗分子的惯用套路,当破案线索仅一个app时我们该如何开展工作呢?app可以为我提供哪些线索?
1
手机应用分析
办案过程往往很容易获得犯罪工具,例如受害人提供的某个诈骗软件,但是对其进行取证,找到证据链条却是困难重重;当我们对app进行侦查研究时,不能仅仅局限于apk本身,可以结合静态分析和动态分析。
2
APK静态分析
APK(Androidapplicationpackage),Android应用程序包,是一个标准的ZIP文件,即1.apk==1.zip。
获取apk的方式
1.通过下载链接下载apk文件;
3.执行adb命令获取apk安装包;
第一步:下载并安装ADB
第二步:打开命令窗口执行adb命令
+
确定adb的安装位置
如果adb安装在D盘,需要进入到D盘执行命令,如下命令框输入d:
执行查询应用列表的命令
查看是否有root权限:adbshell
查看所有应用列表:adbshellpmlistpackages
查看系统应用列表:adbshellpmlistpackages-s
查看点三方应用列表:adbshellpmlistpackages-3:
结果示例
执行查询apk存储路径
根据包名找出apk在内部存储空间的路径:adbshellpmpathcom.taobao.idlefish(你需要查询的包名)
执行导出命令
使用adbpull命令将apk文件导出:
adbpull
/data/app/com.taobao.idlefish-1/com.taobao.idlefish(你需要导出的apk文件的路径)
静态分析工具
基础信息
接入SDK信息
域名/IP信息
虚拟身份信息
签名信息
应用权限
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应用。
META-INF文件夹
用于保存App的签名和校验信息,以保证程序的完整性。当生成APK包时,系统会对包中的所有内容做一次校验,然后将结果保存在这里。而手机在安装这一App时还会对内容再做一次校验,并和META-INF中的值进行比较,以避免APK被恶意篡改。
res文件夹
存放我们各种资源文件的地方,有图片,字符串,动画,音频等,还有各种形式的XML文件
Androidmanifest.xml文件
·文件结构
·
包名:package也代表着唯一的applicationID,用来发布应用。
·
格式:
·元素:
·
·uses-sdk描述应用所需的版本
·SDK配置信息:常见的SDK大多都会在该文件中写入配置信息,如APPID,APPSECERT等信息
dex文件
Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据;
在进行apk分析时,有时需要分析数据包,可是有些数据包已经被加了防护,例如修改了某个校验参数,导致该apk不能通过互联网工具进行解析,但是可以正常在手机安装打开,此时我们需要对apk文件进行手动分析,找到对抗点然后修复文件。
3
某APK文件的
AndroidManifest.xml
加固案例
案例背景
元芳近期在整理案件时,发现一个比较经典的案例,案件信息采集如下:
元芳发现无糖浏览器的手机应用分析系统无法正常解析该APK文件,也无法使用apktool进行正常的分析工作,AndroidManifest.xml无法被解出,报错如下:
进行了加固处理,首先使用apktool导出AndroidManifest.xml,加上-r参数
在test目录中,可以找到AndroidManifest.xml文件,
加固分析
使用010editor查看文件
1.使用010editor
打开AndroidManifest.xml文件
2.打开模板文件AndroidManifest.bt,
opentemplate-->选择第5步下载的bt文件。
3.运行模板文件
4.运行结果如下
使用AXMLPrinter2排查错误
为了进一步分析AndroidManifest.xml是哪里出了问题,下载AXMLPrinter2.jar对AndroidManifest.xml文件进行分析,下载文件解压备用
1.使用AXMLPrinter2打开
2.发现报错如下
3.这个报错的意思是程序希望读取到的是0x80003,结果却读取到一个0x80000,0x080003即080003,AndroidManifest.xml是小端模式,所以在文件里存储的应该是030008,而03000800是一个正常的AndroidManifest.xml的magicnumber(用来标记这个文件是一个AndroidManifest.xml的数字)。
所以,通过这个报错,我们可以知道目标xml文件,将magicnumber修改成了AXMLPrinter2不认识的00000800,正确的应该是03000800。如下图所示:
恶意的xml文件
正常的xml文件
当我们遇到这种恶意修改参数时,我们可以进行三个修复步骤:
·修复1:使用010editor将magicnumber改为正常的03000800
修复后再次运行AXMLPrinter2,发现依然报错。
NegativeArraySizeException,这个错误应该是指创建数组时,数组的大小使用了负数。说明目标xml可能还修改了其它位置,可以肉眼对比以下恶意的xml和正常的xml文件,是否还有不同。
stylePoolOffset被修改
简洁界面展示模式,可方便用户快速的进行APK文件上传和最近分析文件记录的查看。
·修复2:使用010editor将scStylePoolOffset修复为00000000
修复后,再次运行AXMLPrinter2,报出新的错误,说明上一个错误,正是由于scStylePoolOffset引起。
编写脚本解析STRINGCHUNK
再修复以上两处后,发现依然无法正常解析,但是AXMLPrinter2的报错信息不明确,已经无法继续进行错误排查,为了更好的排查问题,我们使用nodejs自行编写脚本,尝试对AndroidManifest.xml里的字符串部分进行解析
·STRINGCHUNK解析说明
例如:我们想知道第一个字符串是什么?
1.从scStringOffsets[0],可以得到第一个字符串的相对位置(偏移),是0
2.那么第一个字符串的真实位置为基准位置(scStringPoolOffset)相对位置=13920。
3.由于还有一个文件头(8个长度),所以这个字符串在整个文件里的位置=真实位置头长度=13928=1400(16进制=0x578)
4.所以我们到文件的0x578处,可以查看对应的字符串。
STRINGCHUNK是用来存放androidmanifest.xml里所有用到的字符串的一块区域,紧跟在header后面。
自行写编写脚本如下:
在解析stringchunk时发生错误,报错如下,说明在stringchunk部分存在问题:
首先,我们根据stringchunk的scStringCount显示,一共有2901个字符串(string)
但是使用js代码,读取索引等于341号的字符串时发生错误。使用010Editor查看索引等于341号的字符串位置。
可以看到这个字符串的位置位于文件的第7602181个偏移处,而整个文件的长度都只有10W字符长度,说明从341号索引开始的字符串,应该是无效的,也就是被恶意插入的。
所以可以推测出,实际字符串的个数,应该只有341个(索引0->索引340)。
修复3:将scStringCount修改为341
修改完成后,重新运行模板(快捷键:F5)!
运行模板完成后,再次查看scStringOffset,可以看到,索引号最多到340了
使用编辑器修复xml
经过这3个修复之后,再次运行AXMLPrinter2,可以发现,不报错了,能够正常运行了,但是会输出一堆非预期的字符,将输出结果保存下来,
使用编辑器(例如vscode)打开result.txt,然后切换为GBK编码,结果如下图所示:
吃吗小伙子。。。。。吃!!!
通过查看以上result.txt,可以知道这里实际上是将xml里的namespace名称(xmlns:),改成了一个超长的字符串,让xml看起来不可读。通常情况下,xmlns=android,那么解决方法也简单,我们只需要将xml里的这些“恶意”字符串全部替换为正常的android即可:
使用vscode编辑result.txt(编码选择GBK)进行正则替换:
最后可以看到xml回归正常:
4
无糖浏览器下载方式
//
无糖浏览器-您身边的办案助手。
下载成功后,点击无糖浏览器的程序即可启动,双击后点击“接受”按钮,再点击“安装”即可成功安装。