国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

app反爬測試之a(chǎn)pk逆向分析-frida

這篇具有很好參考價(jià)值的文章主要介紹了app反爬測試之a(chǎn)pk逆向分析-frida。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言:

目前為止,很多app的防護(hù)基本也還是用的ssl pinning檢測證書。

因?yàn)?,目前的app要么不用ssl,要么用就是一般的ssl,基本就是在手機(jī)上裝個(gè)相關(guān)軟件 的代理即可,而且這個(gè)代理基本就是fiddler,charlels,burpsuite,mitmproxy(Python環(huán)境下的)四個(gè)抓包軟件自帶的ssl證書,然后即可抓到ssl(https)的請求

以上這些,基本可以解決大部分的app(其實(shí)很多使用ssl的網(wǎng)站也是這樣處理)

但是因?yàn)楹芏郺pp為了防止數(shù)據(jù)被分析爬取,會做ssl pinning驗(yàn)證

ssl painning

SSL Pinning是一種防止中間人攻擊(MITM)的技術(shù),主要機(jī)制是在客戶端發(fā)起請求–>收到服務(wù)器發(fā)來的證書進(jìn)行校驗(yàn),如果收到的證書不被客戶端信任,就直接斷開連接不繼續(xù)求情。

所以在遇到對關(guān)鍵請求開啟SSL Pinning的APP時(shí),我們抓包就只能看到APP上提示無法連接網(wǎng)絡(luò)或者請求失敗之類的提示;而在抓包工具上面,要么就只能看到一排 CONNECT 請求,獲取到證書卻沒有后續(xù)了,要么就是一些無關(guān)的請求,找不到想要的接口

比如如下圖:

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

針對這種,如果是web網(wǎng)站,我們都知道,在本地裝下抓包軟件自帶的ssl證書就行了,但是app的話,如此操作之后還是不行,而且app還會提示沒網(wǎng)(比如:網(wǎng)絡(luò)連接失敗,網(wǎng)絡(luò)有問題等等的),反正意思就是沒網(wǎng)的意思,這種就是因?yàn)閍pp自身做了ssl pinning驗(yàn)證處理,驗(yàn)證下當(dāng)前的ssl證書是否是合法允許的,如果不是就會驗(yàn)證失敗

其實(shí)使用ssl pinning目前已經(jīng)成為了趨勢,那么我們的目前對象剛好就有這個(gè)怎么辦呢?

目前根據(jù)我的經(jīng)驗(yàn),最有效的有三個(gè)方法:

  • 1.使用低版本的安卓機(jī)抓包
  • 2.使用ios端手機(jī)抓包
  • 3.使用frida繞過證書處理

使用低版本的安卓機(jī)抓包

因?yàn)閍pp的話,目前主流的都是用的前后端分離開發(fā),所以越到后期,app更新新版后,越會有不同版本的后端接口存在,而且新版接口和老版接口其實(shí)返回的數(shù)據(jù)差異性很小,并且有個(gè)關(guān)鍵點(diǎn)就是,為了兼容性,會依舊留下舊版接口,因?yàn)槊總€(gè)用戶使用的手機(jī)不一樣,安卓或者ios版本不同,系統(tǒng)版本也就會不同,且老款手機(jī)因?yàn)閮?nèi)存太小,不會更新新版的app包,種種情況下來,結(jié)果就是會留下舊版接口,而且這個(gè)舊版接口安全性比新版低很多,所以可以用低版本的餓安卓機(jī)來抓包,就正常的抓包流程即可,不出意外的話,可能還用的普通的http請求。

為什么高版本的安卓就抓不到包呢,因?yàn)楦甙姹镜模ò沧?以上)開始,安卓自帶了一些安全機(jī)制,本質(zhì)上就是只信任系統(tǒng)證書,不再信任用戶自己安裝的證書了,我們裝的ssl代理證書就是自己裝的,所以就會驗(yàn)證不通過了

使用ios端手機(jī)抓包

這個(gè)情況真的很多,因?yàn)?,蘋果端的appstore管理得很嚴(yán),不能加些自己獨(dú)特的東西,但是加ssl是可以的,但是很多app并沒有加我就不知道了,這個(gè)情況就很簡單,需要一臺iphone,其他都是正常抓包操作,然后安裝證書,把證書信任下就行了,詳細(xì)的操作就不說了,網(wǎng)上很多教程

使用frida繞過證書處理

這個(gè)方法就是本篇文章的重點(diǎn)了,這個(gè)放到后面再說

其他方法

其實(shí)也有其他的方法,這些方法并不是通用的,可能運(yùn)氣好可以用,運(yùn)氣不好就沒用:

安卓模擬器

用安卓模擬器,模擬低版本安卓然后抓包

對證書信任,修改APP設(shè)置

看這個(gè)app是否是自有app,如果是自有的,谷歌有debug模式,該模式下讓app默認(rèn)可以信任用戶域的證書(trust-anchors),如果是非自有,用xposed+JustTrustMe即可,但是使用Xposed框架需要root,網(wǎng)上那些微信魔改小功能,什么自動搶紅包,防消息撤回之類的就是用的xposed框架改的,用JustTrustMe來信任用戶安裝的證書

目前市面上有VitualXposed、太極等虛擬的框架,不用root也可以操作,太極這個(gè)軟件挺好的,有太極-陰(免root)和太極-陽(需要root),兩個(gè)版本都可以用,但是針對有些app的話,太極-陰沒戲,只能太極-陽,但是既然我都已經(jīng)root了,我就沒必要整這些了。

如果是 App 的開發(fā)者或者把 apk 逆向出來了,那么可以直接通過修改 AndroidManifest.xml 文件,在 apk 里面添加證書的信任規(guī)則即可,詳情可以參考?破解https的SSL Pinning · app抓包利器:Charles,這種思路屬于第一種信任證書的解決方案。

強(qiáng)制信任證書

其實(shí)就是將證書設(shè)置為系統(tǒng)證書,只需要將抓包軟件的證書設(shè)置為系統(tǒng)區(qū)域即可。但這個(gè)前提是手機(jī)必須要 ROOT,而且需要計(jì)算證書 Hash Code 并對證書進(jìn)行重命名,具體可以參考?https://crifan.github.io/app_capture_package_tool_charles/website/how_capture_app/complex_https/https_ssl_pinning,?把ssl代理證書強(qiáng)制的放到安卓機(jī)的/system/etc/security/cacerts/目錄下,這個(gè)目錄就是安卓機(jī)系統(tǒng)信任的目錄。

具體步驟:

1.charles導(dǎo)出.pem證書,選擇.prm類型 保存在pc上

2.修改證書名稱


系統(tǒng)證書目錄:/system/etc/security/cacerts/

其中的每個(gè)證書的命名規(guī)則如下:
<Certificate_Hash>.
文件名是一個(gè)Hash值,而后綴是一個(gè)數(shù)字。

