3.Matrix Android ApkChecker

Matrix-ApkChecker 的使用

java -jar ApkChecker.jar

Matrix-ApkChecker的命令行参数比较多,主要包括global参数和option参数两类:

global参数

--apk 输入apk文件路径(默认文件名以apk结尾即可)

  --mappingTxt  代码混淆mapping文件路径 (默认文件名是mapping.txt)

  --resMappingTxt  资源混淆mapping文件路径(默认文件名是resguard-mapping.txt)

  --input  包含了上述输入文件的目录(给定--input之后,则可以省略上述输入文件参数,但上述输入文件必须使用默认文件名)

  --unzip  解压apk的输出目录

  --output  输出结果文件路径(不含后缀,会根据format决定输出文件的后缀)

  --format  结果文件的输出格式(例如 html、json等)

  --formatJar  实现了自定义结果文件输出格式的jar包

  --formatConfig  对结果文件输出格式的一些配置项(json数组格式)

option参数

global参数之后紧跟若干个Option,这些Option是可选的,一个Option表示针对apk的一个检测选项。

有13个项目

ApkChecker

创建ApkJob,执行其run方法

ApkJob

解析参数,创建task,执行

1.先执行,preTasks包含解压功能,TASK_TYPE_UNZIP

2.readConfigFile里读取了config文件,将数据设置到JobConfig

JobConfig

/**

* Created by jinqiuchen on 17/6/15.

* apkPath = "/Users/admin/StudioProjects/demo/app/build/outputs/apk/demo/release/AndResGuard_app-demo-release/app-demo-release_aligned_signed.apk"

* unzipPath = "/Users/admin/StudioProjects/demo/app/build/outputs/apk/demo/release/AndResGuard_app-demo-release/app-demo-release_aligned_signed_unzip"

* outputPath = "/Users/admin/StudioProjects/demo/app/build/outputs/apk/demo/release/AndResGuard_app-demo-release/apk-checker-result"

* mappingFilePath = "/Users/admin/StudioProjects/demo/app/build/outputs/mapping/demoRelease/mapping.txt"

* resMappingFilePath = "/Users/admin/StudioProjects/demo/app/build/outputs/apk/demo/release/AndResGuard_app-demo-release/resource_mapping_app-demo-release.txt"

* outputConfig [{"name":"-countMethod","group":[{"name":"Android System","package":"android"},{"name":"java system","package":"java"},{"name":"com.tencent.test.$","package":"com.tencent.test.$"}]}]

*

* outputFormatList = {ArrayList@904}  size = 2

* 0 = "mm.html"

* 1 = "mm.json"

*

* proguardClassMap

* com.newbilling.view.activity.VipActivity -> com.newbilling.view.activity.VipActivity

*

* resguardMap

* R.animator.e -> R.animator.mtrl_chip_state_list_anim

*

* entrySizeMap

* "res/color/abc_primary_text_material_light.xml" -> {Pair@1161} "Pair [first=464, second=229]"

*

* entryNameMap

* r/n/btn_normal.webp -> res/drawable-xhdpi-v4/btn_normal.webp

*/

public final class JobConfig {

private String inputDir;

private String apkPath;//ok

private String unzipPath;//ok

private String outputPath;//ok

private String mappingFilePath;//ok

private String resMappingFilePath;//ok

private JsonArray outputConfig;//ok countMethod

private List outputFormatList;//ok

private Map proguardClassMap;//ok

private Map resguardMap;//ok

private Map> entrySizeMap;//ok

private Map entryNameMap;//ok

}

UnzipTask

1.输入的Apk文件首先会经过UnzipTask处理,解压到指定目录,在这一步还会做一些全局的准备工作,

包括反混淆类名(读取mapping.txt)、反混淆资源(读取resMapping.txt)、统计文件大小等。

2.可以利用的技术

解压apk ZipFile

ManifestAnalyzeTask

todo Resources.arsc文件大家应该都知道是干什么的,它实际上就是App的资源索引表

todo AXmlResourceParser resourceParser;//解析类,需要传入arscFile

todo ApkResourceDecoder具体怎么操作

todo ApkUtil disassembleClass 干哈的,反汇编,将汇编变成smail?

    1.ManifestParser

将AndroidManifest解析成Json数据格式

*  "android:versionCode" -> {JsonPrimitive@1600} ""228""

*  "android:versionName" -> {JsonPrimitive@1602} ""2.2.8""

*  "android:compileSdkVersion" -> {JsonPrimitive@1604} ""29""

*  "android:compileSdkVersionCodename" -> {JsonPrimitive@1606} ""10""

2.XmlPullResourceRefDecoder

* 遍历xml得到资源的引用名字set

* this.resourceRefSet = {HashSet@2647}  size = 14

*  0 = "R.string.js"

*  1 = "R.string.k5"

*  2 = "R.string.jr"

*  3 = "R.array.c"

*  4 = "R.array.d"

CountClassTask

利用google开源的 com.android.dexdeps 类库来读取dex文件

可以利用的技术DexData,读取dex里的class,不过只是ClassName

CountRTask

可以利用的技术DexData,读取dex里的class,不过只是ClassName

DuplicateFileTask

可以利用的技术,求文件的MD5,MessageDigest

//            "com.google.android.gms.gass.R" -> {Integer@2328} 0

//            "androidx.activity.R" -> {Integer@2335} 171

//            "com.google.firebase.analytics.connector.R" -> {Integer@2328} 0

//            "com.example.lib_utils.R" -> {Integer@2338} 1707

FindNonAlphaPngTask

可以检测出apk中非透明的png文件

* 可以利用的技术:通过 java.awt.BufferedImage 类读取png文件并判断是否有alpha通道。

MethodCountTask

* 统计方法数

* 统计dex包含的方法数,并支持将输出结果按照类名(class)或者包名(package)来分组

* MethodCountTask 可以统计出各个Dex中的方法数,并按照类名或者包名来分组输出结果。

* 实现方法:利用google开源的 com.android.dexdeps 类库来读取dex文件,统计方法数。

UnusedAssetsTask

* UnusedAssetsTask 可以检测出apk中未使用的assets文件

* 可以利用的技术:搜索smali文件中引用字符串常量的指令,判断引用的字符串常量是否某个assets文件的名称

* 读取dex里的class

* DexBackedDexFile -》 ClassDef -》Smali

ResProguardCheckTask

查看是否使用ResProguard

原理:ResProguard会将res资源变成r,或者保留res,其他资源改为[a-z_0-9]{1,3}

MultiLibCheckTask

查看lib下有几个文件夹

ShowFileSizeTask

* 按文件大小排序列出apk中包含的文件

* 列出超过一定大小的文件,可按文件后缀过滤,并且按文件大小排序

UncompressedFileTask

* 直接利用UnzipTask中统计的各个文件的压缩前和压缩后的大小,判断压缩前和压缩后大小是否相等。

* 如果相等,说明没有压缩

* 如果不相等,说明有压缩了

MethodCountTask

*todo

UnusedResourcesTask

*todo

MultiSTLCheckTask

*todo

    * CheckMultiSTLTask 可以检测apk中的so是否静态链接STL

* 实现方法:通过nm工具来读取so的符号表,如果出现 std:: 即表示so静态链接了STL。

UnStrippedSoCheckTask

*todo

    * UnStrippedSoCheckTask 可以检测出apk中未经裁剪的动态库文件

* 实现方法:使用nm工具读取动态库文件的符号表,若输出结果中包含no symbols字样则表示该动态库已经过裁剪

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容