1. 程式人生 > >帶你開發一款給Apk中自動注入程式碼工具icodetools 完善篇

帶你開發一款給Apk中自動注入程式碼工具icodetools 完善篇

               

一、前言

在前面已經介紹完了 自動給apk中注入日誌程式碼工具icodetools原理了,在那裡我們曾經說過其實離真正的可使用價值有點距離,本篇就對這個工具進行一些優化,讓其真正意義上開始能工作量產。當時在前面一篇文章中說到遺留的三個主要問題:

第一個問題:對每個類中都新增一個靜態列印方法堆疊資訊的方法,這樣會導致有些應用的dex過大,方法數超了問題

第二個問題:在從輸入一個apk到給每個類中的每個方法新增日誌程式碼然後在簽名輸出最終的apk,這個過程其實很多步,但是我們之前都是手動的去進行操作,非常麻煩,所以這裡還得解決一鍵化問題

第三個問題:在實際演練中會發現一些大型的app呼叫的方法特別多,導致咋們列印的日誌資訊過多霸屏,很難定位到我們真正想要的那個方法,而且列印日誌呼叫次數過多會導致應用出現無響應狀態。所以這裡得做一個開關和過濾規則

只有解決了這三個問題咋們才算是真正意義上的自動化工具,可以經歷各種app的考驗。

二、方法數超了問題修復

我們可以使用在前一篇講解原理的文章中的步驟來進行,用一個比較龐大的企業應用做案例,結果在使用dx將新增日誌程式碼之後的jar檔案轉化成dex檔案的時候出現報錯了:

看到這個我們就猜到了,我們新增日誌程式碼之後的jar中方法數超過了,原因其實很簡單,因為我們之前的新增日誌操作是在每個類中新增一個靜態列印日誌的方法,那麼如果對於一個dex檔案中有很多類,那麼就添加了很多相同的列印方法,方法數超了是有可能的。那麼如何解決這個問題呢?其實方案有兩個:

第一個方案:因為方法數超了,每個類都被添加了一個列印堆疊日誌的方法,咋們可以不用這個方法,把這個方法的程式碼直接拷貝到原來類中的每個方法前。但是這樣會帶來一個問題,如果一個類中的方法很多,那麼就會增加非常多的同樣程式碼。最後使用dx轉化的時候會發現也是報錯的。所以該方案不可行。

第二個方案:因為方法數超了,所以那個列印堆疊的方法肯定不能要了,但是又不能把程式碼都塞到每個方法的前面,那麼正常的編碼習慣是可以把這個列印方法抽取出來放到一個工具類中。從這裡可以看到這個方案是靠譜的。一個應用中只有這麼一個工具類,而且這個工具類包含了列印堆疊資訊的方法,那麼總體來看方法數是沒多大變化的,只是多了一個工具類。

有了方案,咋們就得實現了,但是這個實現還是有點曲折的,因為從方案2來看,我們需要給dex中新增一個工具類了,但是我們在前一篇文章中瞭解到,可以通過ClassVisitor類操作dex中的每個類資訊,通過MethodVisitor類操作dex中每個類的每個方法,但是沒有途徑可以新增一個類的。所以咋們得另想辦法了。

我們現在能夠往dex中塞入一個類有兩個方案:

第一個方案:非常清楚dex檔案格式之後,可以去手動的新增類資訊到dex中。但是這個方案我只是敢想一想,實踐的話我就算了,很簡單因為我怕麻煩!

第二個方案:可以利用jar工具,在我們把利用dex2jar把dex新增程式碼變成jar檔案之後,我們可以把jar檔案解壓,然後再把我們需要插入的類放到這個解壓目錄下,最後再用jar命令生成jar檔案。最終在使用dx命令生成dex檔案。這個方案有點複雜,但是靠譜好操作呀。現在看著有點複雜,但是下面會詳細介紹一個一鍵化工具,到時候都不用你來操作,何談複雜了。但是可惜的是,這個方案有一個缺點,就是解壓過程中,Windows平臺是不區分檔名的大小寫的,但是如果原來jar中的包名中有兩個類名是大小寫的,那麼解壓到本地的時候會出錯的。比如一個包裡面有A.class和a.class檔案,解壓到本地前者會被後者覆蓋,而且這個方案有點繁瑣了。

