Files
notes_estom/Python/androguard/analyze.ipynb
2021-12-14 17:16:10 +08:00

144 lines
7.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1 Android编译原理\n",
"### 编译过程示意图\n",
"![](image/2021-12-11-11-29-01.png)\n",
"\n",
"1. 打包资源文件生成R.java文件。\n",
"2. 处理aidl文件生成相应的Java文件。\n",
"2. 编译工程源代码生成相应的class文件。\n",
"2. 转换所有的class文件生成classes.dex文件。\n",
"2. 打包生成APK文件。\n",
"\n",
"下面是更详细的编译示意图\n",
"![](image/2021-12-12-19-56-23.png)\n",
"\n",
"### 编译过程文件\n",
"1. Java文件-----应用程序源文件。Android本身相当一部分都是用java编写而成\n",
"2. Class文件------Java编译后的目标文件.不像J2sejava编译成class就可以直接运行android平台上class文件不能直接在android上运行。android的class文件实际上只是编译过程中的中间目标文件需要链接成dex文件后才能在dalvik上运行\n",
"3. Dex文件-----Android平台上的可执行文件.Android虚拟机Dalvik支持的字节码文件格式Google在新发布的Android平台上使用了自己的Dalvik虚拟机来定义 这种虚拟机执行的并非Java字节码 而是dex格式的字节码。在编译Java代码之后通过Android平台上的工具可以将Java字节码转换成Dex字节码。\n",
"4. Apk文件-------Android上的安装文件Apk是Android安装包的扩展名一个Android安装包包含了与某个Android应用程序相关的所有文件。apk文件将AndroidManifest.xml文件、应用程序代码(.dex文件)、资源文件和其他文件打成一个压缩包。一个工程只能打进一个.apk文件\n",
"\n",
"\n",
"### 相关工具介绍\n",
"* APTannotation processing tool是一种处理Java/android注解的工具它对源代码文件进行检测找出其中的Annotation后对Annotation进行额外的处理。Annotation处理器在处理Annotation时可以根据源文件中的Annotation生成额外的源文件和其它的文件文件具体内容由Annotation处理器的编写者决定APT还会编译生成的源代码文件和原来的源文件将它们一起生成class文件。代码可能用到了面向切面变成可能有大量的注解通过APT处理源代码讲注解展开生成新的源代码。\n",
"* AspectJ最常用的字节码处理框架有 AspectJ、ASM 等等,它们的相同之处在于输入输出都是 Class 文件。并且,它们都是 在 Java 文件编译成 .class 文件之后,生成 Dalvik 字节码之前执行。AspectJ是一个面向切面的框架它扩展了Java语言。AspectJ定义了AOP语法它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。\n",
"* \n",
"\n",
"### 一些代码防护措施\n",
"\n",
"* 代码混淆\n",
"* 核心方法Native\n",
"* 动态加载dex加载dex之前dex文件加密\n",
"* 动态加载so\n",
"* 所有声明字符串加密\n",
"* 使用3方加固平台治标不治本\n",
"* 插入代码花指令jui工具编译方法报错\n",
"\n",
"### 反编译的目标\n",
"\n",
"1. 查看动态代码逻辑将apk里的dex文件转换成Jar包再通过工具查看编译前的java源文件。\n",
"2. 查看静态配置文件通过工具查看apk里对应的AndroidManifest.xml、resources.arsc、res各布局文件等二进制文件。\n",
"\n",
"### APK文件解析\n",
"![](image/2021-12-12-19-41-07.png)\n",
"\n",
"* assets文件夹原始资源文件夹对应着Android工程的assets文件夹一般用于存放原始的图片、txt、css等资源文件。\n",
"* lib存放应用需要的引用第三方SDK的so库。比如一些底层实现的图片处理、音视频处理、数据加密的库等。而该文件夹下有时会多一个层级这是根据不同CPU 型号而划分的,如 ARMARM-v7ax86等。\n",
"* META-INF保存apk签名信息保证apk的完整性和安全性。\n",
"* res资源文件夹其中的资源文件包括了布局(layout),常量值(values),颜色值(colors),尺寸值(dimens),字符串(strings),自定义样式(styles)等。\n",
"* AndroidManifest.xml文件全局配置文件里面包含了版本信息、activity、broadcasts等基本配置。不过这里的是二进制的xml文件无法直接查看需要反编译后才能查看。\n",
"* classes.dex文件这是安卓代码的核心部分,dex是在Dalvik虚拟机上可以执行的文件。这里有classes.dex 4个文件说明工程的方法数较多进行了dex拆分。如果apk的方法数超过了65535会生成多个dex文件反编译的话需要对这多个dex文件均进行转换Jar包处理。\n",
"* resources.arsc文件记录资源文件和资源id的映射关系。\n",
"\n",
"### 注解说明\n",
"运行时注解\n",
"通常被定义的注解需要通过反射来获取相关值\n",
"编译时注解\n",
"在代码构建编译过程的时候,生成java文件然后供需要的类进行调用\n",
"\n",
"两者根本区别在于,前者是程序员预先写好的java文件中,直接调用的,\n",
"而后者是程序员写好java代码的生成规则,程序员自己不写java文件,\n",
"交给编译器去写java文件,,java文件只有编译器编译完成后才能调用。\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 常用的命令行工具\n",
"* androguard:所有工具的集合\n",
" * androguard analyze交互式命令行Ipython工具\n",
" * androguard cz:create a call graph调用图工具\n",
" * androguard gui:图形界面工具\n",
" * androguard sign:证书管理工具\n",
" * androguard axml:manifest解析工具\n",
" * androguard arsc:resource解析工具\n",
" * androguard decompile:反编译工具并创建cfg\n",
" * androguard dissassemple:dex反编译工具\n",
"\n",
"它本身是一个ipython分析工具既可以作为命令行工具执行也可以嵌入到Python脚本中用于分析Python文件。以上命令都会开启一个ipython交互式命令行。"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"from androguard import misc\n",
"a,d,dx = misc.AnalyzeAPK('1.apk')"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"dx.get_classes()\n",
"axml = a.get_android_manifest_xml()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"from androguard import cli"
]
}
],
"metadata": {
"interpreter": {
"hash": "5ef0042cb263260037aa2928643ae94e240dd3afaec7872ebebe4f07619ddd0c"
},
"kernelspec": {
"display_name": "Python 3.8.8 64-bit ('ml': conda)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}