当前位置: 首页 > 知识库问答 >
问题:

解读和理解斯玛利。谁能帮我翻译一下吗?

阎璞瑜
2023-03-14

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

现在我想让事情简单一些,在参数“MyProcessor”中加一个常量。Java语言中的l'I.E:

MyProcessor.l = 10;

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

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

但是我在编译错误,所以这显然是错误的。此外,我并不真正理解我做了什么以及为什么我做了什么。有人能告诉我这里的逻辑步骤吗?非常感谢。

共有2个答案

微生嘉祥
2023-03-14

你可能想阅读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”的值(value可能不是描述它的最佳词,因为它是一个字符串,但我想我已经明白我的意思了)

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)。

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

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

最后一条指令获取v2寄存器,并将v0的值放入其中。在执行这一行之前,v0的值来自JSONObject getInt(String)方法,而v2引用对象MyProcessor和“Lcom/breakapp/dd/mymod/Processor”-

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

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

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

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

裴韬
2023-03-14

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

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

摘自:Android破解!

 类似资料:
  • 我尝试的把上述代码放到计划任务的 shell 脚本框里 但是报错 我所使用的程序需要这个任务 。 能帮我把上面的任务 脚本翻译成 amh 所支持的格式吗? fresns 宝塔安装手册

  • 问题内容: 我无法理解网页的的文档中。 谁能简单地向我解释一下? 问题答案: 背后的想法是它将转换您的数据,使其分布的平均值为0,标准差为1。 对于多变量数据,这是按功能进行的(换句话说,独立于数据的每一列) 。 给定数据的分布,数据集中的每个值都将减去平均值,然后除以整个数据集(或多变量情况下的特征)的标准差。

  • 我不太理解while循环中的条件,以及它代表什么'>>>='。

  • 我对javascript还是个新手,只知道基本知识。有人能解释一下下面的代码,就像在调用init函数时发生的流中一样吗? 我对下面代码的理解是,一旦调用init函数,就会设置一个全局变量输出,该输出映射到一个带有id输出的HTML元素。然后调用。这将创建一个WebSocket对象。这之后是我不完全理解的部分。 在行中,WebSocket对象有一个名为open的属性,我们将它设置为任何返回的属性 。

  • 这是我从骡子3到骡子4转换的第一个项目。我与mule4一起工作,但在Mule3是新的。有谁能帮帮我吗?你能告诉我这些自定义处理器和变压器在这个mule3代码中的用途吗?而Mule4中的等价代码会是什么呢?在骡子4中没有像这样的自定义变压器。请帮帮我..

  • 我在计算这条线的时间复杂度时遇到了麻烦。在我看来是二次O(n**2)。因为如果不使用列表理解,这里必须经过嵌套循环。