文件名可以用下面的命令計(jì)算出來:
openssl x509 -subject_hash_old -in <Certificate_File>

后綴名的數(shù)字是為了防止文件名沖突的,比如如果兩個(gè)證書算出的Hash值是一樣的話,那么一個(gè)證書的后綴名數(shù)字可以設(shè)置成0,而另一個(gè)證書的后綴名數(shù)字可以設(shè)置成1

3. 用adb命令把證書推到手機(jī)上


adb push xxxxxxx.0 /sdcard/

4.復(fù)制到系統(tǒng)目錄并修改權(quán)限(安卓8.1.0 Magisk Root)

mount -o rw,remount /system 【不修改 沒法寫入】
mount -o rw,remount /

mv /sdcard/xxxxxxx.0 /etc/security/cacerts/ 移動文件到系統(tǒng)
chown root:root /etc/security/cacerts/fc365f9d.0 修改用戶組
chmod 644 /system/etc/security/cacerts/xxxxxxx.0 修改權(quán)限

5. 重啟手機(jī)驗(yàn)證即可

這時(shí)你就發(fā)現(xiàn)證書已經(jīng)在系統(tǒng)級別里了

6.進(jìn)行抓包

2021-11-09補(bǔ)充:

安卓10版本有更高的保護(hù)機(jī)制,即使root了也沒法把證書導(dǎo)入到系統(tǒng)證書目錄里,解決方法:?https://blog.csdn.net/fjh1997/article/details/106756012?

httpcannary

這個(gè)是安卓端的抓包工具,網(wǎng)上吹得很火,根據(jù)我(我手機(jī)是安卓10)親自操作,發(fā)現(xiàn)其實(shí)沒有用,也不知道是不是我的姿勢錯(cuò)誤,或者我手機(jī)安卓系統(tǒng)版本太高了失效

VirtualApp

用這個(gè)可以免root操作,然后正常抓包,但是這個(gè)方法我沒有實(shí)際操作過,網(wǎng)上的資料不多,自行查找

Xposed + JustTrustMe

Xposed 是一款 Android 端的 Hook 工具,利用它我們可以 Hook App 里面的關(guān)鍵方法的執(zhí)行邏輯,繞過 HTTPS 的證書校驗(yàn)過程。JustTrustMe 是基于 Xposed 一個(gè)插件,它可以將 HTTPS 證書校驗(yàn)的部分進(jìn)行 Hook,改寫其中的證書校驗(yàn)邏輯,這種思路是屬于第二種繞過 HTTPS 證書校驗(yàn)的解決方案。

當(dāng)然基于 Xposed 的類似插件也有很多,如 SSLKiller、sslunpining 等等,可以自行搜索。?

不過 Xposed 的安裝必須要 ROOT,如果不想 ROOT 的話,可以使用后文介紹的 VirtualXposed。

具體可以參考?Frida CodeShare。

VirtualXposed

Xposed 的使用需要 ROOT,如果不想 ROOT 的話,可以直接使用一款基于 VirtualApp 開發(fā)的 VirtualXposed 工具,它提供了一個(gè)虛擬環(huán)境,內(nèi)置了 Xposed。我們只需要將想要的軟件安裝到 VirtualXposed 里面就能使用 Xposed 的功能了,然后配合 JustTrustMe 插件也能解決 SSL Pining 的問題,這種思路是屬于第二種繞過 HTTPS 證書校驗(yàn)的解決方案。

特殊改寫

??

其實(shí)本質(zhì)上是對一些關(guān)鍵的校驗(yàn)方法進(jìn)行了 Hook 和改寫,去除了一些校驗(yàn)邏輯。但是對于一些代碼混淆后的 App 來說,其校驗(yàn) HTTPS 證書的方法名直接變了,那么 JustTrustMe 這樣的插件就無法 Hook 這些方法,因此也就無效了。

強(qiáng)制全局代理

手機(jī)root后,使用proxy Droid 實(shí)現(xiàn)強(qiáng)制全局代理,讓ssl代理證書生效,proxy Droid可以在UpToDown,ApkHere等的地方下載

VPN抓包

免root,在安卓機(jī)上安裝packet capture,然后抓包,我試了下,我的手機(jī)(我手機(jī)是安卓10)沒用

魔改JustTrustMe

在JustTrustMe插件上增加一個(gè)可以運(yùn)行時(shí)根據(jù)實(shí)際情況調(diào)整ssl檢測的功能,對hook增加動態(tài)適配,這個(gè)方法我沒試過,我在看雪論壇里找到一個(gè) JustTrustMePlus,點(diǎn)我下載

反編譯app包

用apktools修改配置文件里的ssl證書檢測部分,可利用jadx等工具分析源碼,然后重新打包,再抓包分析,這個(gè)方法是可行的,詳細(xì)的步驟自行百度吧,后續(xù)有時(shí)間的話,我單獨(dú)發(fā)一篇對app的脫殼重新打包

AndServer處理

這個(gè)工具的原理就是把一個(gè)安卓機(jī)在本地作為一臺服務(wù)器,然后找到數(shù)據(jù)接口,這個(gè)方法沒有親測過,更多的適用于獲取app的sign/token時(shí)去獲取接口

??

以上的方法就是我所知道的方法,各位朋友自行操作

接下來進(jìn)入正題,frida hook

什么是frida

官網(wǎng):Frida ? A world-class dynamic instrumentation toolkit | Observe and reprogram running programs on Windows, macOS, GNU/Linux, iOS, watchOS, tvOS, Android, FreeBSD, and QNX

Frida是個(gè)輕量級別的hook框架,?是Python API,用JavaScript調(diào)試來邏輯

Frida的核心是用C編寫的,并將Google的V8引擎注入到目標(biāo)進(jìn)程中,在這些進(jìn)程中,JS可以完全訪問內(nèi)存,掛鉤函數(shù)甚至調(diào)用進(jìn)程內(nèi)的本機(jī)函數(shù)來執(zhí)行。

使用Python和JS可以使用無風(fēng)險(xiǎn)的API進(jìn)行快速開發(fā)。Frida可以幫助您輕松捕獲JS中的錯(cuò)誤并為您提供異常而不是崩潰。

frida是平臺原生app的Greasemonkey,說的專業(yè)一點(diǎn),就是一種動態(tài)插樁工具,可以插入一些代碼到原生app的內(nèi)存空間去,(動態(tài)地監(jiān)視和修改其行為),這些原生平臺可以是Win、Mac、Linux、Android或者iOS。而且frida還是開源的。

Greasemonkey可能大家不明白,它其實(shí)就是firefox的一套插件體系,使用它編寫的腳本可以直接改變firefox對網(wǎng)頁的編排方式,實(shí)現(xiàn)想要的任何功能。而且這套插件還是外掛的,非常靈活機(jī)動。

