smali进一步了解

Smali中的包信息:

     

.class public Lcom/aaaaa;   // 它是com.aaaaa这个package下的一个类(第1行)

.super Lcom/bbbbb;          // 继承自com.bbbbb这个类(第2行)

.source "ccccc.java"        // 这是一个由ccccc.java编译得到的smali文件(第3行)

 

Smali中的声明 :

 

# annotations

.annotation system Ldalvik/annotation/MemberClasses;

value = {

Lcom/aaa$qqq;,

Lcom/aaa$www;

}

.end annotation

// 这个声明是内部类的声明:aaa这个类它有两个成员内部类——qqq和www,内部类将在后面小节中会有提及。

 

寄存器的补充:

 

在smali里的所有操作都必须经过寄存器来进行:

本地寄存器用v开头数字结尾的符号来表示,如v0、v1、v2、...(应该是value的首写 不可能是寄存器register吧)

参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2、...(parameter 参数的首写)

特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0代指“this”,p1表示函数的第一个参数,p2代表函数中的第二个参数…而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法)

 

smali中的成员变量

成员变量格式是:

.field public/private [static] [final] varName:<类型>。

对于不同的成员变量也有不同的指令。

一般来说,获取的指令有:iget、sget、iget-boolean、sget-boolean、iget-object、sget-object等。

操作的指令有:iput、sput、iput-boolean、sput-boolean、iput-object、sput-object等。

没有“-object”后缀的表示操作的成员变量对象是基本数据类型,带“-object”表示操作的成员变量是对象类型,特别地,boolean类型则使用带“-boolean”的指令操作。

 

Smali成员变量指令简析(一)

sget-object v0, Lcom/aaa;->ID:Ljava/lang/String;

sget-object就是用来获取变量值并保存到紧接着的参数的寄存器中,本例中,它获取ID这个String类型的成员变量并放到v0这个寄存器中。

注意:前面需要该变量所属的类的类型,后面需要加一个冒号和该成员变量的类型,中间是“->”表示所属关系。

Smali成员变量指令简析(二)

iget-object v0, p0, Lcom/aaa;->view:Lcom/aaa/view;

可以看到iget-object指令比sget-object多了一个参数,就是该变量所在类的实例,在这里就是p0即“this”。

获取array的话我们用aget和aget-object,指令使用和上述一致

Smali成员变量指令简析(三)

put指令的使用和get指令是统一的如下:

const/4 v3, 0x0

sput-object v3, Lcom/aaa;->timer:Lcom/aaa/timer;

相当于:this.timer= null;

注意,这里因为是赋值object 所以是null,若是boolean的话,大家想应该相当于什么呢?

Smali成员变量指令简析(四)

.local v0, args:Landroid/os/Message;

const/4 v1, 0x12

iput v1, v0, Landroid/os/Message;->what:I

相当于:args.what = 18;(args是Message的实例)

 

时间: 2024-10-29 19:06:25

smali进一步了解的相关文章

Smali文件语法解析

大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版本):Where's My Water.zip\ asset\                        <资源目录1:asset和res都是资源目录但有所区别,见下面说明> lib\                             <so库存放位置,一般由NDK编译得到,常见于

APK、Dalvik字节码和smali文件

     这部分涉及的内容比较多,我会尽量从最基础开始说起,但需要读者一定的android开发基础.但注意可能讲解详细得令人作呕,请根据个人理解程度斟酌. APK.Dalvik字节码和smali文件 APK文件 大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版本): Where's My Water.zip\ asset\            

aync await 进一步探索

aync await 进一步探索 首先来个例子 class Program { static int index = 1; static void Log(string str) { Console.WriteLine((index++) + ". " + str + ". ThreadId:" + Thread.CurrentThread.ManagedThreadId); } static void Main(string[] args) { //解决.net

Android studio动态调试smali

前面介绍了使用IDA动态调试smali,这种方法设置简单,不用重打包,用起来方便,但是如果变量类型设置错误则会马上退出调试,这是让人不爽的地方,而使用Android studio则不会. 0x01    工具①Android Studio最新版.②apktool尽量使用最新版的.③ideasmali插件.下载地址https://github.com/JesusFreke/smali/wiki/smalidea 0x02     具体步骤安装ideasmali插件,选择File->Settings

time函数进一步

time进一步 gettimeofday #include <sys/time.h> struct timeval{ long tv_sec; long tv_usec; }; int gettimeofday(struct timeval *tv, struct timezone *tz); gettimeofday将时间保存在tv中,tz一般使用NULL代替. 通过不同时间段运行函数可测量时间. setitimer&getitimer #include <sys/time.h

进一步对泛型集合的思考

一.前言: 经常听师哥师姐们说底层这个底层那个,从没见过这个"底层".后来师姐就在项目中应用了这个底层类库,从听说它到自己亲自用它,才发现它还真是强大的不得了啊!经常跟着师哥师姐们的课听,就是想跟这个底层混个"脸熟".我也经常是不懂装懂,其实真正听懂的也没多少啊..不仅脸熟了,还脸皮厚呢.. 言归正传为什么又提起泛型集合了呢?第一次接触是在机房重构的时候,Data Table转换成泛型集合.后来敲这个系统的时候,看到封装的类库中绝大多数的返回结果都是泛型集合.委托和

国务院关于进一步推进户籍制度改革的意见(全文)

图解国务院关于进一步推进户籍制度改革的意见 中新网7月30日电 据中国政府网消息,国务院日前印发<国务院关于进一步推进户籍制度改革的意见>.意见指出,严格控制特大城市人口规模.改进城区人口500万以上的城市现行落户政策,建立完善积分落户制度. 全文如下: 各省.自治区.直辖市人民政府,国务院各部委.各直属机构: 为深入贯彻落实党的十八大.十八届三中全会和中央城镇化工作会议关于进一步推进户籍制度改革的要求,促进有能力在城镇稳定就业和生活的常住人口有序实现市民化,稳步推进城镇基本公共服务常住人口全

利用Trie树求多个字符串编辑距离的进一步优化

1.引言 题目的意思应该是:在一个给定的字典中,求与给定的字符串的编辑距离不大于2的所有的单词.原先写过两片关于此问题的文章,那两片篇章文章给出两种解决思路:其一是暴力求解法,这种方法最容易想到.就是将词典中的词一一与给定的字符串计算编辑距离,不大于2的输出,大于2的舍弃,这种方法思路简单但是很费时间.其二根据词典中这些词之间的编辑距离建立一个以单词为节点的Trie树,遍历的时候,通过计算根节点与给定字符串的编辑距离就可以排除掉一部分分支了,然后继续计算该字符串与剩余的分支的根的编辑距离,继续排

seach tree的deletion的实现——对树的指针的进一步理解

一颗binary search tree,我们要在其中删除node1.而node1对应的key是,比如说,key1.删除的基本想法是什么呢? 1.找到key1对应的那个node在哪里.这个用一个迭代就可以完成了. 2.删掉这个node (1)如果这个node没有左右子树,那么直接删掉就好了. (2)如果这个node只有左子树或者右子树,那么直接让左右子树缩进上来就好了. (3)如果既有左子树又有右子树,那么就从左子树里面找出最大的node,用这个node来替换掉需要删除的那个节点. 举个栗子:有