2

我正在我的 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

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

4

2 回答 2

3

我也是 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 - 字节,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 破解

于 2016-11-06T04:14:12.100 回答
1

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

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

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

同样的情况也发生在这里。您正在使用 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 ://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 好运,我希望它至少有一点帮助

于 2014-11-20T12:35:05.363 回答