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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android逆向学习---静态分析反调试apk

發(fā)布時(shí)間:2024/3/26 Android 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android逆向学习---静态分析反调试apk 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

分析環(huán)境:JEB2.2.7+IDA7.0??測(cè)試手機(jī):nexus
IDA7.0下載鏈接
鏈接:https://pan.baidu.com/s/1xEtjnTVZFuLiMpHKwMOY2Q?密碼:g3v9


一 用jeb反編譯反調(diào)試挑戰(zhàn).apk
1打開(kāi)Manifest查看android:debuggable="true" 說(shuō)明此程序是可以被動(dòng)態(tài)調(diào)試的。
2找到程序入口MainActivity 分析可知程序運(yùn)行的時(shí)候調(diào)用了myJNI類(lèi)中的Native函數(shù)checkport并彈框 所以checkport是彈框的內(nèi)容 看函數(shù)名可知里面也有可能做了反調(diào)試
3分析代碼可知程序彈框后說(shuō)明checkport函數(shù)已經(jīng)執(zhí)行完了,但是IDA掛起來(lái)后程序還是退出,說(shuō)明還是被反調(diào)試了 猜想有兩種情況:
猜想一: checkport函數(shù)中開(kāi)啟了一個(gè)線(xiàn)程循環(huán)來(lái)做反調(diào)試 就算函數(shù)執(zhí)行完 這個(gè)線(xiàn)程中的反調(diào)試還是運(yùn)行的 (如果不開(kāi)啟線(xiàn)程 循環(huán)檢測(cè)反調(diào)試程序主線(xiàn)程將會(huì)堵塞 )
猜想二: 我們知道init_array和JNI_OnLoad會(huì)在so加載的時(shí)候就開(kāi)始執(zhí)行,所以程序也有可能會(huì)在這里開(kāi)啟線(xiàn)程進(jìn)行反調(diào)試。


?
?
?
4.帶著上面的猜想 我們下面來(lái)分析下so


二 驗(yàn)證猜想一
IDA分析so
解壓反調(diào)試挑戰(zhàn).apk進(jìn)入lib文件夾下找到libsix.so并用ida打開(kāi)??由于我手機(jī)支持v7所以這里我打開(kāi)的是armeabi-v7a下的so
注意:這里一定要打開(kāi)手機(jī)對(duì)應(yīng)的so 如果手機(jī)是arm的就打開(kāi)armeabi文件夾下的so,支持v7則打開(kāi)armeabi-v7a下的so 同理x86的要打開(kāi)x86文件夾下的so進(jìn)行分析??這里很重要 不然會(huì)和動(dòng)態(tài)調(diào)試的內(nèi)存地址不對(duì)應(yīng)
1.我們先來(lái)找到 checkport函數(shù) 看看代碼里面到底有什么 按照以前教程中找Native函數(shù)的方法 我們打開(kāi)函數(shù)導(dǎo)出表發(fā)現(xiàn)并沒(méi)有checkport函數(shù) 在String窗口搜索恭喜你,挑戰(zhàn)成功!也是搜索不到的說(shuō)明此字符串被隱藏了??但是發(fā)現(xiàn)了JNI_OnLoad函數(shù) 說(shuō)明函數(shù)checkport是動(dòng)態(tài)注冊(cè)的。

?

2. 怎么在IDA里面找到動(dòng)態(tài)注冊(cè)的函數(shù)呢?動(dòng)態(tài)注冊(cè)的函數(shù)一般會(huì)在.data.rel.ro.local或data中 Ctrl+s打開(kāi)segment表??找到.data.rel.ro.local??這個(gè)段里面放的是動(dòng)態(tài)注冊(cè)的函數(shù) 點(diǎn)進(jìn)去后就找到Checkport函數(shù)了 函數(shù)的定義在dword_1140中
?
?

3點(diǎn)進(jìn)dword_1140發(fā)現(xiàn)這部分代碼IDA沒(méi)有解析好??這里需要手動(dòng)解析一下 點(diǎn)住dword_1140右鍵Data轉(zhuǎn)化成數(shù)據(jù) 然后鼠標(biāo)放在__unwind按住P鍵就轉(zhuǎn)換成函數(shù)了 這個(gè)函數(shù)就是checkport對(duì)應(yīng)的函數(shù)
?
?
?
?