第三個方案:可以直接把編譯之後的classes檔案塞到jar檔案中。有了這個方案,實現比較簡單了。

注意:

1、這裡我們自己定義的類檔案一定要注意,首先這個類的包名一定要具有自己的唯一性,千萬不可與原來jar中的類重名了,要想做到完全唯一是不可能了。但是我們可以弄一個奇葩的包名和類名就可以了。這裡我用的名稱是:

cn.wjdiankong.jw.utils.JWUtils這個名稱了。現階段應該不會有重複。

程式碼比較簡單,咋們直接來看看即可:

這裡直接藉助ZipEntry類進行新增一個檔案到jar檔案中即可,但是在新增的時候一定要注意ZipEntry的名稱必須是類的全路徑名稱,我們是從工具命令外部傳入獲取到的類名:

下面咋們我們在每個類的每個方法之前呼叫這麼一行程式碼即可:JWUtils.printStackTrace("jw");,而這段程式碼對應的asm程式碼為:

上面操作完成之後,就可以執行一下程式了,前提是你得先準備一個需要插入的類JWUtils

首先預設情況下我們必須得準備一個cn.wjdiankong.jw.utils.JWUtils類,而且類中有一個列印堆疊的方法:

public static void printStackTrace(String tag){....},然後編譯獲取到JWUtils.class檔案放到指定工具根目錄下即可。當成功的把JWUtils.class檔案塞入到jar檔案中之後就可以直接使用dx命令進行轉化成dex了,這裡有可能會遇到這個錯誤:

這個錯誤原因是因為我用JDK1.8編譯了JWUtils.java檔案,而dx工具不相容這個JDK版本,所以可以使用1.8以下的版本編譯JWUtils.java檔案即可。

成功之後,在把dex檔案放到apk中,在重新簽名之後的apk,可以使用jadx開啟檢視:

看到了,在apk中我們已經成功的把我們的JWUtils類插入進去了,然後我們在隨便開啟一個其他類看看:

在類的每個方法之前也成功呼叫了JWUtils.printStatckTrace方法進行列印日誌資訊了。

那麼到這裡其實我們就解決了第一個問題了,而且從這裡可以看到以後如果我們想自己在列印什麼訊息可以自己實現JWUtils類,然後實現printStatckTrace方法即可,但是需要注意的是類名和包名以及方法的簽名都必須一致,不然會報錯的。

三、一鍵化功能完善問題

解決了第一個問題之後,咋們就可以來解決第二個問題了,第二個問題其實是為了工具更好的能夠被使用。因為我們在前面操作可以看到從輸入一個源apk到最終輸出一個新增日誌程式碼的apk有很多步驟,但是這些操作非常繁瑣。所以這裡我們就需要把每一步做到程式碼化,讓使用該工具的人無感知。所以一鍵化主要從下面幾步進行完善:

第一、解壓apk檔案獲取其所有的dex檔案

這個程式碼簡單不解釋了,但是這裡需要注意的是,不要解壓apk中所有的檔案,那樣沒必要也很浪費時間,這裡只需要解壓dex檔案和簽名目錄,因為簽名目錄在下一步需要用到:

第二、刪除原始簽名檔案

這一步是為了後面簽名工作準備,如果這裡不刪除簽名檔案的話,後面再進行二次簽名會發現有的apk有衝突

看到了吧,這裡如果不刪除原始簽名,重簽名之後的apk會有兩個簽名檔案,本來Android中是允許有多個簽名檔案的,但是這些簽名檔案資訊必須保持一致也就是需要用同樣的私鑰進行簽名,但是現在明顯不是,所以在安裝apk會報錯的。從這裡就可以看到咋們為了後面重簽名方便,就在這裡把原始簽名檔案刪除即可。

