mirror of
https://github.com/Estom/notes.git
synced 2026-02-03 02:23:31 +08:00
144 lines
7.3 KiB
Plaintext
144 lines
7.3 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 1 Android编译原理\n",
|
||
"### 编译过程示意图\n",
|
||
"\n",
|
||
"\n",
|
||
"1. 打包资源文件,生成R.java文件。\n",
|
||
"2. 处理aidl文件,生成相应的Java文件。\n",
|
||
"2. 编译工程源代码,生成相应的class文件。\n",
|
||
"2. 转换所有的class文件,生成classes.dex文件。\n",
|
||
"2. 打包生成APK文件。\n",
|
||
"\n",
|
||
"下面是更详细的编译示意图\n",
|
||
"\n",
|
||
"\n",
|
||
"### 编译过程文件\n",
|
||
"1. Java文件-----应用程序源文件。Android本身相当一部分都是用java编写而成\n",
|
||
"2. Class文件------Java编译后的目标文件.不像J2se,java编译成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",
|
||
"* APT(annotation 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",
|
||
"\n",
|
||
"\n",
|
||
"* assets文件夹:原始资源文件夹,对应着Android工程的assets文件夹,一般用于存放原始的图片、txt、css等资源文件。\n",
|
||
"* lib:存放应用需要的引用第三方SDK的so库。比如一些底层实现的图片处理、音视频处理、数据加密的库等。而该文件夹下有时会多一个层级,这是根据不同CPU 型号而划分的,如 ARM,ARM-v7a,x86等。\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
|
||
}
|