4.分析checkport函數(shù) F5轉(zhuǎn)換成C偽代碼 導(dǎo)入Jni.h (不會(huì)導(dǎo)入的看前面的課程) 然后手動(dòng)解析代碼 提高代碼可讀性 解析完成后Esc返回到C代碼 再按下F5刷新一下代碼 解析的字符串就出來(lái)了
?
?
?

5 通過(guò)以上操作可以看到 恭喜你,挑戰(zhàn)成功字符串已經(jīng)被我們解析出來(lái)了 接下來(lái)分析這個(gè)函數(shù) 這個(gè)函數(shù)會(huì) 讀取/proc/net/tcp,查找23946端口,也就是IDA動(dòng)態(tài)調(diào)試的端口 如果查找到了說(shuō)明程序正在被動(dòng)態(tài)調(diào)試 然后退出程序 從而達(dá)到了反調(diào)試的目的。
但是這里我們看到這個(gè)函數(shù)的反調(diào)試并沒(méi)有放到線(xiàn)程中做 說(shuō)明只執(zhí)行一次就結(jié)束了??而且測(cè)試一驗(yàn)證的時(shí)候這里的代碼已經(jīng)執(zhí)行完了??所以其他地方一定還有反調(diào)試 并且只能在這個(gè)函數(shù)之前執(zhí)行。
?

三 驗(yàn)證猜想二
init_array介紹
init_array段是在so加載的時(shí)候執(zhí)行的 執(zhí)行順序要優(yōu)先于 JNI_OnLoad??所以這里是最早被執(zhí)行的函數(shù) 把反調(diào)試和so的解密放到這里是比較好的選擇。

1 ctrl+s打開(kāi)segment表找到.init_array段點(diǎn)進(jìn)去 發(fā)現(xiàn)init_array段里面有一個(gè)thread_create函數(shù) 點(diǎn)進(jìn)去F5轉(zhuǎn)換成C偽代碼 并分析函數(shù)
?
?
?
?
?

2.我們打開(kāi)命令行窗口來(lái)驗(yàn)證一下 查看當(dāng)前程序的status文件??ps命令用來(lái)列出系統(tǒng)中當(dāng)前運(yùn)行的那些進(jìn)程
?
?
?

3.通過(guò)上面分析可知thread_create函數(shù)是創(chuàng)建線(xiàn)程循環(huán)讀取當(dāng)前程序的Tracepid的值 如果值大于0說(shuō)明程序當(dāng)前正在被動(dòng)態(tài)調(diào)試并退出程序 那么現(xiàn)在就知道為什么在程序彈出恭喜你,挑戰(zhàn)成功框后我們進(jìn)行動(dòng)態(tài)調(diào)試 程序還是會(huì)退出了 因?yàn)檫@里開(kāi)啟了一個(gè)線(xiàn)程進(jìn)行循環(huán)反調(diào)試。
4.那么到這里程序的反調(diào)試是不是就找完了呢?剛剛我們也說(shuō)了除了init_array還有一個(gè)地方JNI_OnLoad函數(shù)也會(huì)在so剛加載的時(shí)候運(yùn)行 那么出于習(xí)慣 我們還是來(lái)看一下JNI_OnLoad函數(shù)

四 JNI_OnLoad函數(shù)
1.在函數(shù)窗口中搜索并找到JNI_OnLoad函數(shù) F5反編譯成C偽代碼(有點(diǎn)時(shí)候?qū)С霰砝锩媸菦](méi)有JNI_OnLoad函數(shù)的 所以這里在函數(shù)窗口中搜索)?
?
?
?
?
?


2.經(jīng)過(guò)上面分析知道 JNI_OnLoad函數(shù)中調(diào)用SearchObjProcess函數(shù)進(jìn)行反調(diào)試??這個(gè)函數(shù)通過(guò)ps列出當(dāng)前手機(jī)的所有進(jìn)程 然后如果進(jìn)程名中包含android_server,gdbserver,gdb等名稱(chēng) 則認(rèn)為程序當(dāng)前被動(dòng)態(tài)調(diào)試 退出程序

