1625-5 王子昂 总结《2017年7月15日》 【连续第286天总结】
A. APK入门
B. 继续尝试破解之前的APK时越来越感觉吃力,smali看不懂,APK结构不明白等等,还是系统地学习一下知识吧
首先APK实质就是zip压缩包,其中包含了
asset文件夹:资源目录
lib文件夹:so文件存放位置,常见于使用游戏引擎或JNI native调用工程中
META-INF文件夹:存放工程一些属性文件,例如Manifest.MF
res文件夹:资源目录
AndroidManifest.xml:Android工程的基础配置属性文件
classes.dex:JAVA代码编译得到的Dalvik VM能直接执行的文件
resources.arsc:对res目录下的资源的索引文件,保存了原工程中strings.xml等文件内容
其他文件夹etc
res和asset两个资源目录的区别:
res目录下的资源文件在编译时会自动生成索引文件,(R.java),在JAVA中R.xxx.yyy来引用
asset目录下的资源文件不需要生成索引,在JAVA代码中需要用AssetManager来访问
一般来说除了音频和视频资源需要放在raw或asset文件夹下,使用JAVA开发的安卓工程使用到的资源文件都会放在res目录下;使用C++引擎(或Lua Unity3D等)的资源文件均需要放在asset目录下
Dalvik字节码
Dalvik是谷歌专门为安卓设计的虚拟机,虽然同样是用JAVA开发,但与JVM还是不同的。
Dalvik是基于寄存器的,而JVM是基于栈的;
Dalvik有专属的文件执行格式(dex),而JVM执行的则是JAVA字节码
Dalvik比JVM速度更快,占用空间更少
通过Dalvik字节码我们不能直接看到原来的逻辑代码,但是可以通过诸如Apktool或dex2jar+jd-gui等工具将其转换成java代码来查看。但注意,我们可操作的为smali文件,而不是java再编译
Smali
Smali和BakSmali分别是安卓系统里的虚拟机即Dalvik所使用的一种dex文件格式的汇编器,反汇编器。其语法是一种宽松式的Jasmin/Dedexer语法,而且它实现了.dex文件所有的功能(注解、调试信息、线路信息等)
当我们对APK的dex文件进行反编译时就会见到这种文件。它使用32位寄存器,用2个寄存器来表示64位;Dalvik有两种类型:原始类型和引用类型(包括对象和数组)
原始类型:Byte;Char;Double;Float;Int;J-long;Short;Void;Z-boolean;[xxx-array;Lxxx/yyy-object
[xxx:数组的表示方式为原始类型加’[’
Lxxx/yyy:对象的表示方式为原始类型加’L’,如“Ljava/lang/String”中,java/lang表示java.lang包,String就是定义在该包中的一个对象
类的类的表示方法为$
方法的定义:
Func-Name(Para-Type1Para-Type2…)Return-Type
eg:
hello()V = void hello()
hello(III)B = boolean hello(int,int,int)
hello(Z[I[ILjava/lang/String;J)Ljava/lang/String = string hello(boolean,int[],int[],string,long)
基本语法:
.field private isFlag:z 定义变量
.method 方法
.parameter 方法参数
.prologue 方法开始
.line 123 此方法位于123行
invoke-super 调用复函数
const/high16 v0,0x7f03 把0x7f03赋值给v0
invoke-director 调用函数
return-void 返回void
.end method 函数结束
new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
条件跳转语法:
if-eq vA,vB, :cond_xx 如果Va=Vb,则跳转到cond_xx
if-ne 不等于
if-lt 小于
if-ge 大于等于
if-gt 大于
if-le 小于等于
if-eqz vA, :cond_xx 如果vA等于0,则跳转到cond_xx
if-nez 不等于0
if-ltz 小于0
if-gez 大于等于0
if-gtz 大于0
if-lez 小于等于0
C.明日计划
LINUX学习
170715 逆向-APK基础知识
最新推荐文章于 2022-07-11 07:35:00 发布