修改原始碼實現全域性(無需root)注入躲開注入檢測
阿新 • • 發佈:2019-02-19
看這篇文章需要的技能
1.會編譯android原始碼(如果你不願意編譯原始碼,還有另外一種辦法,下面我會提供)
2.會使用substrate或者xposed
以上2個網上資料很多我就不囉嗦了
一、市面上目前的hook和注入工具
市面上目前的hook有substrate,xposed,或者一些開源的自己實現的hook和注入,但是會呼叫一些系統api或者自身一些特徵,會被加固檢測到,故提供以下文章
二、全域性注入的三種思路
首先我們注入的目的,就是讓我們寫的鉤子程式碼xx.so可以注入到yyy程式裡面去,這樣我們的xx.so就可以呼叫諸如mprotect和mmap來修改記憶體屬性,去修改目標程式的記憶體可以來實現got hook或者inline,異或修改機器碼的跳轉,異或修改資料實現記憶體修改器。
故實現全域性注入有三種辦法
思路一:替換zygote, xposed那種,不多說由於其特徵會被檢測到,不囉嗦了網上資料很多
思路二:從so載入的過程看
可以修改linker原始碼,在其載入程式so的時候,比如在do_dlopen
soinfo* do_dlopen(const char* name, int flags)
{
soinfo* si = find_library( name); //查詢動態連結庫
if (si != NULL)
{
//載入我們的so
}
}
dlopen我們的so(試過失敗告終,linker不允許使用malloc函式等基礎函式,而一些libc的一些基本函式,如fgets依賴於malloc的實現)
思路三:從apk啟動java層的程式碼看
(成功這也是我要介紹的)
三、根據思路三
修改 frameworks/base/core/java/android/app/ActivityThread.java檔案
在handleBindApplication函式插入如下程式碼
private void handleBindApplication(AppBindData data)
{
//snownote 2016/12/
//=================全域性注入之修改java層===================================================
Log.e("snowchangeFrameworkInject","--processname="+data.processName);
File ssfile=new File("/data/local/changeFrameWorkHookConfig.txt");
if(ssfile.exists())
{
FileReader ssfr = null;
try {
ssfr = new FileReader(ssfile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BufferedReader ssbr=new BufferedReader(ssfr);
String tagetPackage=null;
String soPath=null;
try {
tagetPackage=ssbr.readLine();//得到程序名,一般就是包名
} catch (IOException e) {
e.printStackTrace();
}
if(tagetPackage!=null)
{
try {
soPath=ssbr.readLine();//得到要載入的so路徑
} catch (IOException e) {
e.printStackTrace();
}
}
try {
ssfr.close();
ssbr.close();
} catch (IOException e) {
e.printStackTrace();
}
if(data.processName.equals(tagetPackage))
{
Log.e("snowchangeFrameworkInject ","----tagetPackage"+tagetPackage);
if(soPath!=null)
{
Log.e("snowchangeFrameworkInject ","---start-load-soPath"+soPath);
System.load(soPath);
}
}
}
//=============================================================================
然後編譯原始碼,將changeFrameWorkHookConfig.txt檔案內容設定為
第一行,你要注入的程式的程序名,一般寫包名就行了 com.carrot.carrotfantasy
第二行,你要注入的so路徑 /data/local/libhooktest.so
把txt檔案push到手機的/data/local/目錄,即可不用實現注入而讓我們的鉤子程式碼進入程式程序
接下來就是怎麼寫libhooktest.so這個了
辦法一:你可以使用substrate提供的hook api把你的hook程式碼編譯成一個so
辦法二:你可以不用別人的hook框架,自己寫hook,這裡我提供一份我以前整合修改好的hook程式碼,包括inline hook和got hook大家湊合著用吧(此ininline hook中指令重定位部分,參考網友ele7enxxh, 感謝他解決了繁瑣的指令重定位問題,有興趣的可以看github上他的完整的他有對多程序進行處理哦!!)。
四、不想修改原始碼的請看這裡 look me!!!!
Pull出你的裝置/system/framework/framework.jar此檔案,
用baksmali反編譯出smali,java -jar D:\run_ProgramFile\baksmali_smali\baksmali.jar -o classout/ framework.jar
找到ActivityThread.smali,把我提供的(我這裡是android4.4)替換回去,再重新編譯回去,
java -jar D:\run_ProgramFile\baksmali_smali\smali.jar classout/ -o framework_new.jar
如果你別的android系統,也可以自己寫個demo把得到的smali自己加入ActivityThread.smali
push到裝置就行了,記得重新裝置生效
對於不想root的不能push到/data/local目錄的可以先push到別的目錄,然後cp過去,或者換別的目錄,比如sdcard
最後附加內容
inline hook和got hook實現原始碼(曾經拿保衛蘿蔔和我的世界測試成功)
和我曾經編譯android4.x+2.3x+5.1x原始碼+修改原始碼真機執行的詳細筆記(網上編譯android原始碼的文章多如牛毛啊,實際詳細的卻很少)
我修改過的framework.jar*轉載請註明來自看雪論壇@PEdiy.com
1.會編譯android原始碼(如果你不願意編譯原始碼,還有另外一種辦法,下面我會提供)
2.會使用substrate或者xposed
以上2個網上資料很多我就不囉嗦了
一、市面上目前的hook和注入工具
市面上目前的hook有substrate,xposed,或者一些開源的自己實現的hook和注入,但是會呼叫一些系統api或者自身一些特徵,會被加固檢測到,故提供以下文章
二、全域性注入的三種思路
首先我們注入的目的,就是讓我們寫的鉤子程式碼xx.so可以注入到yyy程式裡面去,這樣我們的xx.so就可以呼叫諸如mprotect和mmap來修改記憶體屬性,去修改目標程式的記憶體可以來實現got hook或者inline,異或修改機器碼的跳轉,異或修改資料實現記憶體修改器。
故實現全域性注入有三種辦法
思路一:替換zygote, xposed那種,不多說由於其特徵會被檢測到,不囉嗦了網上資料很多
思路二:從so載入的過程看
可以修改linker原始碼,在其載入程式so的時候,比如在do_dlopen
soinfo* do_dlopen(const char* name, int flags)
{
soinfo* si = find_library( name); //查詢動態連結庫
if (si != NULL)
{
//載入我們的so
}
}
dlopen我們的so(試過失敗告終,linker不允許使用malloc函式等基礎函式,而一些libc的一些基本函式,如fgets依賴於malloc的實現)
思路三:從apk啟動java層的程式碼看
(成功這也是我要介紹的)
三、根據思路三
修改 frameworks/base/core/java/android/app/ActivityThread.java檔案
在handleBindApplication函式插入如下程式碼
private void handleBindApplication(AppBindData data)
{
//snownote 2016/12/
//=================全域性注入之修改java層===================================================
Log.e("snowchangeFrameworkInject","--processname="+data.processName);
File ssfile=new File("/data/local/changeFrameWorkHookConfig.txt");
if(ssfile.exists())
{
FileReader ssfr = null;
try {
ssfr = new FileReader(ssfile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BufferedReader ssbr=new BufferedReader(ssfr);
String tagetPackage=null;
String soPath=null;
try {
tagetPackage=ssbr.readLine();//得到程序名,一般就是包名
} catch (IOException e) {
e.printStackTrace();
}
if(tagetPackage!=null)
{
try {
soPath=ssbr.readLine();//得到要載入的so路徑
} catch (IOException e) {
e.printStackTrace();
}
}
try {
ssfr.close();
ssbr.close();
} catch (IOException e) {
e.printStackTrace();
}
if(data.processName.equals(tagetPackage))
{
Log.e("snowchangeFrameworkInject ","----tagetPackage"+tagetPackage);
if(soPath!=null)
{
Log.e("snowchangeFrameworkInject ","---start-load-soPath"+soPath);
System.load(soPath);
}
}
}
//=============================================================================
然後編譯原始碼,將changeFrameWorkHookConfig.txt檔案內容設定為
第一行,你要注入的程式的程序名,一般寫包名就行了 com.carrot.carrotfantasy
第二行,你要注入的so路徑 /data/local/libhooktest.so
把txt檔案push到手機的/data/local/目錄,即可不用實現注入而讓我們的鉤子程式碼進入程式程序
接下來就是怎麼寫libhooktest.so這個了
辦法一:你可以使用substrate提供的hook api把你的hook程式碼編譯成一個so
辦法二:你可以不用別人的hook框架,自己寫hook,這裡我提供一份我以前整合修改好的hook程式碼,包括inline hook和got hook大家湊合著用吧(此ininline hook中指令重定位部分,參考網友ele7enxxh,
四、不想修改原始碼的請看這裡 look me!!!!
Pull出你的裝置/system/framework/framework.jar此檔案,
用baksmali反編譯出smali,java -jar D:\run_ProgramFile\baksmali_smali\baksmali.jar -o classout/ framework.jar
找到ActivityThread.smali,把我提供的(我這裡是android4.4)替換回去,再重新編譯回去,
java -jar D:\run_ProgramFile\baksmali_smali\smali.jar classout/ -o framework_new.jar
如果你別的android系統,也可以自己寫個demo把得到的smali自己加入ActivityThread.smali
push到裝置就行了,記得重新裝置生效
對於不想root的不能push到/data/local目錄的可以先push到別的目錄,然後cp過去,或者換別的目錄,比如sdcard
最後附加內容
inline hook和got hook實現原始碼(曾經拿保衛蘿蔔和我的世界測試成功)
和我曾經編譯android4.x+2.3x+5.1x原始碼+修改原始碼真機執行的詳細筆記(網上編譯android原始碼的文章多如牛毛啊,實際詳細的卻很少)
我修改過的framework.jar*轉載請註明來自看雪論壇@PEdiy.com