170715 逆向-APK基础知识

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学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值