frida框架主要分為兩部分:
1)一部分是運(yùn)行在系統(tǒng)上的交互工具frida CLI。
2)另一部分是運(yùn)行在目標(biāo)機(jī)器上的代碼注入工具 frida-server

注:以下相關(guān)操作,終端里凡是 C:\Users\Administrator 開頭的都是在pc機(jī)上操作的,需要在安卓機(jī)目錄里操作的我都有說明,不要搞混了

環(huán)境準(zhǔn)備

安裝frida

沒有python的安裝python,然后安裝frida:

1

2

3

pip? install frida

pip install frida-tools

安裝過程很慢,這個(gè)只能耐心等待,然后如果你是macbook的話,如果你遇到安裝出錯(cuò),可以看看我這篇文章的解決方法?macos 安裝frida的坑

然后frida是mac,linux,windows都可以安裝使用的,這個(gè)根據(jù)你自己的條件選擇了

安裝adb

這個(gè)就很簡單,去?安卓開發(fā)網(wǎng)? 然后下載這個(gè)工具:

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

??

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

?如果你下載太慢可以在我這里下載:點(diǎn)我

下載完畢后,解壓,然后放到你想放的路徑,然后配置下環(huán)境變量即可,此電腦(我的電腦)- 屬性-高級系統(tǒng)設(shè)置-環(huán)境變量-系統(tǒng)變量的path,新增即可

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

然后,打開終端:

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

?敲adb,回車,如果有以下提示,說明你adb安裝成功

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

以上配置是windows平臺,如果是其他平臺的話,自行查找,這里就不展示了

找一個(gè)安卓機(jī)(已root)

根據(jù)現(xiàn)在的行情,要找到一個(gè)已root的手機(jī),問題不大也不小,但是很多時(shí)候沒有必要,所以我這里就選擇用安卓模擬器來輔助操作了

安裝夜神模擬器,夜神默認(rèn)是安卓5,你可以自行選擇安卓版本,在夜神里設(shè)置已root即可

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

打開開發(fā)者選項(xiàng)里的USB調(diào)試

設(shè)置里面,關(guān)于本機(jī),然后狂點(diǎn)系統(tǒng)版本號,開啟開發(fā)者模式:

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

返回,會多一個(gè)開發(fā)者選項(xiàng):

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

打開調(diào)試

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

adb連接安卓機(jī)(模擬器)

在安裝了frida和adb的真機(jī)操作系統(tǒng)下,打開終端,用 adb connect IP 連接安卓機(jī):

夜神的ip是127.0.0.1:62001,這里注意,如果你創(chuàng)建了多個(gè)安卓系統(tǒng)的話,那么你待連接的安卓機(jī)不一定是62001,可能是其他的,可以在安裝目錄里面找

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

進(jìn)入后,找nox.vbox文件

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

?用文本編輯器打開,搜索5555就能看到是哪個(gè)端口了,為什么必須是5555端口呢,因?yàn)?555就是模擬器掛載在我們windows真機(jī)上的端口

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

用 adb connect 127.0.0.1:端口? ?連接

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

我這里已經(jīng)連接上了,所以提示已連接

連接之后可以用 adb devices查看已連接的機(jī)器:

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

安裝frida-server

frida-server這個(gè)需要安裝在安卓機(jī)上,但是安卓機(jī)我們都知道有很多個(gè)版本,對應(yīng)架構(gòu)才行,要查看當(dāng)前安卓機(jī)的架構(gòu):

1

adb shell getprop ro.product.cpu.abi

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

然后去這里下載對應(yīng)架構(gòu)的frida-server :??點(diǎn)我

我這里是x86,安卓,所以選下面我選中那個(gè)下載,你的安卓機(jī)是什么你就選哪個(gè)就行了

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

然后下載很慢,我這里也提供了,點(diǎn)我下載??

但是,一定注意,pip安裝的frida版本一定要跟去frida官網(wǎng)下載的frida-server版本對應(yīng)上,不然連不上

解壓,然后用adb 傳到安卓機(jī)上

1

adb push (本機(jī)的frida-sever文件所在目錄) (安卓機(jī)目錄)

  

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

這里提示太長了,看不出來,可以用adb shell 去那個(gè)目錄下看下是否有frida-server即可:

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

修改frida-server的權(quán)限:

1

chmod 700 frida-server

  

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

下載一個(gè)frida hook 的js文件

這個(gè)文件,有好幾個(gè)版本,我選用了兩個(gè)版本,放到下面,你們自己選擇吧

版本1:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

