日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

全能HOOK框架 JNI NATIVE JAVA ART DALVIK

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全能HOOK框架 JNI NATIVE JAVA ART DALVIK 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OneHook

目前比較流行的幾個安卓HOOK方案,都有功能上的欠缺,有的不支持art模式,有的不支持jni層,有的不支持侵入HOOK。

所以OneHook誕生了!

這是一個同時支持ART和Dalvik兩種模式,理論上支持安卓4.0.3以上所有版本,同時支持JAVA和NATIVE層,使用全局注入技術的侵入式HOOK框架。

本框架不需要額外的安裝,可以靜態編譯到自己的APP中。



首先感謝看雪論壇中很多大牛提供的技術資料,沒有你們的分享,就沒有目前的這個OneHook的誕生。

感謝ele7enxxh提供的Android Inline Hook模塊

項目地址:https://github.com/ele7enxxh/Android-Inline-Hook

項目博客: http://ele7enxxh.com/Android-Arm-Inline-Hook.html

討論帖: http://bbs.pediy.com/thread-205741.htm

感謝asLody提供的Legend模塊

項目地址:https://github.com/aslody/legend

還感謝其他貢獻知識的同學們。


功能實現:

0x01

首先考慮如何進入系統,如何在合適的位置和時間啟動我的模塊。之前做WIN32的時候就有人說過,如果在WINDOWS啟動前前運行我的代碼,那么我無所不能。理論上,這句話是成立的。

所以在安卓系統,我也需要找一個相對足夠早的位置來啟動我的模塊,這個位置我沒有選擇init進程,而是libc.so。

為什么?

因為安卓的底層是LINUX構建的,LINUX的底層就是C語言,而libc.so就是C語言的具體實現庫,在這個位置上插入代碼顯然是合適的。而且在libc.so中去執行我們的代碼,就不需要去考慮如何注入模塊,因為安卓的所有進程都會主動加載libc.so。這是一個一舉兩得的方案,首先解決了啟動代碼,其次解決了注入問題。

原理/過程:

so文件的初始化工作 是在init_array段中定義的

.init_array段的起始位置為:0X000683C0

初始化時 會按照順序去執行初始化函數

_ZL14....

_ZL30....

_ZL29....

_ZL31....

那么如果把_ZL14__libc_preinitv的指針重定向到一個物理地址,使之dlopen我們自己的so,就可以實現我們想要的功能。

修改init_array的段的第一個指針 _ZL14__libc_preinitv ---> 0x55D24

指向位置的機器碼

機器碼對應的C語言代碼

1 2 3 4 5 int?_fun() { ??dlopen((const?char?*)"libckis.so",?0); ??return?__libc_preinit(); }

這樣就可以順利的在每個進程中加載libckis.so文件

關于如何修改libc.so文件使之加載自定義庫文件的方法 可以參考我的另外一篇文章

http://bbs.pediy.com/thread-213043.htm

需要注意的是

1 在不同安卓版本中,libc.so是不一樣的。

2 自定義的代碼位置不一定必須在.text段中,在很多情況下.text段沒有足夠的空間讓你去插入代碼,我的解決方案是把這段代碼放在.rodata段,如果放在rodata段,在運算地址偏移時,需要+0x10000

3 libc.so修改后需要妥善的push到手機的/system/lib目錄下,要注意權限問題,否則手機會死機



0x02

現在我們已經進入了安卓的Native層,在這里,我們可以做很多事情,比如HOOK fopen來控制底層文件的訪問 也可以HOOK __system_property_get來修改ro屬性 等等....

文檔可以參考?https://github.com/ele7enxxh/Android-Inline-Hook