這裡為了方便就直接藉助aapt命令進行刪除apk中的簽名檔案了,命令很簡單:

aapt remove src.apk META-INF/XXX.RSA META-INF/XXX.SF MANIFEST.MF 

因為aapt不支援直接刪除目錄操作,所以這裡需要藉助第一步中的解壓META-INF目錄,得到應用的所有簽名檔案,然後在這裡組裝簽名檔名即可。

第三、新增日誌到dex檔案中

這個依然用我們之前介紹的改造之後的dex2jar的介面,把dex轉化成jar檔案,並且在每個類每個方法中新增日誌程式碼,這裡需要注意的是有的apk中可能有多個dex檔案,所以需要處理第一步中獲取到解壓之後的所有dex檔案。

第四、編譯JWUtils類檔案

這裡我們為了更好的後續拓展,所以只需要外部工具提供JWUtils.java檔案,內部我們自動使用javac將其編譯成JWUtils.class檔案了,

注意:

1、這裡使用javac命令編譯的時候,指定了類檔案格式是UTF-8的,所以如果想自己定義JWUtils類的話,需要注意這個檔案的格式為UTF-8,不然在編譯的時候可能會報錯。

2、因為JWUtils.java中用到了Android的系統api,所以編譯的時候需要攜帶系統的android.jar檔案一起進行編譯工作。

第五、新增JWUtils類檔案到源jar檔案中

這一步主要是我們把上面編譯好的JWUtils.class檔案直接塞入到jar檔案中即可。

第六、將jar檔案轉化成dex檔案

這裡需要注意因為有的應用可能包含多個dex檔案,所以咋們在給dex新增JWUtils類的時候,只需要在主dex中新增即可,不可重複新增。然後就藉助dx.jar這個工具進行轉化了。這個jar包在AndroidSDK目錄下有。構造好dx命令之後直接呼叫main方法即可。

第七、新增dex檔案到源apk中

這裡需要把我們新增程式碼之後的dex檔案插入到源apk中,依然藉助aapt命令即可,因為aapt命令不支援檔案覆蓋功能,所以咋們得先刪除原始的dex檔案,然後在新增新的dex檔案。

第八、重新簽名apk

這一步就簡單了,直接使用jarsigner工具命令進行apk簽名即可。簽名之後的檔案為signed.apk。這裡的簽名檔案資訊寫死了,不支援外部傳入的功能。

到這裡咋們就把所有的步驟用程式碼進行整合了,然後咋們需要把這個工具匯出一個可執行的jar檔案,但是我們還得想想為了讓這個工具更好的拓展,我們可以讓外部傳入一些引數做成動態化功能,這裡接受了外部傳入的5個引數資訊:

這裡接受的5個引數如下:

1》工具執行的當前目錄

2》需要處理的源apk檔案路徑

3》aapt命令的路徑

4》列印資訊的tag,預設是:jw

5》列印資訊的類名,預設是:cn.wjdiankong.jw.utils.JWUtils

6》列印資訊的方法名:預設是:printStackTrace

然後咋們還需要判斷aapt命令路徑是否有效,以及是否配置了JAVA_HOME環境變數,因為後面幾步都會依賴aapt工具和java的一些工具。所以這兩個內容是必要的。

有了這些接受引數,我們在外部就好擴充套件了,比如我們可以自己實現列印訊息的類,類名和包名隨意定義,也可以隨意定義列印日誌的方法名,但是方法的簽名不可變也就是必須是這種格式:public static void XXX(String tag)。其實這個簽名也是可以修改的,但是我覺得沒那個必要了。有這些拓展應該足夠用了。後續看使用者反饋可以在進行詳細修改。有了這個可執行jar包,咋們就可以簡單的寫一個批處理icodetools.bat:

