安卓逆向学习---初始APK、Dalvik字节码以及Smali

参考链接:https://www.52pojie.cn/thread-395689-1-1.html

res目录下资源文件在编译时会自动生成索引文件(R.java ),

asset目录下的资源文件无需生成索引。

一般来说:使用C++游戏引擎的资源文件放在asset下

      java开发中除音频和视频资源(放在raw或asset下),均放在res下。

  • Dalvik字节码是什么?

  Dalvik是Google专门为Android设计的一个虚拟机。

  Dalvik VM是基于寄存器的,而JVM是基于栈的,Dalvik有专属的文件执行格式dex(Dalvik executable),jvm使用的是java字节码。

  Dalvik VM你jvm速度更快,占用空间更少。

  • 什么是Smali?

  Smali,baksmali分贝时指安卓系统里的java虚拟机(Dalvik)所使用的一种。dex格式文件的汇编器,反汇编器。

  语法为一行宽松的Jasmin/dedeser语法,且实现了.dex格式的所用功能(注解,调试信息,线路信息等)。

  对apk文件进行反汇编后,便会生成此类文件。其中在Dalvik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个寄存器表示。

  • Dalvik字节码有两种类型:原始类型,引用类型。

  

  原始类型:  

      B --- byte

      C --- char

      D --- double

      F --- float

      I --- int

      J --- long

      S --- short

      V --- void

      Z --- boolean  

      [XXX --- array    //数组表示方式:基本类型前加上“[”,eg:int型数组表示为:[I

      LXXX/yyy --- object  //对象表示以L开头,格式为LpackageName/objectName;(分号必须有)

      //eg:String在Smali中为:LJava/lang.String; ,其中java/lang对应java.lang包,String就是定义在该包中的一个对象。

      //内部类表示为:LpackName/objectName$subObjectName;。即在内部类前面加“$”符号。

    方法定义:Func-Name(para-Type1para-Type2para-Type3...)Return-Type    //参数之间没有空格

    eg:hello()v    //void hello()

      hello(III)Z    //boolean hello(int,int,int)

      hello(Z[I[ILjava/lang/String;J)Ljava/lang/String    //String hello(boolean,int[],int[],String,long)

  • Smali基本语法

  .field private isFlag:z  定义变量

  .method       方法

  .parameter     方法参数

  .prologue      方法开始

  .line 123     此方法位于第123行

  invoke-super   调用父函数

  const/high16 vO, 0x7fo3   把0x7fo3赋值给v0

  invoke-direct   调用函数

  return-void   函数返回void

  .end method   函数结束

  new-instance   创建实例

  iput-object   对象赋值

  iget-object   调用对象

  invoke-static   调用静态函数

  • 条件跳转分支:

  "if-eq vA, vB, :con_**"   如果vA等于vB则跳转到:cond_ **

  "if-ne vA, vB, :cond_**"    如果vA不等于vB则跳转到:cond_ **

  "if-It vA, vB, :cond_**"    如果vA小于vB则跳转 到:cond_ **

  "if-ge vA, vB, :cond_**"     如果vA大于等于vB则跳转到:cond_ **

  "if-gt vA, vB, :cond_**"    如果vA大于vB则跳转到:cond_ **

  "if-le vA, vB, :cond_ *"     如果vA小于等于vB则跳转到:cond_ **

  "if-eqz vA, :cond_**"    如果vA等于0则跳转到:cond_ **

  "if-nez vA, :cond_**"    如果vA不等于0则跳转到:cond_ **

  "if-Itz vA, :cond_**"    如果vA小于0则跳转到:cond_**

  "if-gez vA, :cond_**"   如果vA大于等 于0则跳转到:cond_ **

  "if-gtz vA, :cond_**"     如果vA大于0则跳转到:cond_ **

  "if-lez vA, :cond_**"    如果vA小于 等于0则跳转到:cond **

  

  

原文地址:https://www.cnblogs.com/BANLOONG/p/10347209.html

时间: 01-31

安卓逆向学习---初始APK、Dalvik字节码以及Smali的相关文章

003dayPython学习初始模块和字节码

一.注释: 1.单行注释 # 被注释的内容 2.多行注释 """ 被注释的内容 """ 二.模块 我们在编程的时候,往往是一个主.py文件,多个功能文件,当用到某个功能的时候将其导入到主文件中 这些以.py结尾的功能文件,我们可以将其称之为模块 模块分为系统模块和自定义模块 系统模块是系统中本身就有的,像sys.time等模块 而自定义模块就是我们自己写的.py文件 导入模块用 import+模块名 即可,例: import sys 运行时,im

Android逆向基础----Dalvik字节码

参考此微博,更多详细内容可以到这里查看 http://blog.csdn.net/dd864140130/article/details/52076515 Dalvik字节码 1.寄存器位32位,64位数据(double)用两个相邻的32寄存器表示. 2.两种类型:基本类型和引用类型(对象和数组) 全限定名是什么? 以String为例,其完整名称是Java.lang.String,那么其全限定名就是java/lang/String;,即java.lang.String的"."用&quo

Dalvik指令分析(一) 字节码转换为smali代码

有过android应用反编译或者再打包的朋友都有使用过apktool的经验,apktool能将dex文件的 字节码转换为smali代码,这个工具是怎么做到对dex进行解析并生成smali代码的呢?这就需要对 dex文件的格式很熟悉.需要掌握dalvik指令的字节码格式,并能翻译成对应的smali代码. 我准备写一系列的文章来分析dex文件的格式.dalvik字节码的格式.以及dex to smali的方法, 基于此可以做很多的应用,比如安全扫描.应用加固等等! Dalvik指令介绍请参考官方文档

实例详解:反编译Android APK,修改字节码后再回编译成APK

本文详细介绍了如何反编译一个未被混淆过的Android APK,修改smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk无论输入什么样的用户名和密码都可以成功进入到第二个Activity. 有时难免要反编译一个APK,修改其中的若干关键判断点,然后再回编译成一个全新的可用的apk,这完全是可实现的.若要完成上述工作,需要以下工具,杂家后面会把下载链接也附上.这些软件截止本文发布时,经过杂家确认都是最新的版本. 1.APK-Multi-Toolv1.0.11.zip 用它

4. 如何解释dalvik字节码

如何解释dalvik字节码 文档: 在Android系统源码目录dalvik\docs有相关指令文档 dalvik-bytecode.html 实战: 来直接实战模拟来理解枯燥的理论 用IDA打开一个dex文件, 设置显示指令 随便找一段代码 注意: 206E 28DE 0050是IDA的显示问题 在文件中的存储顺序是 6E 20 DE 28 50 00 在WinHex搜索一下就知道了 上面截图的指令在文件中的排列顺序如下: 14 05 09 00 09 01 6E 20 DE 28 50 00

Android逆向分析(2) APK的打包与安装

http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之鱼不如授之以渔,只有知道一些基本原理,才能让我们以后能自行解决更多问题. 那么,你知道么?从我们在Android Studio中,点击run,

实验吧smali文件分析【安卓逆向首发】

试题网址: http://www.shiyanbar.com/ctf/1871 0x01 首先我们得到了一个hello.dex文件,要把它反编译为smali文件,使用工具baksmali,cmd命令:  java -jar baksmali-2.0.3.jar -o class/ Hello.dex ,就在当前目录下生成了一个文件夹,里边有一个hello.smali 代码如下: .class public LHello; .super Ljava/lang/Object; .source "He

android apk 防止反编译技术第二篇-运行时修改字节码

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码.这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创.下面我们来介绍一下这种方法. 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时d

Python字节码与解释器学习

参考:http://blog.jobbole.com/55327/ http://blog.jobbole.com/56300/ http://blog.jobbole.com/56761/ 1. 在交互式命令行中执行命令的内部过程 当你敲下return键的时候,python完成了以下四步:词法分析.句法分析.编译.解释.词法分析的工作就是将你刚才输入的那行代码分解为一些符号token(译者注:包括标示符,关键字,数字, 操作符等).句法分析程序再接收这些符号,并用一种结构来展现它们之间的关系(

【分析】dalvik虚拟机解释执行字节码

参考源码版本:Android-4.4.4_r2 提示:大部分分析直接注释在代码内. dvmInterpret函数中调用了dvmInterpretPortable函数对方法的字节码进行解释执行,dvmInterpret在dalvik/vm/interp/Interp.cpp文件中. dvmInterpretPortable函数在dalvik/vm/mterp/out/InterpC-portable.cpp文件中. 使用gcc -E -P -C InterpC-portable.cpp > Int