附一個簡單的例子

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include?<stdio.h> #include?<stdint.h> #include?<dlfcn.h> #include?"inlineHook.h" void?my_init(void)?__attribute__((constructor)); typedef?int?(*t_system_property_get)(const?char?*name,?char?*value); t_system_property_get?__system_property_get=NULL; int?(*old__system_property_get)(const?char?*name,?char?*value)=NULL; int?new__system_property_get(const?char?*name,?char?*value) { if(strstr(name,"ro.serialno"))?return?strlen(strcpy(value,"AABBCC")); ????else?return?old__system_property_get(name,value); } int?my_init(void) { void*?libc=dlopen("/system/lib/libc.so",0); __system_property_get=(t_system_property_get)dlsym(libc,"__system_property_get"); if(registerInlineHook((uint32_t)__system_property_get,(uint32_t)?new__system_property_get,(uint32_t?**)?&old__system_property_get)!=?ELE7EN_OK)?printf("error?find?__system_property_get?"); else?if?(inlineHook((uint32_t)?__system_property_get)?!=?ELE7EN_OK)?printf("error?hook?__system_property_get?"); return?0; }

那么,我們現在已經可以完整的實現Native/JNI層的HOOK了。

在adb shell下 輸入getprop ro.serialno 會得到返回值 AABBCC 如圖:

并且我們已經完成了了進入JAVA層的先決條件。


0x03

進入JAVA世界

論壇中如何從native層進入java層有很多種方案嗎,在這里 我使用了ADBI的解決方案,在libc.so庫中的epoll_wait函數掛鉤,進而跳轉到APP進程中去,然后使用DexClassLoader加載自己的dex文件,達到JAVA HOOK的目的

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 bool?IsInToJava=false; int?(*oldepoll_wait)(int?epfd,?int?events,?int?maxevents,?int?timeout)=NULL; int?newepoll_wait(int?epfd,?int?events,?int?maxevents,?int?timeout) { if(!IsInToJava) { IsInToJava=true; invoke_dex_method("/data/local/tmp/xxx.dex",path,"com.xxx.xxx.inject","main",AppName); return?oldepoll_wait(epfd,events,maxevents,timeout); } } void?my_init(void) { void*?libc?=?dlopen("/system/lib/libc.so",?0); void?*hookepoll_wait?=?dlsym(libc,?"epoll_wait"); if?(registerInlineHook((uint32_t)hookepoll_wait,?(uint32_t)newepoll_wait,?(uint32_t?**)&oldepoll_wait)?!=?ELE7EN_OK)?printf("error?find?epoll_wait\n"); else?if?(inlineHook((uint32_t)hookepoll_wait)?!=?ELE7EN_OK)?printf("error?hook?epoll_wait?"); }

在APP進程調用epoll_wait函數時 就會加載指定的dex文件,并且執行HOOK的初始化方法。

注意epoll_wait可能會被多次調用,我們只需要執行一次即可。


0x04

JAVA層HOOK

JAVA層的HOOK我使用了Legend的方案,因為已經進入了APP進程內,就和熱補丁的流程是一樣的。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public?class?inject{ ????public?static?final?String?TAG?=?"CKIS_INJECT";???? ????public?static?Context?context;???? ????public?static?void?main(String?packageName) ????{ ????????Log.e(TAG,?"Dex?Inject?in?by:?"+packageName);???????? ????????HookManager.getDefault().applyHooks(inject.class);???????? ????????Log.e(TAG,?"DEX?called?success:"+packageName);???? ????} ????@Hook("android.telephony.TelephonyManager::getDeviceId") ????public?static?String?TelephonyManager_getDeviceId(TelephonyManager?thiz)? ????{ ????????return?"123456789012345";???? ????} }

在這里 我們HOOK了TelephonyManager.getDeviceId方法,實現了系統的IMEI的修改。

在執行IMEI獲取操作時 調用getDeviceID會獲得123456789012345

具體HOOK方案 也可以參考我另外一篇基于XPOSED框架的文章

http://bbs.pediy.com/thread-213042.htm


0x05

環境部署

本框架需要ROOT權限

1 首先讀取/system/lib/libs.so 并在本地解析elf文件格式 添加加載自定義庫的代碼 然后再回寫到/system/lib/libc.so目錄下

2 釋放DEXPOSED的運行庫 libdexposed.so libdexposed_l.so libdexposed_l51.so ?到\system\lib\或\vendor\lib目錄下

3 釋放libckis.so、libjava.so到/system/lib目錄下

4 釋放DEX文件到指定的目錄下 本例為 /data/local/tmp/xxx.dex

