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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

android免root hook框架legend

發(fā)布時間:2023/12/19 综合教程 57 生活家
生活随笔 收集整理的這篇文章主要介紹了 android免root hook框架legend 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、前言

Android中hook框架已經(jīng)非常多了,最優(yōu)秀的當(dāng)屬Xposed和Substrate了,這兩個框架我在之前的文章都詳細(xì)介紹過了,不了解的同學(xué),可以轉(zhuǎn)戰(zhàn)這里:http://www.wjdiankong.cn;但是這兩個框架用于破解逆向是非常有用的,可惜他們最大的局限性就是需要root權(quán)限,這個幾乎現(xiàn)階段可能阻礙了很多產(chǎn)品的商業(yè)化,畢竟國內(nèi)人的安全意識越來越高了。所以這里就需要借助一個免root的hook框架了。而對于免root的框架最大的好處就在于無需root權(quán)限,但是弊端就是只能hook自身,對于系統(tǒng)其它app無能無力,就有人好奇了,只能hook自己有個卵用,的確是沒什么用,但是也并非一點(diǎn)用都沒有。

二、免root的hook功能用途

關(guān)于Android中的Hook機(jī)制,我在之前已經(jīng)說得非常詳細(xì)了,大致就兩個方式:

第一個方式:root權(quán)限,直接hook系統(tǒng),可以干掉所有app。

第二種方式:免root權(quán)限,但是只能hook自身。

對于免root權(quán)限只能hook自身,并非一點(diǎn)用都沒有,比如我之前介紹到的自動破解簽名校驗(yàn)工具kstools,就是借助這個原理實(shí)現(xiàn),不了解原理的同學(xué)可以看這里:Android中自動破解簽名校驗(yàn)工具kstools,我們在破解逆向app的時候,需要反編譯,二次打包,那么這時候其實(shí)我們想針對于這個app做點(diǎn)手腳,就可以借助這個技術(shù),比如現(xiàn)在想改一個app,使得他獲取系統(tǒng)的imei值是隨機(jī)的,有這種需求的,有的游戲有的功能會用設(shè)備的imei值做唯一處理,隨機(jī)imei值的話就可以跳過這個功能了。那么這時候我們可以反編譯這游戲,在游戲入口處加上hook代碼,即hook游戲自身的imei值即可,這就是需求,只需要hook這一款游戲即可。這樣無需在用xposed來編寫外掛了。游戲二次打包即可使用了。

三、以往hook框架原理分析

那么其實(shí)免root進(jìn)行hook功能在之前我已經(jīng)介紹過了一款阿里的開源框架Dexposed了,不過這個框架已經(jīng)廢棄了,取而代之的是AndFix,原理很簡單在native層把Java層的方法強(qiáng)制改成native類型,然后在將方法的native標(biāo)志指向自定義的native函數(shù)即可。這樣原來的方法就會走到自定義的native函數(shù)中,這個框架是非常優(yōu)秀的AOP框架,可惜兼容性問題不能繼續(xù)維護(hù)了。取而代之的是AndFix,關(guān)于它的原理就更簡單了,他沒有了AOP功能,直接將原始方法和自定義的新方法信息進(jìn)行對換,這樣原來方法執(zhí)行的邏輯就是新的方法了。這個框架主要用于熱修復(fù),所以沒必要需要AOP功能了。而今天介紹的這款框架原理也是類似,只不過覺得比較好的是,他把大部分的功能都放到了Java層,這樣的兼容性就非常好了,而且自身的兼容也很優(yōu)秀。

四、Legend框架原理分析

下面就來介紹一下他的原理,代碼量不是很多,框架下載地址可以去github上:https://github.com/asLody/legend,下載下來直接運(yùn)行就ok了,我們繼續(xù)來分析它的代碼吧:

進(jìn)入這個方法查看:

到這里我們會發(fā)現(xiàn),他是編譯傳入進(jìn)來的class類,然后編譯他所有用到了Hook注解的方法,獲取其需要hook的方法信息,具體樣式為:類名::方法名@參數(shù)1#參數(shù)2#...

然后解析完了注解獲取方法簽名信息之后,開始調(diào)用hookMethod進(jìn)行hook操作:

這里看到,每個hook方法必須是static類型的,然后會區(qū)分是art還是dalvik的,分別處理,這里直接分析dalvik方法,后面的代碼是有一個緩存池,用于緩存每次替換完之后的原始方法信息,為了后面會調(diào)用原始方法功能。下面繼續(xù)來看dalvik方法的hook代碼:

這里首先會獲取原始方法和hook新方法對應(yīng)的dalivk的數(shù)據(jù)結(jié)構(gòu)信息,這個就是框架的核心點(diǎn)了,關(guān)于dalivk對應(yīng)的方法結(jié)構(gòu)體信息大致如下:

