2013-08-02 60 views
3

是否有可用於smali代碼的任何語法規範?我正在嘗試使用smali代碼,其中一個缺失的事情是smali中的某些方法具有.prologue部分,而另一些則沒有。不幸的是,wiki似乎沒有關於smali語法的信息。有沒有人發現你自己在這種情況下?任何建議/解決方案將不勝感激。「smali」語法specfication | smali日誌注入

EDIT1:我的目標是將日誌消息添加到應用程序的所有活動的onResume方法的開始處。編輯2:我使用ANTLRv4.1解析器來解析我的smali文件,並從smaliLexer中得到CommonTree(解析樹)和TokenStream。現在正在爲日誌指令創建令牌並更改分析樹,然後生成classes.dex文件是否正確?到目前爲止,我還沒有找到一種方法來改變TokenStream,我無法從改變的ParseTree生成dex文件。

+0

對於實際的指令集,我總是看一下操作碼的這個名單:http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html 有關確切的規格不知道,但。 – dst

+0

感謝您的評論@dst。是的,我看看操作碼。我更喜歡.prologue部分,.end方法部分,.locals部分等smali的規範。我無法找到任何地方的規格,因此也就是問題。 – TheGT

回答

3

幾乎所有在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)操作碼清除。

+0

謝謝。爲了更加細緻,我有興趣瞭解.smali文件中方法定義的第一行。我認爲所有的方法都有.prologue指令,之後出現該方法的第一條指令。我發現在一些應用程序中,.prologue部分不存在。是否有一種通用的方法來識別.smali文件中方法指令的開始? – TheGT

+0

這聽起來像你正在試圖解析smali文件。爲了做到這一點......你需要真正解析它們,而不僅僅是搜索文本:)。想到幾件事情。 1.您可能會考慮使用smali自己使用的現有ANTLR解析器。 2.您可能會考慮使用dexlib2並直接使用dex文件,而不是必須解析smali文件。 – JesusFreke

+0

當然,我會刺探使用ANTLR smali分析器或使用dexlib2來解析smali文件,如果需要的話可以返回。謝謝你給我的方向。 – TheGT

1

你可以看看小本體的描述本身,它是從jflex grammar構建的。跳過序言代碼到令牌規範開始的第#177行。

+0

謝謝關 - 這應該是一個很好的起點。您指出的代碼具有所有令牌規範。我想要的是解析器代碼。但是,感謝您指導我朝着正確的方向發展,我可以看看apktool smali解析器源代碼以獲得更好的想法。 – TheGT