日韩性视频-久久久蜜桃-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的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 免费荫蒂添的好舒服视频 | 久久女同互慰一区二区三区 | 国产欧美一区二区在线 | 国产亚洲欧美日韩高清 | 精品中文视频 | 五月色婷 | 日本真人做爰免费视频120秒 | 少女忠诚电影高清免费 | 午夜精品久久99蜜桃的功能介绍 | 国产精品亚洲欧美 | 狠狠躁日日躁夜夜躁av | 91在线色| 天堂网中文在线 | 蜜桃视频久久一区免费观看入口 | 国内精品小视频 | 91精品小视频 | 激情久久中文字幕 | 逼逼爱插插网站 | 男人操女人的免费视频 | 日韩亚洲欧美一区 | 天堂在线视频网站 | 一本色道久久综合亚洲二区三区 | 清冷学长被爆c躁到高潮失禁 | 91看片看淫黄大片 | 五十路息子 | 国产欧美自拍 | 日本精品在线观看 | 国产尤物av尤物在线看 | 黄色一级大片在线免费看产 | 色涩色| 在线超碰 | 国产又粗又猛又爽又 | www.日韩在线 | 偷拍青青草| 国产视频久久久久 | 日韩国产小视频 | 饥渴少妇伦色诱公 | 成人www. | 精品人妻一区二区免费 | 国产一级视频免费观看 | 91高跟黑色丝袜呻吟在线观看 | 日本久久网 | 国产老妇视频 | 欧美 亚洲 另类 激情 另类 | 午夜在线看片 | 国产三级直播 | 制服丝袜在线一区 | 午夜嘿嘿嘿| 欧洲美熟女乱又伦 | 那个网站可以看毛片 | 日韩精品在线观看一区二区三区 | 伊人激情在线 | 国产在线拍揄自揄拍无码视频 | 日本韩国中文字幕 | 免费播放毛片精品视频 | 国产中文字幕网 | 日日操操| 奶水旺盛的少妇在线播放 | 黑白配高清国语在线观看 | 欧美成人精品一区二区三区在线看 | 午夜在线视频观看 | 日韩精品免费看 | 小嫩女直喷白浆 | 黄av网 | 蜜臀av一区 | 精品福利影院 | www.97色| 日韩欧美久久 | 美女国产在线 | 一卡二卡三卡四卡五卡 | 福利小视频在线观看 | 国内自拍网站 | 国产日韩欧美亚洲 | 动漫美女靠逼 | 粉嫩av网站 | wwwsss在线观看 | 国产98色在线 | 日韩 | 澳门黄色| 樱桃av | 全部免费毛片 | 另类专区成人 | 四虎av网址| 三级免费观看 | 操人视频免费看 | av播播| 一本色道久久综合无码人妻 | 国产成人精品免费视频 | 亚洲伊人色 | 久久综合第一页 | 国产91av在线 | 思思99re | a网址| 五月婷婷啪啪 | 国产 一二三四五六 | 久久午夜电影 | 好吊视频一区二区三区 | 成人精品久久 | aa毛片视频 | 免费午夜人成电影 |