baksmali和smali源碼分析(六)

      smali框架源碼主要是對於baksmali的一個逆向過程,也就是其編譯過程。本身包的文件很少,也就是13個java文件

 

 但是裏面有幾個有antlr3 和 jflex生成的詞法分析器和解釋器文件

 

 smaliParser.java

 smaliTreeWalker.java

 

 這兩個文件時由 antlr3 生成的

 

 smaliFlexLexer.java

 這個文件是由 jflex生成的

 

 對於這兩部分的生成,以及這兩個工具的使用,筆者未做深入研究。而smali本身最核心的地方就是利用這幾個詞法分析器 來生成不同的label,instruction,field,method,class等對象,最後組裝成dex文件,這幾個語義解析的文件主要還是爲smali提供彈藥,而真正組裝成最後我們看到的dex文件,其實是dexlib2做的事情。

 

 下一步我們需要好好看看dexlib2的源碼框架。


其實前面描述了那麼多,不管是baksmali還是smali工具,多是涉及到一些對於dex文件的外圍io操作,而真正解析dex,解析dex各種指令,各種索引的操作是放在dexlib2這個目錄下面的,下面就讓我們走進dexlib2這個目錄,好好分析一下這個庫是如何解析android dex文件的吧。


還是老規矩,先介紹源碼的目錄結構已經關鍵代碼文件的作用,給大家有個整體上的認識再逐步細化。見下圖 dexlib2代碼目錄


wKiom1P9xpig58yvAADclCjCASw631.jpg



這個是dexlib2的目錄,明顯看出來比baksmali和smali代碼量要多很多,這裏先將核心目錄給大家做一下介紹


analysis 這個暫時不知道具體作用


base     這個文件夾下面全部都是抽象類,主要是對於一些dex文件的一些基礎數據結構的一些表示

              這裏面重點要注意的是這個目錄下面的 reference這個文件夾,裏面分別有 field索引,

             method索引,string索引,以及type索引,這些都是跟dex文件本身組織結構息息相關的,

             這裏如果不是太清楚的話,建議看一下dex文件的文件組織結構。裏面有表示string type

             proto  class的這些段的。


value        目錄下面的這些類都是跟類成員變量初始值相關的操作,比如 在某個類中的成員變量

                 String m_s = "hello world"  這個時候就要用到 BaseStringEncodedValue 這個類的操作

                 了


 base    主目錄下的這幾個文件,

             BaseAnnotation.java  BaseAnnotationElement.java 跟註釋相關

             BaseExceptionHandler.java   try catch後的exceptionhandler相關

             BaseMethodParameter.java    函數參數相關

             BaseTryBlock                try catch塊相關

         

         

builder  這個是爲生成dex文件的一些組件文件,

         build/debug         下面是對於 dex文件中debug信息保存的類,爲最後生成dex做準備

         build/instruction    對於dalvik虛擬機支持的所有指令的支持的類,格式很鮮明,基本上

                                        每種類型的dalvik虛擬機指令用一個類來表示                              

         build/                       這下面就放了一些對於debug信息,異常句柄,指令,swith case塊,

                                          trycatch 塊,函數builder的一些實現

         總之這個文件夾下是支撐將smali文件寫回爲dex文件的類庫

         

         

dexbacked  這個目錄其實是將輸入的dex進行解析後接受的類庫

           dexbacked/instruction   解析後的dex的所有指令存放的類,也是以某類指令建立類來接收的

           dexbacked/raw          

 對於dex文件結構的各個組件接收的類。比如typeid,stringid,classdef,protoid,mapitem,headeritem,這些對比dex文件的結構就能和這些類一一對應起來    

                              

           dexbacked/reference     dex文件中的成員變量索引,方法索引,字符串索引,類型索引的類

           dexbacked/util          一些小的工具的類集合

           dexbacked/value         還是跟初始值相關的類

           dexbacked               一些更加上層抽象的類,表示的信息量更多,比如DexBackedClassDef.java

                                   就表示一個類,但是這個類又是由n個成員變量,n個方法來表示的,對於

                                   成員變量又涉及到了初始值,權限,訪問屬性,本身定義等,

                                   對於成員方法就更復雜了,除了指令還有try catch信息 debug信息,註釋信息等等


           總之, dexbacked這個類庫,有java語言完整表達了整個dex文件的文件結構,細化到dex文件的每個細節,就是說這個文件夾下的類已經能夠涵蓋dex文件所有的東西,裏面的每個類,每個方法,每條指令都能從這個文件夾下找到相應的類來表示。        



iface      這個就是一個接口定義類,前面提到的base抽象類都是繼承與這個文件夾下面的類,主要是爲了                利用java多態的特點,減少代碼的編寫量,讓代碼看起來更加專業。

           


immutable      

這個文件夾提供了爲類,方法,成員變量,指令,各種索引的不可更改的常量定義,但是這些類本身是可以new出來的,當你要爲dex文件添加類,方法,成員變量或者指令的 時候,這個文件夾下面的類就很有作用了,可以用這個文件夾下面的類輕鬆構造出來各種索引,達到更改dex文件的目的,一般要配合builder下的各種方法來使用

                     

           

rewriter       這個文件夾下面提供了對於寫回dex文件各種函數的hook,包括寫回類的hook,

                    寫回方法的hook,甚至到寫回每條指令的hook,這個文件夾其實起到的作用也是爲了能夠

                    通過hook方便的修改dex文件。

           


writer     寫回dex文件啓動的文件夾,前面的builder這些都是爲其提供彈藥的,這裏整體的dex文件的生成

            ,所有組織都是通過這個文件夾下面的不同的類協同完成的。

           

           

.             直接根目錄下的是更基礎的訪問權限,指令格式,操作格式,索引,值類型的一些基礎類了



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章