cd %~dp0set aapt_path=D:\Android_tools\AndroidSdk\build-tools\23.0.1\aapt.exejava -jar libs\icode_tools.jar %~dp0 src.apk %aapt_path% jw cn.wjdiankong.jw.utils.JWUtils printStackTraceadb install -r signed.apkpause..

首先進入當前目錄,然後設定aapt_path環境變數,接著就要呼叫咋們匯出來的icode_tools.jar包了,看到這裡輸入了上面對應的6個引數資訊。這裡可以修改的,比如原始apk路徑,aapt路徑,列印訊息的tag等。最後為了方便直接在一鍵化安裝apk。當然這一步可能會失敗,不過失敗了可以自己想辦法安裝即可,簽名之後的apk是signed.apk,未簽名的apk是unsigned.apk,可以自己簽名的。

然後就是需要額外的jar包,因為在編譯類檔案的時候需要引用到系統api,所以這裡要用到android.jar檔案,放在當前目錄的libs下面,同時icode_tools.jar也是在這個目錄下,最後就是還需要一個列印訊息的工具類JWUtils.java了,所以最終咋們工具的目錄是這樣的結構:

這裡的簽名檔案資訊在工具中寫死了,所以這裡不支援修改,如果想自己重簽名可以使用工具執行完之後在當前目錄下有一個unsigned.apk檔案進行操作即可。

有了這個工具,咋們肯定想迫不及待的嘗試一下,現在我們只需要雙擊icodetools_1.0.bat批處理即可坐等結果了:

看到了,所有步驟一氣呵成,多麼智慧一鍵化,再也不用那麼費勁了。執行完命令之後的目錄有了簽名和未簽名的apk檔案如下:

後續還可以自己操作這兩個檔案。想怎麼玩就怎麼玩。

四、案例實踐

工具現在已經有了,但是我們上面都是用了簡單的案例apk進行操作的,這個明顯不符合現實,我們為了檢驗此工具的牛逼性,必須用一些大型app來做實驗。因為真的勇士敢於面對淋漓的鮮血!下面就用一個現在很火的直播軟體來進行操作,有人說為何不用微信,彆著急微信後面再用。

看到了,這裡因為應用包含了多個dex,而且每個dex檔案較大,所以在處理的過程中會比較耗時的,需要慢慢的等待

等操作結束之後,咋們直接執行應用,輸出log資訊:

日誌刷刷的,太辣眼睛了完全把握晃暈了,所以這個就是我們這次需要解決的第三個問題了。如何讓這些日誌資訊不霸屏,在指定地方列印我們想要的結果。

五、新增日誌列印過濾規則

從上面可以看到我們完成了所有的一鍵化操作,但是可惜的是被那些日誌霸屏了,完全懵逼的狀態。所以這裡我還得解決一個問題,就是給這個日誌加一些過濾規則,能夠很好的控制日誌,讓他受我控制。這個問題其實和上面的工具沒多大關係了,因為在前面我們知道,那個列印方法已經被弄出來放到了JWUtils這個類中,而這個類是工具需要編譯然後插入到dex中的,所以咋們就可以直接修改JWUtils中的列印日誌的方法即可。

下面就是我寫的JWUtils類,內部已經有了一些列印資訊的過濾規則,主要包括:控制日誌的總開關,需要列印日誌的方法名,返回型別,引數型別,類名等規則。這個規則是一個字串內容:

-s 1 -m JW -r int -p [int,java.lang.String] -c JWUtils

-s:表示日誌總開關

-m:表示需要列印日誌的方法名稱

-r:表示方法返回的型別

-p:表示方法的引數型別,多個型別直接用分號隔開

-c:表示需要新增日誌的類名

然後我把這行字串內容儲存到/data/local/tmp/log.txt檔案中,為什麼要儲存到這裡呢?有的同學想儲存到SD卡中,但是假如有的應用沒有宣告SD讀寫許可權,那怎麼辦?我們最終的JWUtils類是被插入到應用中的。所以就想到了系統有一個不需要許可權有沒有沙盒許可權限制的目錄:/data/local/tmp/