setTimeout(function(){

????Java.perform(function?(){

????????console.log("");

????????console.log("[.] Cert Pinning Bypass/Re-Pinning");

????????var?CertificateFactory = Java.use("java.security.cert.CertificateFactory");

????????var?FileInputStream = Java.use("java.io.FileInputStream");

????????var?BufferedInputStream = Java.use("java.io.BufferedInputStream");

????????var?X509Certificate = Java.use("java.security.cert.X509Certificate");

????????var?KeyStore = Java.use("java.security.KeyStore");

????????var?TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory");

????????var?SSLContext = Java.use("javax.net.ssl.SSLContext");

????????// Load CAs from an InputStream

????????console.log("[+] Loading our CA...")

????????cf = CertificateFactory.getInstance("X.509");

?????????

????????try?{

????????????var?fileInputStream = FileInputStream.$new("/data/local/tmp/cert-der.crt");

????????}

????????catch(err) {

????????????console.log("[o] "?+ err);

????????}

????????var?bufferedInputStream = BufferedInputStream.$new(fileInputStream);

????????var?ca = cf.generateCertificate(bufferedInputStream);

????????bufferedInputStream.close();

????????var?certInfo = Java.cast(ca, X509Certificate);

????????console.log("[o] Our CA Info: "?+ certInfo.getSubjectDN());

????????// Create a KeyStore containing our trusted CAs

????????console.log("[+] Creating a KeyStore for our CA...");

????????var?keyStoreType = KeyStore.getDefaultType();

????????var?keyStore = KeyStore.getInstance(keyStoreType);

????????keyStore.load(null,?null);

????????keyStore.setCertificateEntry("ca", ca);

?????????

????????// Create a TrustManager that trusts the CAs in our KeyStore

????????console.log("[+] Creating a TrustManager that trusts the CA in our KeyStore...");

????????var?tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();

????????var?tmf = TrustManagerFactory.getInstance(tmfAlgorithm);

????????tmf.init(keyStore);

????????console.log("[+] Our TrustManager is ready...");

????????console.log("[+] Hijacking SSLContext methods now...")

????????console.log("[-] Waiting for the app to invoke SSLContext.init()...")

????????SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;",?"[Ljavax.net.ssl.TrustManager;",?"java.security.SecureRandom").implementation =?function(a,b,c) {

????????????console.log("[o] App invoked javax.net.ssl.SSLContext.init...");

????????????SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;",?"[Ljavax.net.ssl.TrustManager;",?"java.security.SecureRandom").call(this, a, tmf.getTrustManagers(), c);

????????????console.log("[+] SSLContext initialized with our custom TrustManager!");

????????}

????});

},0);

  

版本2:

1

2

3

4

5

6

7

8

9

10

Java.perform(function() {

????var?array_list = Java.use("java.util.ArrayList");

????var?ApiClient = Java.use('com.android.org.conscrypt.TrustManagerImpl');

????ApiClient.checkTrustedRecursive.implementation =?function(a1, a2, a3, a4, a5, a6) {

????????// console.log('Bypassing SSL Pinning');

????????var?k = array_list.$new();

????????return?k;

????????}

}, 0);

  

然后你自己復(fù)制以上的任何一個(gè)版本的代碼,然后在本地新建一個(gè)js文件,粘貼進(jìn)去就行了

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議
安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

或者這個(gè):

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

這里補(bǔ)充一個(gè)完全版:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

Java.perform(function() {

/*

hook list:

1.SSLcontext

2.okhttp

3.webview

4.XUtils

5.httpclientandroidlib

6.JSSE

7.network\_security\_config (android 7.0+)

8.Apache Http client (support partly)

9.OpenSSLSocketImpl

10.TrustKit

11.Cronet

*/

????// Attempts to bypass SSL pinning implementations in a number of

????// ways. These include implementing a new TrustManager that will

????// accept any SSL certificate, overriding OkHTTP v3 check()

????// method etc.

????var?X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');

????var?HostnameVerifier = Java.use('javax.net.ssl.HostnameVerifier');

????var?SSLContext = Java.use('javax.net.ssl.SSLContext');

????var?quiet_output =?false;

????// Helper method to honor the quiet flag.

????function?quiet_send(data) {

????????if?(quiet_output) {

????????????return;

????????}

????????send(data)

????}

????// Implement a new TrustManager

????// ref: https://gist.github.com/oleavr/3ca67a173ff7d207c6b8c3b0ca65a9d8

????// Java.registerClass() is only supported on ART for now(201803). 所以android 4.4以下不兼容,4.4要切換成ART使用.

????/*

06-07 16:15:38.541 27021-27073/mi.sslpinningdemo W/System.err: java.lang.IllegalArgumentException: Required method checkServerTrusted(X509Certificate[], String, String, String) missing

06-07 16:15:38.542 27021-27073/mi.sslpinningdemo W/System.err:???? at android.net.http.X509TrustManagerExtensions.<init>(X509TrustManagerExtensions.java:73)

????????at mi.ssl.MiPinningTrustManger.<init>(MiPinningTrustManger.java:61)

06-07 16:15:38.543 27021-27073/mi.sslpinningdemo W/System.err:???? at mi.sslpinningdemo.OkHttpUtil.getSecPinningClient(OkHttpUtil.java:112)

????????at mi.sslpinningdemo.OkHttpUtil.get(OkHttpUtil.java:62)

????????at mi.sslpinningdemo.MainActivity$1$1.run(MainActivity.java:36)

*/

????var?X509Certificate = Java.use("java.security.cert.X509Certificate");

????var?TrustManager;

????try?{

????????TrustManager = Java.registerClass({

????????????name:?'org.wooyun.TrustManager',

????????????implements: [X509TrustManager],

????????????methods: {

????????????????checkClientTrusted:?function(chain, authType) {},

????????????????checkServerTrusted:?function(chain, authType) {},

????????????????getAcceptedIssuers:?function() {

????????????????????// var certs = [X509Certificate.$new()];

????????????????????// return certs;

????????????????????return?[];

????????????????}

????????????}

????????});

????}?catch?(e) {

????????quiet_send("registerClass from X509TrustManager >>>>>>>> "?+ e.message);

????}

????// Prepare the TrustManagers array to pass to SSLContext.init()

????var?TrustManagers = [TrustManager.$new()];

????try?{

????????// Prepare a Empty SSLFactory

????????var?TLS_SSLContext = SSLContext.getInstance("TLS");

????????TLS_SSLContext.init(null, TrustManagers,?null);

????????var?EmptySSLFactory = TLS_SSLContext.getSocketFactory();

????}?catch?(e) {

????????quiet_send(e.message);

????}

????send('Custom, Empty TrustManager ready');

????// Get a handle on the init() on the SSLContext class

????var?SSLContext_init = SSLContext.init.overload(

????????'[Ljavax.net.ssl.KeyManager;',?'[Ljavax.net.ssl.TrustManager;',?'java.security.SecureRandom');

????// Override the init method, specifying our new TrustManager

????SSLContext_init.implementation =?function(keyManager, trustManager, secureRandom) {

????????quiet_send('Overriding SSLContext.init() with the custom TrustManager');

????????SSLContext_init.call(this,?null, TrustManagers,?null);

????};

????/*** okhttp3.x unpinning ***/

????// Wrap the logic in a try/catch as not all applications will have

????// okhttp as part of the app.

????try?{

????????var?CertificatePinner = Java.use('okhttp3.CertificatePinner');

????????quiet_send('OkHTTP 3.x Found');

????????CertificatePinner.check.overload('java.lang.String',?'java.util.List').implementation =?function() {

????????????quiet_send('OkHTTP 3.x check() called. Not throwing an exception.');

????????}

????}?catch?(err) {

????????// If we dont have a ClassNotFoundException exception, raise the

????????// problem encountered.

????????if?(err.message.indexOf('ClassNotFoundException') === 0) {

????????????throw?new?Error(err);

????????}

????}

????// Appcelerator Titanium PinningTrustManager

????// Wrap the logic in a try/catch as not all applications will have

????// appcelerator as part of the app.

????try?{

????????var?PinningTrustManager = Java.use('appcelerator.https.PinningTrustManager');

????????send('Appcelerator Titanium Found');

????????PinningTrustManager.checkServerTrusted.implementation =?function() {

????????????quiet_send('Appcelerator checkServerTrusted() called. Not throwing an exception.');

????????}

????}?catch?(err) {

????????// If we dont have a ClassNotFoundException exception, raise the

????????// problem encountered.

????????if?(err.message.indexOf('ClassNotFoundException') === 0) {

????????????throw?new?Error(err);

????????}

????}

????/*** okhttp unpinning ***/

????try?{

????????var?OkHttpClient = Java.use("com.squareup.okhttp.OkHttpClient");

????????OkHttpClient.setCertificatePinner.implementation =?function(certificatePinner) {

????????????// do nothing

????????????quiet_send("OkHttpClient.setCertificatePinner Called!");

????????????return?this;

????????};

????????// Invalidate the certificate pinnet checks (if "setCertificatePinner" was called before the previous invalidation)

????????var?CertificatePinner = Java.use("com.squareup.okhttp.CertificatePinner");

????????CertificatePinner.check.overload('java.lang.String',?'[Ljava.security.cert.Certificate;').implementation =?function(p0, p1) {

????????????// do nothing

????????????quiet_send("okhttp Called! [Certificate]");

????????????return;

????????};

????????CertificatePinner.check.overload('java.lang.String',?'java.util.List').implementation =?function(p0, p1) {

????????????// do nothing

????????????quiet_send("okhttp Called! [List]");

????????????return;

????????};

????}?catch?(e) {

????????quiet_send("com.squareup.okhttp not found");

????}

????/*** WebView Hooks ***/

????/* frameworks/base/core/java/android/webkit/WebViewClient.java */

????/* public void onReceivedSslError(Webview, SslErrorHandler, SslError) */

????var?WebViewClient = Java.use("android.webkit.WebViewClient");

????WebViewClient.onReceivedSslError.implementation =?function(webView, sslErrorHandler, sslError) {

????????quiet_send("WebViewClient onReceivedSslError invoke");

????????//執(zhí)行proceed方法

????????sslErrorHandler.proceed();

????????return;

????};

????WebViewClient.onReceivedError.overload('android.webkit.WebView',?'int',?'java.lang.String',?'java.lang.String').implementation =?function(a, b, c, d) {

????????quiet_send("WebViewClient onReceivedError invoked");

????????return;

????};

????WebViewClient.onReceivedError.overload('android.webkit.WebView',?'android.webkit.WebResourceRequest',?'android.webkit.WebResourceError').implementation =?function() {

????????quiet_send("WebViewClient onReceivedError invoked");

????????return;

????};

????/*** JSSE Hooks ***/

????/* libcore/luni/src/main/java/javax/net/ssl/TrustManagerFactory.java */

????/* public final TrustManager[] getTrustManager() */

????/* TrustManagerFactory.getTrustManagers maybe cause X509TrustManagerExtensions error? */

????// var TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory");

????// TrustManagerFactory.getTrustManagers.implementation = function(){

????//???? quiet_send("TrustManagerFactory getTrustManagers invoked");

????//???? return TrustManagers;

????// }

????var?HttpsURLConnection = Java.use("javax.net.ssl.HttpsURLConnection");

????/* libcore/luni/src/main/java/javax/net/ssl/HttpsURLConnection.java */

????/* public void setDefaultHostnameVerifier(HostnameVerifier) */

????HttpsURLConnection.setDefaultHostnameVerifier.implementation =?function(hostnameVerifier) {

????????quiet_send("HttpsURLConnection.setDefaultHostnameVerifier invoked");

????????return?null;

????};

????/* libcore/luni/src/main/java/javax/net/ssl/HttpsURLConnection.java */

????/* public void setSSLSocketFactory(SSLSocketFactory) */

????HttpsURLConnection.setSSLSocketFactory.implementation =?function(SSLSocketFactory) {

????????quiet_send("HttpsURLConnection.setSSLSocketFactory invoked");

????????return?null;

????};

????/* libcore/luni/src/main/java/javax/net/ssl/HttpsURLConnection.java */

????/* public void setHostnameVerifier(HostnameVerifier) */

????HttpsURLConnection.setHostnameVerifier.implementation =?function(hostnameVerifier) {

????????quiet_send("HttpsURLConnection.setHostnameVerifier invoked");

????????return?null;

????};

????/*** Xutils3.x hooks ***/

????//Implement a new HostnameVerifier

????var?TrustHostnameVerifier;

????try?{

????????TrustHostnameVerifier = Java.registerClass({

????????????name:?'org.wooyun.TrustHostnameVerifier',

????????????implements: [HostnameVerifier],

????????????method: {

????????????????verify:?function(hostname, session) {

????????????????????return?true;

????????????????}

????????????}

????????});

????}?catch?(e) {

????????//java.lang.ClassNotFoundException: Didn't find class "org.wooyun.TrustHostnameVerifier"

????????quiet_send("registerClass from hostnameVerifier >>>>>>>> "?+ e.message);

????}

????try?{

????????var?RequestParams = Java.use('org.xutils.http.RequestParams');

????????RequestParams.setSslSocketFactory.implementation = function(sslSocketFactory) {

????????????sslSocketFactory = EmptySSLFactory;

????????????return null;

????????}

????????RequestParams.setHostnameVerifier.implementation = function(hostnameVerifier) {

????????????hostnameVerifier = TrustHostnameVerifier.$new();

????????????return null;

????????}

????} catch (e) {

????????quiet_send("Xutils hooks not Found");

????}

????/*** httpclientandroidlib Hooks ***/

????try {

????????var AbstractVerifier = Java.use("ch.boye.httpclientandroidlib.conn.ssl.AbstractVerifier");

????????AbstractVerifier.verify.overload('java.lang.String', '[Ljava.lang.String', '[Ljava.lang.String', 'boolean').implementation = function() {

????????????quiet_send("httpclientandroidlib Hooks");

????????????return null;

????????}

????} catch (e) {

????????quiet_send("httpclientandroidlib Hooks not found");

????}

????/***

android 7.0+ network_security_config TrustManagerImpl hook

apache httpclient partly

***/

????var TrustManagerImpl = Java.use("com.android.org.conscrypt.TrustManagerImpl");

????// try {

????//???? var Arrays = Java.use("java.util.Arrays");

????//???? //apache http client pinning maybe baypass

????//???? //https://github.com/google/conscrypt/blob/c88f9f55a523f128f0e4dace76a34724bfa1e88c/platform/src/main/java/org/conscrypt/TrustManagerImpl.java#471

????//???? TrustManagerImpl.checkTrusted.implementation = function (chain, authType, session, parameters, authType) {

????//???????? quiet_send("TrustManagerImpl checkTrusted called");

????//???????? //Generics currently result in java.lang.Object

????//???????? return Arrays.asList(chain);

????//???? }

????//

????// } catch (e) {

????//???? quiet_send("TrustManagerImpl checkTrusted nout found");

????// }

????try {

????????// Android 7+ TrustManagerImpl

????????TrustManagerImpl.verifyChain.implementation = function(untrustedChain, trustAnchorChain, host, clientAuth, ocspData, tlsSctData) {

????????????quiet_send("TrustManagerImpl verifyChain called");

????????????// Skip all the logic and just return the chain again :P

????????????//https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/bypassing-androids-network-security-configuration/

????????????// https://github.com/google/conscrypt/blob/c88f9f55a523f128f0e4dace76a34724bfa1e88c/platform/src/main/java/org/conscrypt/TrustManagerImpl.java#L650

????????????return untrustedChain;

????????}

????} catch (e) {

????????quiet_send("TrustManagerImpl verifyChain nout found below 7.0");

????}

????// OpenSSLSocketImpl

????try {

????????var OpenSSLSocketImpl = Java.use('com.android.org.conscrypt.OpenSSLSocketImpl');

????????OpenSSLSocketImpl.verifyCertificateChain.implementation = function(certRefs, authMethod) {

????????????quiet_send('OpenSSLSocketImpl.verifyCertificateChain');

????????}

????????quiet_send('OpenSSLSocketImpl pinning')

????} catch (err) {

????????quiet_send('OpenSSLSocketImpl pinner not found');

????}

????// Trustkit

????try {

????????var Activity = Java.use("com.datatheorem.android.trustkit.pinning.OkHostnameVerifier");

????????Activity.verify.overload('java.lang.String', 'javax.net.ssl.SSLSession').implementation = function(str) {

????????????quiet_send('Trustkit.verify1:?' + str);

????????????return true;

????????};

????????Activity.verify.overload('java.lang.String', 'java.security.cert.X509Certificate').implementation = function(str) {

????????????quiet_send('Trustkit.verify2:?' + str);

????????????return true;

????????};

????????quiet_send('Trustkit pinning')

????} catch (err) {

????????quiet_send('Trustkit pinner not found')

????}

????try {

????????//cronet pinner hook

????????//weibo don't invoke

????????var?netBuilder = Java.use("org.chromium.net.CronetEngine$Builder");

????????//https://developer.android.com/guide/topics/connectivity/cronet/reference/org/chromium/net/CronetEngine.Builder.html#enablePublicKeyPinningBypassForLocalTrustAnchors(boolean)

????????netBuilder.enablePublicKeyPinningBypassForLocalTrustAnchors.implementation =?function(arg) {

????????????//weibo not invoke

????????????console.log("Enables or disables public key pinning bypass for local trust anchors = "?+ arg);

????????????//true to enable the bypass, false to disable.

????????????var?ret = netBuilder.enablePublicKeyPinningBypassForLocalTrustAnchors.call(this,?true);

????????????return?ret;

????????};

????????netBuilder.addPublicKeyPins.implementation =?function(hostName, pinsSha256, includeSubdomains, expirationDate) {

????????????console.log("cronet addPublicKeyPins hostName = "?+ hostName);

????????????//var ret = netBuilder.addPublicKeyPins.call(this,hostName, pinsSha256,includeSubdomains, expirationDate);

????????????//this 是調(diào)用 addPublicKeyPins 前的對象嗎? Yes,CronetEngine.Builder

????????????return?this;

????????};

????}?catch?(err) {

????????console.log('[-] Cronet pinner not found')

????}

});

上面這個(gè)完全版本包含了如下功能,如果你想一步到位的話,就可以用這個(gè)完全版

  • SSLcontext(ART only)
  • okhttp
  • webview
  • XUtils(ART only)
  • httpclientandroidlib
  • JSSE
  • network_security_config (android 7.0+)
  • Apache Http client (support partly)
  • OpenSSLSocketImpl
  • TrustKit
  • Cronet?

任意一個(gè)都可以,不要三個(gè)都用,都用也沒用,根據(jù)實(shí)際情況選用

安卓機(jī)配置代理

配置代理到開啟了抓包工具的IP上:

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

長按wiredssid

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議
安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

?補(bǔ)充一句,當(dāng)配置完代理后,pc端電腦上一定要打開對應(yīng)的抓包軟件,不然安卓機(jī)會沒網(wǎng)

安卓機(jī)上安裝ssl證書

根據(jù)你選用的抓包工具,fiddler,charles,burpsuite,安裝證書即可,你可以訪問局域網(wǎng)下帶的ip來下載,然后安裝:

配置了代理再執(zhí)行此步驟,不然打不開下載證書的局域網(wǎng)址

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

也可以用adb 像傳frida-server一樣,用adb push把證書push到安卓機(jī)上,然后在安卓機(jī)的設(shè)置-安全里本地導(dǎo)入證書:

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

?用adb push 之后,還是把代理配置上,不然后面操作也無法繼續(xù),不管怎么操作,反正必須要ssl證書安裝上即可

開始hook

hook的本質(zhì)意思就是鉤子,在開發(fā)里面通俗的說就是可以在任意流程里插一手,然后做些手腳,比如打開一個(gè)app,在啟動到完全打開app,顯示app的首頁,這個(gè)過程就可以hook一下,比如把本來要打開首頁的,改成打開第二頁數(shù)據(jù),當(dāng)然這只是舉個(gè)例子

啟動frida-server:

1

/data/local/tmp/frida-server

補(bǔ)充下,有的高級點(diǎn)的app會檢測本地是否啟動了frida-server的程序,以及監(jiān)聽是否開啟了27042端口,所以,如果有反調(diào)試的話,建議將frida-server改個(gè)自定義的名字,比如fsx86之類的,反正就是別讓app檢測到,然后啟動:

1

/data/local/tmp/fsx86?-l?0.0.0.0:6666??(6666就是自定義端口)

  

這里要用絕對路徑來啟動,我也不知道為啥,啟動,如下,warning是個(gè)警告,無所謂,說明啟動成功了,只要沒報(bào)錯(cuò)就行了

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

映射端口

在pc端電腦,裝adb的機(jī)器上使用如下命令映射端口

1

2

adb forward tcp:27042?tcp:27042

adb forward tcp:27043?tcp:27043

  

找到需要hook的app包名

這個(gè)包名不是app的名字,是安裝之后存在目錄里的文件夾名,一般是com.xxxx.xxx之類的,但是有少部分奇葩的報(bào)名并不是com開頭

查看當(dāng)前所有的包名:

1

frida-ps -U

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

?注意要安卓機(jī)里先啟動了firda-server,然后adb連上了安卓機(jī),才可以調(diào)用frida命令,?如果不啟動的話,運(yùn)行frida這樣,F(xiàn)ailed,失敗的意思

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

以上查看app包,顯示出來太多了,你根本不知道哪個(gè)才是我們需要的包名,可以使用下面的命令查看

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

adb shell pm list packages:打印設(shè)備上的所有軟件包

adb shell pm list packages -f:輸出包和包相關(guān)聯(lián)的文件

adb shell pm list packages -d:只輸出禁用的包由于本機(jī)禁用沒有,輸出為空

adb shell pm list packages -e:只輸出啟用的包

adb shell pm list packages -s:只輸出系統(tǒng)的包

adb shell pm list packages -3:只輸出第三方的包

adb shell pm list packages -i:只輸出包和安裝信息(安裝來源)

adb shell pm list packages -u:只輸出包和未安裝包信息(安裝來源)

adb shell pm list packages --user <USER_ID>:根據(jù)用戶id查詢用戶的空間的所有包,USER_ID代表當(dāng)前連接設(shè)備的順序,從零開始

  

如果還找不到,可以先在安卓機(jī)上啟動了目標(biāo)app后,再用命令查看:

1

adb shell?"dumpsys window | grep mCurrentFocus"

  

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

hook操作

1

frida -U -f (app包名) -l? (js目錄)? --no-pause

  

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議
安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

注意了,這段js是放在安裝了frida和adb的電腦上,不是放在安卓機(jī)上

運(yùn)行完這條命令,安卓機(jī)會自動打開目標(biāo)app,

app打開界面我就不展示了

如果打開的就是我們預(yù)期的那個(gè)app,那就是對的,如果打開錯(cuò)了,請重新獲取app包名,打開之后就可以用抓包工具進(jìn)行抓包了,ssl的一樣的可以抓:

安卓app逆向分析,ssl,https,網(wǎng)絡(luò)協(xié)議

上面看到的https的還是會隧道,但是緊接著就有數(shù)據(jù)出現(xiàn),說明還是抓到了數(shù)據(jù)包了

ok,繞過ssl? pinning成功!??!

其實(shí)如果你覺得需要做些改動的話,可以寫個(gè)python腳本來調(diào)用,js代碼就作為文件內(nèi)容讀取就行了,然后進(jìn)行hook操作?

最后得出的結(jié)論就是,我朋友他們的產(chǎn)品,其實(shí)反爬做得挺好,上面的截圖也可以看到,其實(shí)還是有些數(shù)據(jù)拿不到的

補(bǔ)充:

如果你用的模擬器在安裝了app之后打不開,說明app有檢測是否是模擬器或者對安卓版本做了檢測,版本太低直接不給使用,那么你就只能用真機(jī)操作了,adb連接真機(jī)操作區(qū)別不大,詳細(xì)的自行百度

檢測模擬器的辦法:

  • 1.檢測模擬器上特有的文件
  • 2.檢測qemu pipes驅(qū)動程序
  • 3.檢測手機(jī)號是否是155552155開頭的
  • 4.檢測設(shè)備ID是否是15個(gè)0
  • 5.檢測IMSI ID是否是31026+10個(gè)0
  • 6.檢測運(yùn)營商是否是“Android”
  • 7.代碼里用getInstance()方法調(diào)用任意一個(gè)方法,返回true就是模擬器
  • 8.檢測IMEI或者入網(wǎng)許可證

以上都是我以前搜集的數(shù)據(jù),但是,根據(jù)現(xiàn)在的時(shí)代發(fā)展,可能模擬器也早就更新迭代了,把一些特征給抹除或者改的跟真機(jī)一樣了,所以有些方法并不是有用了,這個(gè)就只有自行選擇了

免root使用frida

其實(shí)不root也可以使用frida,這里我就不展開了,給一個(gè)大神寫的鏈接,里面還有其他方法的hook,感興趣自己看吧,點(diǎn)我

針對很安全性很強(qiáng)的app——逆向

JEB?

JEB 是一款適用于 Android 應(yīng)用程序和本機(jī)機(jī)器代碼的反匯編器和反編譯器軟件。利用它我們可以直接將安卓的 apk 反編譯得到 Smali 代碼、jar 文件,獲取到 Java 代碼。有了 Java 代碼,我們就能分析其中的加密邏輯了。

JEB:JEB Decompiler by PNF Software

JADX

與 JEB 類似,JADX 也是一款安卓反編譯軟件,可以將 apk 反編譯得到 jar 文件,得到 Java 代碼,從而進(jìn)一步分析邏輯。
JADX:GitHub - skylot/jadx: Dex to Java decompiler

??

dex2jar、jd-gui

??

這兩者通常會配合使用來進(jìn)行反編譯,同樣也可以實(shí)現(xiàn) apk 文件的反編譯,但其用起來個(gè)人感覺不如 JEB、JADX 方便。

脫殼

一些 apk 可能進(jìn)行了加固處理,所以在反編譯之前需要進(jìn)行脫殼處理。一般來說可以先借助于一些查殼工具查殼,如果有殼的話可以借助于 Dumpdex、FRIDA-DEXDump 等工具進(jìn)行脫殼。

FRIDA-DEXDump:GitHub - hluwa/frida-dexdump: A frida tool to dump dex in memory to support security engineers analyzing malware.
Dumpdex:GitHub - WrBug/dumpDex: ??一款A(yù)ndroid脫殼工具,需要xposed支持, 易開發(fā)已集成該項(xiàng)目。

反匯編

一些 apk 里面的加密可能直接寫入 so 格式的動態(tài)鏈接庫里面,要想破解其中的邏輯,就需要用到反匯編的一些知識了,這里可以借助于 IDA 這個(gè)軟件來進(jìn)行分析。
IDA:Hex Rays – State-of-the-art binary code analysis solutions

以上的一些逆向操作需要較深的功底和安全知識,在很多情況下,如果逆向成功了,一些加密算法還是能夠被找出來的,找出來了加密邏輯之后,我們用程序模擬就方便了。

模擬

逆向?qū)τ诙鄶?shù)有保護(hù) App 是有一定作用的,但有的時(shí)候 App 還增加了風(fēng)控檢測,一旦 App 檢測到運(yùn)行環(huán)境或訪問頻率等信息出現(xiàn)異常,那么 App 或服務(wù)器就可能產(chǎn)生防護(hù),直接停止執(zhí)行或者服務(wù)器返回假數(shù)據(jù)等都是有可能的。