五 小結(jié)
1.首先我們通過(guò)JEB工具靜態(tài)分析了反調(diào)試挑戰(zhàn).apk 發(fā)現(xiàn)在MainActivity類(lèi)中調(diào)用了Native函數(shù)checkprot 因?yàn)檫@個(gè)函數(shù)是動(dòng)態(tài)注冊(cè)的 所以我們?cè)赿ata.rel.ro.local段中找到了這個(gè)函數(shù) 分析知道這個(gè)函數(shù)會(huì)讀取/proc/net/tcp,查找23946端口 如果找到則認(rèn)為程序當(dāng)前被動(dòng)態(tài)調(diào)試 退出程序
2 在init_array段里面發(fā)現(xiàn)了thread_create函數(shù) 這個(gè)函數(shù)創(chuàng)建了一個(gè)線(xiàn)程循環(huán)來(lái)讀取/proc/pid/status文件下的TracePid的值 如果大于0說(shuō)明程序正在被調(diào)試 退出程序
3.JNI_OnLoad函數(shù)中發(fā)現(xiàn)了SearchObjProcess函數(shù)通過(guò)搜索指定進(jìn)程名來(lái)判斷程序有沒(méi)有被調(diào)試

六 解決方案一
1.對(duì)于checkprot我們可以通過(guò)-p將IDA調(diào)試端口改為23947或者其他端口 注意端口轉(zhuǎn)發(fā)和IDA調(diào)試的端口號(hào)都要改成23947
?
?

?

2.對(duì)于thread_create函數(shù)我們可以刷機(jī)改內(nèi)核讓TracePid的值永遠(yuǎn)為0?

3.對(duì)抗SearchObjProcess函數(shù)可以將android_server改成其他名字然后運(yùn)行 比如zs ls ww(張三,李四,王5)


七 解決方案二?
1.也可以通過(guò)exit函數(shù)定位到反調(diào)試位置并patch掉當(dāng)前函數(shù) 這里以thread_create函數(shù)為例子 因?yàn)榇撕瘮?shù)在init_array段里面 所以是沒(méi)有調(diào)用的地方的 這里直接把第二條指令改成pop直接出棧? ?改Hex指令這里我就不為你演示了 前面教程都有教過(guò)。
?
?
?
?
?
?


2.對(duì)于SearchObjProcess函數(shù) 直接找到調(diào)用此函數(shù)的位置 然后nop掉 或者進(jìn)函數(shù)里面把exit給nop掉都行??最后一處反調(diào)試這里也不演示了 方法相同
?

八 另一種patch方法?
以前我們都是用IDA插件modifyfile.plw來(lái)patch 其實(shí)還有一種patch的方法 直接用IDA Patch Program插件來(lái)Patch也是可以的 點(diǎn)菜單Edit->Patch Progra
?
?
?
?

最后將patch后的so替換原包的so 重打包簽名 運(yùn)行 即可過(guò)反調(diào)試。

九總結(jié)
本節(jié)課我?guī)阌肑EB+IDA工具靜態(tài)分析了反調(diào)試APK 通過(guò)本節(jié)課的學(xué)習(xí) 你了解了init_array段和JNI_OnLoad函數(shù)的執(zhí)行順序和這三處反調(diào)試的找尋方法??對(duì)于反調(diào)試 當(dāng)然也可以通過(guò)搜尋特征的方式定位位置 比如TracePid反調(diào)試可以在字符串窗口搜索/proc/%d/status 檢測(cè)進(jìn)程名可以搜索android_server??檢測(cè)端口號(hào)搜索5D8A 然后我又帶你重溫了一遍函數(shù)Patch的方法 以及第二種保存修改so的方法 通過(guò)本節(jié)課我想你對(duì)反調(diào)試技術(shù)已經(jīng)有了初步的了解 教程附件里面前人總結(jié)出來(lái)的反調(diào)試大全 你可以看一看并且學(xué)習(xí)一下。學(xué)習(xí)完之后 下節(jié)課我將會(huì)為你講解怎么動(dòng)態(tài)調(diào)試這個(gè)apk。。。

?

總結(jié)

以上是生活随笔為你收集整理的Android逆向学习---静态分析反调试apk的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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