解释和理解smali。有人可以帮我翻译吗?

时间:2014-10-19 12:06:49

标签: android json reverse-engineering smali

我在我的Android设备上进行实验,尝试使用应用程序代码,这样我就可以在同一时间学习它。 但我几乎坚持如何编辑smali代码。 对于那些只学习OOP语言的人来说,这并不是那么直接。

所以这是我的密码:

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;

现在我想保持简单,只需在参数中加一个常量 ' MyProcessor.l' I.E in Java:

MyProcessor.l = 10;

我尝试过几种不同的方法:

iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:10

但我正在编译错误,所以这显然是错误的。 此外,我还没有真正理解我做了什么以及为什么做我做的事情。有谁能引导我完成这里的逻辑步骤?非常感谢。

2 个答案:

答案 0 :(得分:1)

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

  

输入vx,vy,field_id   将vx放入实例字段。该实例由vy引用。

     

来自dalvik操作码的http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

这里也是如此。您正在使用v0寄存器影响v2寄存器。据说你所做的改变是错误的。您将“我”更改为“10”,但这不是值。在这种情况下,I表示整数。此外,这甚至不是您想要在代码中进行更改的地方。我们来看看:

const-string v0, "get_value_one"

reg v0现在具有字符串“get_value_one”的值(值可能不是描述它的最佳词,因为它是一个字符串,但我想我得到了我的观点)

invoke-virtual {p0, v0}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I
move-result v0

现在您在通过参数接收的JSONObject上调用了方法getInt(String)。你知道这一点,因为{p0,v0}意味着你将v0传递给p0引用的对象的方法,你知道它是一个参数,因为它遵循p *规则。 (你可以在这里阅读:https://code.google.com/p/smali/wiki/Registers)。

到现在为止,您必须开始明白,如果要为变量“l”分配一个cont值,调用此方法将无济于事。

iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:I

最后一条指令接受v2寄存器并将v0的值放入其中。 v0,在执行此行之前,具有来自JSONObject getInt(String)方法的值,而v2引用Object MyProcessor并且“Lcom / breakapp / dd / mymod / Processor; - > l”引用变量' l'包含在那个obj中。 ':我'让你知道变量的类型。由于Java是强类型的,因此我确定你知道,变量总是有一个关联类型。当然,这在字节码中被引用,这就是它的完成方式。

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

const/4 v0, 0xA
iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:I

第一行向v0赋予一个常量(0xA hexa = 10十进制),然后按我之前引用的那样传递它。

学习smali祝你好运,我希望它至少有一点帮助

答案 1 :(得分:1)

我也是Android Reversing的新手,我花了一些时间寻找对Smali代码的简单理解,并发现:

注意类结构为L;

Lcom/breakapp/dd/mymod/Processor;->l:I

原始java文件名

.source "example.java"

这些是类实例变量

.field private someString:Ljava/lang/String;

这将字符串值分配给v0

const-string v0, "get_value_one"


总决赛实际上并没有直接使用,因为对它们的引用被替换为值本身的原始备忘单:

V - void,B - byte,S - short,C - char,I - int

J - long(使用两个寄存器),F - float,D - double

.field public final someInt:I  # the :I means integer
.field public final someBool:Z # the :Z means boolean

取自:Android Cracking