【问题标题】:Interpreting and understanding smali. could someone help me translate?解释和理解 smali。有人可以帮我翻译吗?
【发布时间】:2014-12-14 12:42:59
【问题描述】:

我正在我的 android 设备上进行试验,尝试使用应用程序代码,以便我可以同时学习它。 但我几乎被困在如何编辑 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”IE:

MyProcessor.l = 10;

我尝试了几种不同的方法,例如:

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

但是我遇到了编译错误,所以这显然是错误的。 此外,我并没有真正理解我在做什么以及为什么要做我所做的。有人可以带我完成这里的逻辑步骤吗?非常感谢。

【问题讨论】:

    标签: android json reverse-engineering smali


    【解决方案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"
    


    Final 实际上并没有直接使用,因为对它们的引用被值本身的原始备忘单所取代:

    V - void,B - 字节,S - 短,C - 字符,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 !

    【讨论】:

      【解决方案2】:

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

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

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

      同样的情况也发生在这里。您正在使用 v0 寄存器影响 v2 寄存器。话虽如此,您所做的更改被误导了。您将“I”更改为“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 中。 ' :I ' 让你知道变量的类型。因为Java是强类型的,所以我相信你知道变量总是有一个关联的类型。当然,这必须在字节码中引用,这就是它的完成方式。

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

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

      第一行将一个常数(0xA hexa = 10 十进制)赋值给 v0,然后按照我之前引用的方式传递它。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 2015-07-14
        • 2015-05-18
        相关资源
        最近更新 更多