5 重啟生效



目前該框架的完成度已經接近90%,支持ART、DALVIK,支持JAVA、JNI/NATIVE?

理論上此方案支持安卓4.0.3以上所有版本 但是Legend的HOOK模塊支持

    • ?Dalvik & Android 4.2
    • ?Dalvik & Android 4.3
    • ?Art & Android 5.0
    • ?Art & Android 5.0.1
    • ?Art & Android 5.1
    • ?Art & Android 6.0
    • ?Art & Android 6.0.1
所以考慮后期JAVA層可能會更換為可以支持7.0的AndFix

目前已測試的版本有

4.0.3

4.4.2

4.4.4

5.0

5.1


歡迎有興趣的朋友一起交流

QQ:586593 遲到 by 2017 05 13


原文地址:http://bbs.pediy.com/thread-217587.htm

總結

以上是生活随笔為你收集整理的全能HOOK框架 JNI NATIVE JAVA ART DALVIK的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美xxxxbbb| 色婷婷九月 | 国产一级免费视频 | 欧美色激情 | 国产无人区码熟妇毛片多 | 日韩精品一区二区在线播放 | 中文字幕人成 | 老外一级黄色片 | 日本在线精品视频 | 看片日韩 | 97视频免费在线观看 | 亚洲一区二区伦理 | www.欧美.com| 伊人久久视频 | 午夜婷婷色 | 国精产品一区二区三区 | 高清国产一区 | 黄色性网站 | 欧美片17c07.com| 国产做a | 樱花电影最新免费观看国语版 | 国模二区| 日本夫妻性生活视频 | 视频在线a | 国产男男一区二区三区 | 久操视频免费观看 | 色综合天天综合网天天看片 | 欧美性受xxxx黑人xyx性 | 91亚洲国产成人精品性色 | 国产碰碰 | 亚洲av熟女国产一区二区性色 | 日本伦理片在线播放 | 亚洲影视在线观看 | 亚洲欧洲成人 | 伊人av影院 | 国产精品一二三级 | 91大神在线观看视频 | 香蕉视频国产在线观看 | 精品无码久久久久久久久果冻 | 痴女扩张宫交脱垂重口小说 | 国产日韩欧美精品在线 | 欧美日韩一二三区 | 亚洲国产成人一区二区 | 国产成人无码专区 | 日韩在线观看免费网站 | 97在线视频免费 | 日韩激情视频在线观看 | 免费国偷自产拍精品视频 | 欧美特级视频 | 国产一区二区三区久久久 | 中国女人内谢69xxxx | 亚洲三级国产 | 少妇被躁爽到高潮无码文 | www.青青草.com | 天天操人人爽 | 涩涩视频网站在线观看 | 99色这里只有精品 | 日本成人三级电影 | 国产福利一区二区视频 | 天天艹天天 | 四虎影视av | 成人在线免费网址 | 在线观看中文字幕 | 国产精品国产三级国产三级人妇 | 超碰av免费 | 日韩大片在线免费观看 | 欧美三级理论片 | 亚欧视频在线观看 | 99久久久无码国产精品免费 | 国产又黄又猛的视频 | 欧美一级在线免费 | 精品在线视频播放 | 一区二区蜜桃 | 国产精品一二区在线观看 | 欧美日韩一区不卡 | 韩国日本美国免费毛片 | 欧美激情一区二区在线 | 亚洲三级伦理 | 老司机成人免费视频 | 贝利弗山的秘密在线观看 | 久久公开视频 | 亚洲男女视频在线观看 | 超碰影院在线 | 欧美日韩久久久久 | 精品国产乱码久久久久久图片 | 免费一级全黄少妇性色生活片 | xxxxx国产| 青青草狠狠操 | 亚洲婷婷一区 | 男女草比视频 | 成年人av网站 | 99久热| 精品美女在线观看 | 亚洲精品xxxx | 男同互操gay射视频在线看 | 欧美亚洲一区二区三区四区 | 午夜影院久久久 | 国产精品国产三级国产aⅴ中文 | 精品一区二区视频在线观看 |