• Android逆向之smali


    Android逆向之smali

    头信息

    smail文件前三行

    .class <访问权限> [关键修饰字] <类名>;
    .super <父类名>;
    .source <源文件名>
    

    .class指令表示当前的类名,类的访问权限是public,类名是Lcom/example/mark/myfirstapp/MainActivity,类开头的L是遵循Dalvik字节码的相关约定,表示后面跟随的字符串是一个类

    .super指定了当前类所继承的父类

    .source指定了当前类的源文件名

    接口

    .implements <接口名>
    

    类型

    V   void 
    Z   boolean
    B   byte
    S   short
    C   char
    I   int
    J   long
    F   float
    D   double
    L   java类
    [   数组
    

    变量存放在寄存器中,寄存器采用vp来命名,v表示本地寄存器,p表示参数寄存器。寄存器为32位,支持任何类型,其中longdouble是64位,使用两个相邻的寄存器。

    [x表示一维数组,x代表基本类型,如[I代表int[][[x代表二维数组。
    Java语言存在大量对象,java.lang.String表示为Ljava/lang/String;,分号一定要加上。

    静态字段

    (1)静态字段

    #static fields
    .field <访问权限> static [修饰关键字] <字段名>:<字段类型> 
    

    (2)实例字段

    #instance fields
    .field <访问权限> static [修饰关键字] <字段名>:<字段类型> 
    

    方法定义

    #direct/virtual methods     ----注释,直接方法(direct methods)指的是该类中定义的方法,虚方法(virtual methods)指的是从父类中继承的方法或者实现的接口方法。
    .method <访问权限> [修饰关键字] <方法原型>      ----方法原型描述了方法的名称、参数和返回值
        <.registers>        ----指定了方法中寄存器的总数,这个数量是参数和本地变量总和
        [.param]            ----方法的参数
        [.prologue]         ----指定了代码的开始处,混淆过的代码可能去掉了该指令
        [.line]             ----此处代码在源代码中的行号
        <.local>            ----使用这个指定表明方法中非参寄存器
        <代码体>
    .end method
    

    常用指令

    move v0,v3  把v3寄存器的值移动到寄存器v0上
    const-string v0, "admin"    把字符串"admin"赋值给v0寄存器
    invoke-super    调用父函数
    invoke-static   调用静态函数
    invoke-direct   调用函数
    input-object    对象赋值
    iget-object     调用对象
    new-instance    创建实例
    return-void     函数返回void
    

    if判断

    if-eq vA, VB, cond_** 如果vA等于vB则跳转到cond_**。相当于if (vA==vB)
    if-ne vA, VB, cond_** 如果vA不等于vB则跳转到cond_**。相当于if (vA!=vB)
    if-lt vA, VB, cond_** 如果vA小于vB则跳转到cond_**。相当于if (vA<vB)
    if-le vA, VB, cond_** 如果vA小于等于vB则跳转到cond_**。相当于if (vA<=vB)
    if-gt vA, VB, cond_** 如果vA大于vB则跳转到cond_**。相当于if (vA>vB)
    if-ge vA, VB, cond_** 如果vA大于等于vB则跳转到cond_**。相当于if (vA>=vB)
    
    if-eqz vA, :cond_** 如果vA等于0则跳转到:cond_** 相当于if (VA==0)
    if-nez vA, :cond_** 如果vA不等于0则跳转到:cond_**相当于if (VA!=0)
    if-ltz vA, :cond_** 如果vA小于0则跳转到:cond_**相当于if (VA<0)
    if-lez vA, :cond_** 如果vA小于等于0则跳转到:cond_**相当于if (VA<=0)
    if-gtz vA, :cond_** 如果vA大于0则跳转到:cond_**相当于if (VA>0)
    if-gez vA, :cond_** 如果vA大于等于0则跳转到:cond_**相当于if (VA>=0)
    

    注解

    #annotations
    .annotation [注解属性] <注解类名>
        [注解字段 = 值]
    .end annotation
    

    smail插桩

  • 相关阅读:
    win10安装virtualBox创建CentOS6.5虚拟机
    ES系列二、CentOS7安装ES head6.3.1
    ES系列一、CentOS7安装ES 6.3.1、集成IK分词器
    Python easyGUI 猜数字
    Python easyGUI 登录框 非空验证
    Python easyGUI 文件浏览 显示文件内容
    Python easyGUI 文件对比 覆盖保存
    Python 统计代码量
    什么是一个人真正的魅力?
    Python学习笔记(15)- osos.path 操作文件
  • 原文地址:https://www.cnblogs.com/mark-zh/p/10305308.html
Copyright © 2020-2023  润新知