下面簡要的說一下這個過濾規則吧:

首先我們可以在一個方法中獲取當前方法的堆疊資訊,所以就可以獲取到當前方法名和類名了:

StackTraceElement[] stackElements = new Throwable().getStackTrace();

因為我們想要獲取到被插入列印程式碼的方法資訊,所以這裡只要獲取陣列的第二個元素即可,第一個元素其實是JWUtils.printStackTrace方法資訊了。有了這個元素之後直接呼叫它的兩個方法就可以獲取到當前方法名稱和類名稱了,這個也就可以做到方法名和型別的過濾規則了。

而對於上面只能簡單的獲取到指定的方法名和型別,卻獲取不到對應方法的簽名信息,比如引數型別,返回值型別等。所以這裡得費點事,就是需要通過上面獲取到的類名然後用Class.forName方法獲取到對應類的Class物件,然後在獲取該類所有的方法資訊:

然後用一個全域性陣列進行儲存,在結合上面的方法名去遍歷這個陣列,就可以獲取到指定方法名對應的方法資訊了:

這樣就可以做到方法的返回值型別,引數型別的過濾規則了,但是有同學會發現這裡有一個問題,假如一個類中有重構方法,也就是方法名相同的但是方法簽名不一樣,這裡因為只是通過檢測方法名來獲取到method的資訊的。所以對於同一個類中重構方法是沒有過濾效果的。

最後就是一個日誌總開關了,所以最終的過濾規則如下:

有了這個規則之後,咋們再次操作一下,把這個JWUtils類放到icode_tools目錄中,然後再次跑一下icode_tools批處理,安裝即可,這時候我們先設定一個過濾規則,直接使用命令就進行操作了:

我開始的時候把日誌關閉,然後在開啟,在關閉看一下效果,我們使用echo命令寫入一條規則關閉日誌:

看到了吧,這裡我們通過總開關可以控制日誌輸出了,下面再來一條實際的過濾規則,就是通過包名,方法名,返回型別等規則操作一下:-s 1 -m a -c com.meelive.ingkee.v1.core.a.a

這裡我們通過方法名和型別進行過濾限制,列印之後的結果都是指定類名的方法日誌了。

上面操作的是某直播軟體,為了有說服力,我得用微信在嘗試一下哈:

看到了,此刻我們加上規則之後,開啟微信頓時覺得爽多了,日誌不多,慢慢操作檢視具體方法,從微信的日誌看,這個版本已經開始使用熱修復框架Tinker了。後面得趕快出一篇分析Tinker框架的文章了。

最後在來看一下QQ的日誌:

注意:此過濾規則可以自己定義的,因為所有的列印訊息邏輯都在JWUtils類中,上面說到這個類是開放出來的,也就是可以自己隨便定義這個類的資訊!

六、問題總結

好了,到這裡我們已經解決了在前一篇文章中遇到的三個問題,也是填完了工具的坑,下面來總結一下這三個問題:

第一個問題:方法數超了問題,因為我們給每個類都添加了一個列印堆疊資訊的方法,所以如果一個dex中包含很多類的話,那麼就會額外增加很多方法,在使用dx工具進行轉化的時候出現了方法數超的問題。

解決方案:可以把列印堆疊資訊的方法抽取到一個工具類中,然後把這個類插入到dex中,這裡採用的方案是通過dex2jar工具轉化dex成jar檔案,然後在編譯需要插入的類檔案,把編譯之後的類檔案直接塞入到jar檔案中,最後在原先的dex基礎上每個類中的每個方法只需要呼叫JWUtils.printStackTrace方法即可。

第二個問題:一鍵化完善工作,這個是因為我們在前面文章中操作的時候發現從抽離apk中的dex檔案到最終重簽名apk檔案有很多步驟,但是都是人工操作的,非常繁瑣,所以可以把這些步驟進行整合一步到位。

