Android 解释和理解smali。有人能帮我翻译吗?

Android 解释和理解smali。有人能帮我翻译吗?,android,json,reverse-engineering,smali,Android,Json,Reverse Engineering,Smali,我正在我的安卓设备上做实验,尝试玩应用程序代码,以便我可以同时学习它。 但我对如何编辑smali代码非常感兴趣。 对于只学过OOP语言的人来说,这并不是那么简单 这是我的smali代码: const-string v0, "get_value_one" invoke-virtual {p0, v0}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I move-result v0 iput v0, v2, Lcom/breakapp/dd

我正在我的安卓设备上做实验,尝试玩应用程序代码,以便我可以同时学习它。 但我对如何编辑smali代码非常感兴趣。 对于只学过OOP语言的人来说,这并不是那么简单

这是我的smali代码:

const-string v0, "get_value_one"
invoke-virtual {p0, v0}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I
move-result v0
iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:I
这是它的等效java代码:

Processor MyProcessor = new Processor();
try { 
    MyProcessor.l = paramJSONObject.getInt("get_value_one");
    return MyProcessor;  
} catch (Exception e) { }    
return MyProcessor;
现在,我想保持简单,只在参数中加一个常量 Java中的“MyProcessor.l”即:

MyProcessor.l = 10;
我尝试过几种不同的方法,如:

iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:10
但我遇到了编译错误,所以这显然是错误的。
除此之外,我真的不明白我在做什么,为什么要做我所做的。有人能告诉我这里的逻辑步骤吗?非常感谢。

您可能需要阅读dalvik字节码文档,因为它们比您可以找到的有关smali的文档更详细。 无论如何,我也在学习斯玛利,所以,也许,我不能给你最好的答案,但也许这会有所帮助。 让我们先看看iput的功能:

iput vx、vy、字段id 将vx放入实例字段。该实例由vy引用

来源:来自dalvik操作码

同样的情况也发生在这里。您正在用v0寄存器影响v2寄存器。也就是说你所做的改变被误导了。您已将“I”更改为“10”,但这不是一个值。在这种情况下,I表示整数。此外,这甚至不是您想要更改代码的地方。让我们看看:

const-string v0, "get_value_one"
reg v0现在具有字符串get_value_的值。一个值可能不是描述它的最好的词,因为它是一个字符串,但我想我理解了我的观点

invoke-virtual {p0, v0}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I
move-result v0
现在,您在通过参数接收的JSONObject上调用了getIntString方法。您知道这一点,因为{p0,v0}意味着您正在将v0传递给p0引用的对象的方法,您知道它是一个参数,因为它遵循p*规则。您可以在此处阅读:

到现在为止,您必须开始理解,如果要将cont值分配给变量“l”,调用此方法将没有帮助

iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:I
最后一条指令获取v2寄存器并将v0的值放入其中。在执行这一行之前,v0具有来自JSONObject getIntString方法的值,而v2引用对象MyProcessor和Lcom/breakapp/dd/mymod/Processor;->l引用了包含在该obj中的变量“l”。“:I”让您知道变量的类型。因为Java是强类型的,所以变量总是有一个关联的类型,我相信您一定知道。当然,这需要在字节码中引用,这就是它的实现方式

我希望这提供了一些信息,以便能够进行您想要的更改,但我将尝试通过建议您将显示的代码更改为以下内容来提供更多帮助:

const/4 v0, 0xA
iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:I
第一行将一个常数0xA hexa=10十进制赋值为v0,然后按照我前面引用的方式传递它


祝你学习smali好运,我希望它至少能帮上一点忙。我也是Android Reversing的新手,我花了一些时间寻找对smali代码的简单理解,并发现:

注:类结构为L; 原始java文件名 这些是类实例变量 这将为v0分配一个字符串值 期末考试实际上没有直接使用,因为对它们的引用被值本身替换为原始备忘单:

V-void,B-byte,S-short,C-char,I-int J-long使用两个寄存器,F-float,D-double 摘自:

Lcom/breakapp/dd/mymod/Processor;->l:I
.source "example.java"
.field private someString:Ljava/lang/String;
const-string v0, "get_value_one"
.field public final someInt:I  # the :I means integer
.field public final someBool:Z # the :Z means boolean