【问题标题】:"smali" grammar specification | smali log injection"smali" 语法规范 | smali 日志注入
【发布时间】:2013-08-02 12:40:54
【问题描述】:

smali 代码是否有可用的语法规范?我正在尝试使用 smali 代码,而我缺少的一件事是 smali 中的某些方法具有 .prologue 部分,而有些则没有。不幸的是,wiki 似乎没有关于 smali 语法的信息。以前有没有人发现自己处于这种情况?任何建议/解决方案将不胜感激。

EDIT1:我的目标是将日志消息添加到应用程序所有活动的 onResume 方法的开头。

EDIT2:我正在使用 ANTLRv4.1 解析器来解析我的 smali 文件,我从 smaliLexer 获得了一个 CommonTree(解析树)和一个 TokenStream。现在是为日志指令创建令牌并更改解析树,然后生成 classes.dex 文件是正确的方法吗?到目前为止,我还没有找到更改 TokenStream 的方法,并且无法从更改后的 ParseTree 生成 dex 文件。

【问题讨论】:

  • 对于实际的指令集,我总是查看以下操作码列表:pallergabor.uw.hu/androidblog/dalvik_opcodes.html 不过,不知道确切的规范。
  • 感谢@dst 的评论。是的,我确实查看了操作码。我对 .prologue 部分、.end 方法部分、.locals 部分等 smali 的规范更感兴趣。我在任何地方都找不到规范,因此找不到问题。

标签: android grammar antlr4 smali


【解决方案1】:

smali 语言中的几乎所有内容都有 dalvik 字节码/dex 格式的直接类似物。在这种情况下,.prologue 指令对应于作为 debug_info_item 一部分的 DBG_SET_PROLOGUE_END 调试操作码。

来自http://s.android.com/tech/dalvik/dex-format.html

设置prologue_end状态机寄存器,表示下一个 添加的位置条目应视为方法的结尾 序言(方法断点的适当位置)。这 prologue_end 寄存器被任何特殊 (>= 0x0a) 操作码清除。

【讨论】:

  • 谢谢。更详细地说,我有兴趣了解 .smali 文件中方法定义的第一行。我认为所有方法都有 .prologue 指令,之后出现该方法的第一条指令。我在一些应用程序中发现 .prologue 部分不存在。有没有一种通用的方法来识别 .smali 文件中方法指令的开头?
  • 听起来您正在尝试解析 smali 文件。为了正确地做到这一点......您需要实际解析它们,而不仅仅是搜索文本:)。我想到了几件事。 1. 您可能会考虑使用 smali 本身使用的现有 ANTLR 解析器。 2.你可能会考虑使用dexlib2,直接处理dex文件,而不必解析smali文件。
  • 当然,我会尝试使用 ANTLR smali 解析器或使用 dexlib2 来解析 smali 文件,如果需要,我会回来。谢谢你给我指路。
  • (注意:dexlib2库目前在smali仓库的dexlib_redesign分支)
  • 如果你想实际修改方法,使用 dexlib2 可能会更好。
【解决方案2】:

您可以查看 smali 词法分析器描述本身,它是从 jflex grammar 构建的。将序言代码跳过到令牌规范开始的第 #177 行。

【讨论】:

  • 感谢 Seki - 这应该是一个很好的起点。您指出的代码具有所有令牌规范。我想要的是解析器代码。但是感谢您指引我正确的方向,我可以看看 apktool smali 解析器源代码以获得更好的想法。
猜你喜欢
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多