http://ift.tt/2BlpZII
算数运算
首先通过一个简单的例子,来看一下
public void ShowNumberTest(int a){
int b = a;
boolean c =false;
Log.d("TAG","a+b ="+(a+b));
Log.d("TAG","a-b ="+(a-b));
Log.d("TAG","a*b ="+(a*b));
Log.d("TAG","a/b ="+(a/b));
Log.d("TAG","a%b ="+(a%b));
}
反汇编代码:
# virtual methods
.method public ShowNumberTest(I)V
.locals 5
.param p1, "a" # I
.prologue
.line 23
move v0, p1
.line 24
.local v0, "b":I
const/4 v1, 0x0
.line 25
.local v1, "c":Z
const-string/jumbo v2, "TAG"
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string/jumbo v4, "a+b ="
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v3
add-int v4, p1, v0
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v3
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
invoke-static {v2, v3}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 26
const-string/jumbo v2, "TAG"
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string/jumbo v4, "a-b ="
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v3
sub-int v4, p1, v0
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v3
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
invoke-static {v2, v3}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 27
const-string/jumbo v2, "TAG"
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string/jumbo v4, "a*b ="
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v3
mul-int v4, p1, v0
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v3
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
invoke-static {v2, v3}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 28
const-string/jumbo v2, "TAG"
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string/jumbo v4, "a/b ="
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v3
div-int v4, p1, v0
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v3
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
invoke-static {v2, v3}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 29
const-string/jumbo v2, "TAG"
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string/jumbo v4, "a%b ="
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v3
rem-int v4, p1, v0
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v3
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
invoke-static {v2, v3}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 30
return-void
.end method
一步一步的来分析:
.locals 5
说明用了5个寄存器,都是局部变量
.param p1, "a" # I
是参数,用的的p1寄存器
move v0, p1
把p1中的值mov到v0中,现在v0=p1
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string/jumbo v4, "a+b ="
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v3
通过对比源码可以看出,这里仅仅是在Log.d("TAG","a+b ="+(a+b));
的部分操作,首先,把StringBuilder
对象引用放到v3寄存器中,然后调用StringBuilder
的构造函数,定义了一个常量字符穿,值为a+b =
,放到寄存器v4中,调用StringBuilder
中的append方法(我们也可以方法,String的字符串连接调用的其实是append),然后把生成的对象的结果返回值给v3寄存器
然后add-int v4, p1, v0
才是对数据的操作
下面就又是进行字符串链接然后输出日志的函数了,自己看看吧
通过上面的一个简单的例子,可以知道基本的算数指令了
指令 | 功能 |
---|---|
add-int v4,v0,p1 | 加法,v4 =v0+v1 |
sub-int v4,v0,p1 | 减法,v4 =v0-p1 |
mul-int v4,v0,p1 | 乘法,v4 = v0*p1 |
div-int v4,v0,p1 | 除法,v4 =v0/p1 |
rem-int v4,v0,p1 | 求余数,v4=v0%p1 |
数据定义
指令 | 功能 |
---|---|
move | |
v0,p1 | 赋值,v0=p1 |
const/4,v1,0x1 | 定义常量,v1=1 |
const-string v2,”MainActivity" | 定义常量字符串 |
.local v1,”c”:Z | 定义局部变量boolean类型,寄存器生命 |
暂时先略过更改为详细的数据定义格式,详细可以看非冲《Android 逆向入门》
数据操作
数据操作指令的格式如下:
move destination,source
根据字节码大小和类型不同,后面添加不同的后缀
指令 | 说明 |
---|---|
move vA,vB | vB寄存器中值赋值给VA寄存器,都为32位 |
move -object vA,vB | 一样的,就是换成对象了 |
move -resulet vAA | 将上一个invoke类型的执行操作的单字费对象结果赋值vAA寄存器 |
move -result-object vAA | 将上一个invoke类型指令操作的返回对象赋值给vAA |
move -exception vAA | 保存一个运行时发生异常vAA寄存器,必须是异常发生时候的异常处理的第一条指令 |
The post java语言反编译 smali 汇编基础语法(3)之算数运算,数据定义和数据操作 appeared first on cole.
http://ift.tt/2DyyCGb Smali, android reverse, asm, smali January 23, 2018 at 04:02PM
评论
发表评论