溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

baksmali和smali源碼分析(六)

發布時間:2020-07-18 20:24:20 來源:網絡 閱讀:1503 作者:sunzeduo 欄目:開發技術

      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代碼目錄


baksmali和smali源碼分析(六)



這個是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文件的生成

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

           

           

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



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女