對于這種情形,有時(shí)候我們就需要回歸本源,真實(shí)模擬一些 App 的手工操作了。

adb

最常規(guī)的 adb 命令可以實(shí)現(xiàn)一些手機(jī)自動化操作,但功能有限。

觸動精靈、按鍵精靈

有很多商家提供了手機(jī) App 的一些自動化腳本和驅(qū)動,如觸動精靈、按鍵精靈等,利用它們的一些服務(wù)我們可以自動化地完成一些 App 的操作。

觸動精靈:觸動精靈官網(wǎng) - 更好用的手機(jī)自動化輔助工具

Appium

類似 Selenium,Appium 是手機(jī)上的一款移動端的自動化測試工具,也能做到可見即可爬的操作。

?Appium:Redirecting

AirTest

同樣是一款移動端的自動化測試工具,是網(wǎng)易公司開發(fā)的,相比 Appium 來說使用更方便。

AirTest:http://airtest.netease.com/

Appium/AirTest + mitmdump

mitmdump 其實(shí)是一款抓包軟件,與 mitmproxy 是一套工具。這款軟件配合自動化的一些操作就可以用 Python 實(shí)現(xiàn)實(shí)時(shí)抓包處理了。

mitmdump:https://mitmproxy.readthedocs.io/文章來源地址http://www.zghlxwxcb.cn/news/detail-606502.html