解決方案:先從apk中解壓出dex檔案和簽名檔案==》利用aapt命令刪除apk中的簽名檔案==》新增程式碼到dex中==》編譯工具類得到class檔案,塞入到jar檔案中==》使用dx命令轉化成dex檔案==》使用aapt命令覆蓋apk中舊的dex檔案==》使用jarsigner對apk重新簽名。

然後把工程匯出一個可執行的jar包,這裡為了後續擴充套件,就提供了執行的入口引數:

1》工具執行的當前目錄

2》需要處理的源apk檔案路徑

3》aapt命令的路徑

4》列印資訊的tag,預設是:jw

5》列印資訊的類名,預設是:cn.wjdiankong.jw.utils.JWUtils

6》列印資訊的方法名:預設是:printStackTrace

然後我們還需要提供一個批處理icodetools.bat檔案,主要執行的命令是:

java -jar libs\icode_tools.jar %~dp0 src.apk %aapt_path% jw cn.wjdiankong.jw.utils.JWUtils printStackTrace

第三個問題:優化列印日誌資訊規則,這個是因為當我們使用一鍵化工具生成apk安裝執行之後發現列印日誌太多導致霸屏,而且應用本身還會出現了ANR問題。所以得想個辦法控制列印日誌輸出。

解決方案:加一些日誌輸出過濾規則,首先咋們得有一個日誌總開關,然後是可以指定需要列印方法所屬的類名,方法名,以及方法的返回型別,引數型別等過濾規則。

需要注意的是,這個過濾規則都是工具使用者可以自己實現的,就在JWUtils類中,程式碼可以自行修改,如果不想修改,預設的我已經加了這些規則:

-s 1 -m JW -r int -p [int,java.lang.String] -c JWUtils

-s:表示日誌總開關

-m:表示需要列印日誌的方法名稱

-r:表示方法返回的型別

-p:表示方法的引數型別,多個型別直接用分號隔開

-c:表示需要新增日誌的類名

我們可以通過echo命令給/data/local/tmp/log.txt檔案輸入規則來控制日誌輸出。

七、增長經驗值

本文中我們可以學習到一些知識點和經驗值:

1、瞭解到一種往dex檔案中插入一個類檔案的方法

先把dex轉成jar檔案,然後解壓jar檔案,複製對應的類檔案到解壓目錄下,然後在使用jar命令進行class檔案重新打包成jar檔案即可。最後在使用dx命令轉成dex檔案。

2、瞭解到如何在一個方法中得到該方法的簽名信息。

通過堆疊資訊獲取到該方法的名稱和所在的類名,然後在使用Class.forName方法通過類名得到類物件,然後在使用反射獲取到該類對應的所有方法簽名信息,然後通過之前的方法名進行檢索獲取到對應方法的簽名信息。

3、javac,jarsiginer,aapt命令的常見用法。

八、工具使用說明

1、當前目錄的需要操作的apk檔名稱預設是src.apk檔案,如果想修改apk名稱,可以手動的修改icodetools.bat中的apk檔名

2、在icodetools.bat中可以指定當前日誌的tag,預設值是jw

3、當前目錄下還有一個JWUtils.java這個java檔案,這個類中有一些列印方法,可以根據自己的需求定義一些方法,但是定義的方法必須有要求:1》必須是static型別2》方法只允許有一個引數是String型別的,而這個引數就是列印的日誌tag3》方法名稱可以隨意指定,但是必須在icodetools.bat中保持一致所以最終的方法模板為: public static XXX YYY(String tag)這個類的名稱可以變動,但必須和icodetools.bat中保持一致

4、當前目錄下的libs目錄中是工具依賴的jar包,不可以隨便修改

5、當前目錄下的JWUtils.java檔名和包名都不可變動

6、cyy_game.keystore簽名檔名不可進行修改

7、如果想自己再次簽名,可以使用unsigned.apk檔案操作,signed.apk是使用了cyy_game.keystore檔案簽名