accessFlags:各個不同標(biāo)志位表示此方法的多個屬性,其中標(biāo)志位0x00000100表明此方法是native的
registersSize:該方法總共用到的寄存器個數(shù),包含輸入?yún)?shù)所用到的寄存器,還有方法內(nèi)部另外使用到的寄存器,在調(diào)用方法時會為其申請棧內(nèi)存
outsSize:該方法調(diào)用其他方法時使用到的寄存器個數(shù),注意:只有此方法為非native方法時,此值才有效.
insSize:該方法輸入?yún)?shù)用到的寄存器個數(shù)(registersSize包含此值)
insns:若方法類型為1,這里指向?qū)嶋H的字節(jié)碼首地址;若方法類型為2,這里指向?qū)嶋H的JNI函數(shù)首地址;若方法類型為3,這里為null
jniArgInfo:當(dāng)方法類型為2時有效,記錄了一些預(yù)先計(jì)算好的信息(具體信息格式與實(shí)際CPU架構(gòu)有關(guān),但總是包含返回值類型),從而不需要在調(diào)用的時候再通過方法的參數(shù)和返回值實(shí)時計(jì)算了,提高了JNI調(diào)用的速度。如果第一位為1(即0x80000000),則Dalvik虛擬機(jī)會忽略后面的所有信息,強(qiáng)制在調(diào)用時實(shí)時計(jì)算
nativeFunc:若方法類型為1,此值無效;若方法類型為2,這里指向dvmCallJNIMethod;若方法類型為3,這里指向?qū)嶋H的處理函數(shù)(DalvikBridgeFunc類型)

還記得最后一個參數(shù)嗎?當(dāng)初介紹Dexposed框架就是利用這個參數(shù)進(jìn)行操作的,他對應(yīng)的就是一個方法的native函數(shù),對于AndFix框架,其實(shí)也就是直接替換方法的這些結(jié)構(gòu)體信息即可。

替換新舊方法的結(jié)構(gòu)體信息,做到移花積木的功能:

然后就把替換之后額數(shù)據(jù)寫入到內(nèi)存中,而這里我們要注意的是,操作內(nèi)存,Java實(shí)在不靠譜的,所以這里需要將工作移動到native層做,操作內(nèi)存數(shù)據(jù),指針是萬能的,所以就跑到C++中干了:

這里看到,其實(shí)不是寫入內(nèi)存,而是對內(nèi)存數(shù)據(jù)的一個替換,直接利用指針方便快捷。

五、案例用法

那么到這里,其實(shí)我們就大致分析完了這個框架的功能,關(guān)于art類型的可以自行分析代碼,原理都是一樣的,這里的hook機(jī)制非常簡潔,直接構(gòu)造出新舊方法對應(yīng)的虛擬機(jī)數(shù)據(jù)結(jié)構(gòu),然后替換信息,會寫到內(nèi)存中即可。和阿里的AndFix框架原理幾乎一樣。分析完了原理之后,接下來才是正事,演示一個案例,這里主要介紹兩個案例,首先來看看如何hook系統(tǒng)的imei值:

這里需要用到注解,形式如:類名::方法名,因?yàn)檫@里沒有參數(shù)信息,所以忽略,然后在定義一個新的hook方法,每個hook方法第一個參數(shù)必須是hook方法所屬的類類型,這里直接返回imei值為110,然后在獲取imei值看看效果:

看到了,hook成功了,操作就是這么簡單。

下面再來看一個例子,就是hook應(yīng)用中所有的webview加載的url值,這個也是這次我要分析這個框架的原因,因?yàn)轫?xiàng)目需要,想攔截應(yīng)用所有webview加載的url值:

這里看到了,我們一般用WebView加載url都會走shouldOverrideUrlLoading方法,所以直接hook這個方法即可,看到這里的注解類型也好理解:類名::方法名@參數(shù)1#參數(shù)2...,這里還有一個重要的知識就是調(diào)用callSuper方法可以調(diào)用原來的方法,這樣我們只做了一層攔截,不要破壞原始方法的執(zhí)行流程,而這里可以調(diào)用原始方法其實(shí)就是利用之前提到的原始方法緩存池功能即可實(shí)現(xiàn),這里可以看出有AOP的意思了。運(yùn)行看一下效果:

這里會把每個頁面加載請求的url進(jìn)行攔截了,這就是我項(xiàng)目想要的功能。

因?yàn)樯厦娣治隽丝蚣艿脑恚蟛糠止δ芏际窃贘ava層做的,這樣很大程度上能夠做到兼容,因?yàn)檫@樣,我也想嘗試?yán)眠@個框架來操作項(xiàng)目,畢竟也算是一種嘗試。

注意:
1、框架可以選擇不使用注解的方式進(jìn)行hook,直接使用api方式,具體用法參見github上說明。
2、hook的時機(jī)最好要早,一般在程序的入口處即可。

總結(jié)

以上是生活随笔為你收集整理的android免root hook框架legend的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。