到了這里,關(guān)于app反爬測試之a(chǎn)pk逆向分析-frida的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android Spider App逆向 Frida - 夜神模擬器安裝配置 基本使用

    Android Spider App逆向 Frida - 夜神模擬器安裝配置 基本使用

    Frida 是一款基于 Python + JavaScript 的 Hook 與調(diào)試框架,實(shí)現(xiàn)app逆向的強(qiáng)大工具; 模擬器下載安裝教程:https://blog.csdn.net/EXIxiaozhou/article/details/127767808 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 Frida是一款易用的跨平 Hook 工具, Java 層到 Native 層的 Hook 無所不能,是一種

    2024年01月24日
    瀏覽(30)
  • [安卓逆向]apktool實(shí)現(xiàn)APK反編譯、重打包、簽名

    [安卓逆向]apktool實(shí)現(xiàn)APK反編譯、重打包、簽名

    apktool 主要用于逆向apk文件。它可以將資源解碼,并在修改后可以重新構(gòu)建它們。 APKtool官網(wǎng): https://ibotpeaches.github.io/Apktool/ APKtool下載: https://bitbucket.org/iBotPeaches/apktool/downloads/ APKtool源碼: https://github.com/iBotPeaches/Apktool 將 apktool_2.6.1.jar 放到一個(gè)文件夾下(如:D:apktool),然

    2024年02月03日
    瀏覽(32)
  • 安卓逆向?qū)W習(xí)及APK抓包(二)--Google Pixel一代手機(jī)的ROOT刷入面具

    安卓逆向?qū)W習(xí)及APK抓包(二)--Google Pixel一代手機(jī)的ROOT刷入面具

    在手機(jī)選擇上,優(yōu)先選擇谷歌系列手機(jī),Nexus和Pixel系列,剛好手頭有Pixel一代,就直接root了,大家感興趣可以某寶幾百塊錢入手一臺。Pixel手機(jī)花了本人一天,中間踩坑無數(shù),終于還是root成功,感觸頗深,所以先記錄一下Pixel手機(jī)的root之旅。 安卓逆向?qū)W習(xí)及APK抓包(一)【Ka

    2024年02月11日
    瀏覽(35)
  • uni-app離線打包安卓apk

    uni-app離線打包安卓apk

    記錄一下打包apk的過程: 參考:uni-app離線打包官網(wǎng)地址 2-1.遇見問題 1. 加載.idea和.gradle失敗, 解決: File → Project Structure 重新構(gòu)建: File → Sync Project with Gradle Files 安卓結(jié)構(gòu): Project → Android 登錄開發(fā)者中心選擇需要打包的應(yīng)用→各平臺信息→查看或新增安卓打包信息 這里

    2024年04月17日
    瀏覽(26)
  • Web逆向、軟件逆向、安卓逆向、APP逆向,關(guān)于網(wǎng)絡(luò)安全這些你必須懂

    Web逆向、軟件逆向、安卓逆向、APP逆向,關(guān)于網(wǎng)絡(luò)安全這些你必須懂

    逆向工程是網(wǎng)絡(luò)安全行業(yè)里面一項(xiàng)很重要的技術(shù)。 逆向是一個(gè)相對正向而言的解釋,相對正向來說,對一個(gè)程序來講,正向就是開發(fā)的過程,從0到1。 就是在一個(gè)軟件誕生的整個(gè)生命周期中的一個(gè)過程, 也就是按照需求通過編碼把需求實(shí)現(xiàn),產(chǎn)生一個(gè)程序,當(dāng)然這個(gè)程序可

    2024年02月07日
    瀏覽(32)
  • 【0-1】從0.1開始學(xué)Android逆向-APK基本結(jié)構(gòu)概要分析

    【0-1】從0.1開始學(xué)Android逆向-APK基本結(jié)構(gòu)概要分析

    最近在進(jìn)行Android的逆向,在這里整理知識點(diǎn)和分享Android逆向知識。如果文章中有任何勘誤,誠摯的邀請師傅們批評改正! 逆向工程(Reverse Engineering)是一種分析和解剖已有產(chǎn)品、系統(tǒng)或軟件的過程,以了解其內(nèi)部工作原理、設(shè)計(jì)、功能或源代碼。逆向工程可以應(yīng)用于多個(gè)領(lǐng)

    2024年02月08日
    瀏覽(18)
  • cocos creator 3.x打包構(gòu)建原生安卓APK流程(打包release版本,修改APP圖標(biāo))

    cocos creator 3.x打包構(gòu)建原生安卓APK流程(打包release版本,修改APP圖標(biāo))

    本文介紹cocos creator 3.x如何打包構(gòu)建原生安卓APK,一開始是按照官網(wǎng)構(gòu)建示例操作的,發(fā)現(xiàn)存在各種SDK版本問題,因?yàn)閷υ鶤ndroid沒什么研究只能瞎琢磨,最后勉強(qiáng)算是打包出來了…寫個(gè)文章記錄下流程,免得后續(xù)又忘記…如果有不對的地方,歡迎在評論區(qū)指正,有疑問也可

    2024年02月10日
    瀏覽(32)
  • 【Android安全】安裝mitmproxy Https抓包證書 | 安卓SSL抓包

    【Android安全】安裝mitmproxy Https抓包證書 | 安卓SSL抓包

    macbook上 mitmproxy 抓取安卓手機(jī)https流量 重點(diǎn)是安裝mitmproxy Https抓包證書 手機(jī)需要root,macbook上需要安裝好mitmproxy 需要完成下文1-3: https://github.com/doug-leith/cydia (接入有線網(wǎng)并開啟無線熱點(diǎn)) 啟用 IP 轉(zhuǎn)發(fā): sudo sysctl -w net.inet.ip.forwarding=1 保存文件: https://github.com/doug-leith/cy

    2024年01月22日
    瀏覽(17)
  • APP攻防--安卓逆向&JEB動態(tài)調(diào)試&LSPosed模塊&算法提取&Hook技術(shù)

    APP攻防--安卓逆向&JEB動態(tài)調(diào)試&LSPosed模塊&算法提取&Hook技術(shù)

    安裝java環(huán)境變量(最好jdk11) 安裝adb環(huán)境變量 設(shè)置adb環(huán)境變量最好以Android命名 啟動開發(fā)者模式 設(shè)置--關(guān)于平板電腦--版本號(單機(jī)五次) 開啟USB調(diào)試 設(shè)置--系統(tǒng)--高級--開發(fā)者選項(xiàng)--USB調(diào)試 開啟USB調(diào)試目的是為了后續(xù)讓JEB能夠獲取模擬器上的進(jìn)程 安裝激活JEB 軟件安裝包和破解參

    2024年02月05日
    瀏覽(57)
  • 如何給蘋果ipa和安卓apk應(yīng)用APP包體修改手機(jī)屏幕上logo圖標(biāo)iocn?

    如何給蘋果ipa和安卓apk應(yīng)用APP包體修改手機(jī)屏幕上logo圖標(biāo)iocn?

    雖然修改應(yīng)用文件圖標(biāo)是一個(gè)簡單的事情,但是還是有很多小可愛是不明白的,你要是想要明白的話,那我就讓你今天明白明白,我們今天采用的非常規(guī)打包方式,常規(guī)打包方式科技一下教程鋪天蓋地,既然小弟我出馬,肯定要讓這個(gè)馬出去的快一點(diǎn), 我們得先了解一下安裝

    2024年02月07日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包