1. 程式人生 > >android黑科技系列——自動註入代碼工具icodetools

android黑科技系列——自動註入代碼工具icodetools

sign 反射 其他 但是 方便 all 自動化工具 知識點 class對象

一、前言

在前面已經介紹完了 自動給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 %~dp0
set aapt_path=D:\Android_tools\AndroidSdk\build-tools\23.0.1\aapt.exe
java -jar libs\icode_tools.jar %~dp0 src.apk %aapt_path% jw cn.wjdiankong.jw.utils.JWUtils printStackTrace
adb install -r signed.apk
pause..

首先進入當前目錄,然後設置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類型的,而這個參數就是打印的日誌tag
3》方法名稱可以隨意指定,但是必須在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,打開日誌即可。

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

工具下載地址:https://github.com/fourbrother/icodetools

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

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

十、總結

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

android黑科技系列——自動註入代碼工具icodetools