8、在icodetools.bat中需要手動設定aapt命令的路徑

9、工具執行前必須配置JAVA_HOME環境變數

10、現階段只支援JDK1.7以及以下版本編譯器,不支援1.8以及以上的

注意:工具目錄下有兩個指令碼,一個是icodetools_1.0.bat,一個是icodetools_2.0.bat,這兩個工具主要是因為為了相容更多的apk,預設最好先採用icodetools_1.0.bat工具進行嘗試,失敗了可以在使用icodetools_2.0.bat工具,如果都失敗了那就要反饋問題給我了!

九、工具使用常見問題

第一個問題:Uncaught translation error: com.android.dx.cf.code.SimException

這樣的錯誤是因為工具版本不相容問題,可以嘗試使用另外一個版本操作。如果icodetools_1.0.bat操作有問題具使用icodetools_2.0.bat工具操作,如果icodetools_2.0.bat工具操作有問題就是用icodetools_1.0.bat工具進行操作。如果兩個工具都有問題那就是真的有問題了,記得給我反饋!

第二個問題:拷貝檔案失敗:java.io.FileNotFoundException: JWUtils.class

這個錯誤主要是因為工具內部會採用javac編譯JWUtils類檔案,這裡應該是編譯失敗了,大部分原因是因為JWUtils這個類檔案的編碼格式和語法格式導致的,所以解決版本,可以自己使用javac命令進行編譯看看具體是哪裡編譯出了問題。

第三個問題:bad class file magic (cafebabe) or version (0034.0000)

這個問題是因為javac這個命令是1.7以上版本的,也就是JDK版本。但是此工具現在只支援JDK1.8版本以下的。所以這裡需要設定JDK版本。

第四個問題:成功注入程式碼安裝之後發現無日誌資訊

這個問題可能有兩個原因:第一個是需要檢查日誌的tag是否正確,主要通過檢視icodetools.bat檔案中的執行命令,第二個原因是因為預設情況下開始日誌開關是關閉的,所以我們還得手動開啟,首先得去/data/local/tmp目錄下,然後使用echo "-s 1" >log.txt,開啟日誌即可。

當然還有其他問題,所以我希望大家在使用的過程中遇到問題以及一些優化建議都可以提給我,我會盡快修復!

宣告:有人認為有了這個工具迫不及待的手癢想立馬下載嘗試,但是我想說這還沒有結束,因為後面一篇文章才是重點,任何一個工具都需要發揮其作用才是個好工具,所以下一篇文章就會帶大家用這個工具來破解一些app!

後期優化:現階段此工具支援Windows系統,後續會增加Mac和Linux系統,現階段只支援apk根目錄下的dex檔案,不支援其他目錄下的dex檔案處理,所以對於有些apk此工具處理過程中會出現錯誤!

十、總結

解決了這三個問題之後,咋們的工具才算是比較完整的能夠用於生產的工具了,但是因為是本人業餘時間編寫的,所以我相信這個工具肯定還有一些漏洞,以及需要優化改善的地方,所以我先將此工具的第一版本給出,非常歡迎大家一起使用,如果在使用的過程中發現有一些問題,一定要記得給我留言,我會立即修復和改善,我相信一個好的工具是靠大家一起貢獻的。問題反饋可以在我微信私聊我或者是在微信公眾號留言都是可以的,我會第一時間回覆,先拜謝各位使用者了。寫了這篇文章之後並沒有結束,因為後面還有一篇文章會詳細介紹這個工具的實際使用,如何用它來解決我們的實際問題,比如尋找hook點。文章算是寫完了,精力卻全沒了,感覺自己身體被掏空了一樣,感謝大家多多點贊,要是有打賞就在好不過了!

《Android應用安全防護和逆向分析》

點選立即購買:京東  天貓

更多內容:點選這裡

關注微信公眾號,最新技術乾貨實時推送

掃一掃加小編微信新增時註明:“編碼美麗”否則不予通過!