當前位置:ag真人国际官网-ag旗舰厅官方网站 » 編程軟體 » 安卓動態庫反編譯

安卓動態庫反編譯-ag真人国际官网

發布時間: 2024-11-16 15:23:04

① android怎麼動態調試dex

1.1 安裝jdk
java環境的搭建請自行查找資料,這里不做詳述。
1.2 安裝android sdk
下載地址:http://developer.android.com/sdk/index.html。
下載完安裝包後解壓到任意一目錄,然後點擊運行sdk manager.exe,然後選擇你需要的版本進行安裝,如圖:

1.3 安裝eclipse集成開發環境
下載地址:http://www.eclipse.org/downloads。選擇eclipse for mobile developers,解壓到任意目錄即可。
1.4 創建android virtual device
動態調試可以用真實的手機來做調試環境,也可以用虛擬機來做調試環境,本文採用虛擬機環境。因此創建虛擬機步驟如下:
1打開eclipse –>windows->android virtual device

2點擊create,然後選擇各個參數如圖:

這里target 就是前面步驟中安裝的sdk 選擇任意你覺得喜歡的版本就可以。點擊ok 就創建完畢。
1.5 安裝 apk改之理
這個是一個很好用的輔助調試的軟體,請自行搜索下載。
1.6 安裝 ida6.6
ida6.6開始支持安卓app指令的調試,現該版本已經提供免費下載安裝,請自行搜搜。
0x02 dalvik指令動態調試
2.1 准備工作
安卓app應用程序後綴為apk,實際上是一個壓縮包,我們把它改後綴為rar打開如圖:

其中classes.dex是應用的主要執行程序,包含著所有dalvik指令。我們用apk改之理打開apk,軟體會自動對其進行反編譯。反編譯後會有很多smail文件,這些文件保存的就是app的dalvik指令。
在apk改之理里雙擊打開androidmanifest.xml,為了讓app可調試,需要在application 標簽里添加一句android:debuggable="true" 如圖:

然後點擊保存按鈕,然後編譯生成新的apk文件。接著打開eclipse –>windows->android virtual device,選擇剛才創建的虛擬機,然後點擊start,虛擬機便開始運行。偶爾如果eclipse啟動失敗,報錯,可以同目錄下修改配置文件:

把配置參數原本為512的改為256 原本為1024的改為512,然後再嘗試啟動。
在sdk安裝目錄有個命令行下的調試工具adb shell,本機所在目錄為e:\adt-bundle-windows-x86-20140702\sdk\platform-tools,把adb.exe注冊到系統環境變數中,打開dos命令行窗口執行adb shell 就可以進入app命令行調試環境,或者切換到adb所在目錄來執行adb shell。

這里先不進入adb shell,在dos命令行下執行命令:adb install d:\1.apk 來安裝我們剛才重新編譯好的apk文件。安裝完畢會有成功提示。
2.2 利用ida動態調試
將app包里的classes.dex解壓到任意一目錄,然後拖進ida。等待ida載入分析完畢,點擊debugger->debugger options如圖

按圖所示勾選在進程入口掛起,然後點擊set specific options 填入app包名稱和入口activity 如圖:

其中包的名稱和入口activity 都可以通過apk改之理里的androidmanifest.xml 文件獲取:

1
2
3






然後在ida點擊debugger->process options

其他默認不變,埠這里改為8700。這里默認埠是23946,我在這里困擾了很久,就是因為這個埠沒有改為8700所致。然後我們看看這個8700埠是怎麼來的。在android sdk里提供了一款工具ddms,用來監視app的運行狀態和結果。在sdk的tools目錄有個ddms.bat的腳步,運行後就會啟動ddms。由於我的本機安裝了sdk的adt插件,ddms集成到了eclips中,打開eclips->open perspective->ddms就啟動了ddms。
如圖所示:

在ddms選中某個進程後面就會注釋出它的調試埠,本機這里是8700。
到此所有的工作就准備就緒,然後就可以下斷點來調試該app了。我們在apk改之理中在com目錄下查看smali文件 發現mainactivity.smali里有一個感興趣的函數getpwdfrompic(),那麼我們就對它下斷以跟蹤app的運行。
在ida里搜索字元串getpwdfrompic,發現onclick有調用該函數
我們在onclick 函數開始位置按f2下斷如圖:

然後點擊上圖中綠色三角形按鈕啟動調試如圖:

調試過程中有一個問題出現了很多次,浪費了我大量的時間,就在寫文章的時候,操作時還是遇到了這樣的問題。就是點擊啟動後ida提示can』t bind socket,琢磨了很久終於找到原因了,當打開過一次ddms後 每次啟動eclips都會啟動ddms 而8700埠正是被這個ddms給佔用了,然後每次都會啟動失敗,解決辦法就是 虛擬機運行起來後關閉掉eclips,這時一切就正常了!
事例中是一個app crackme 提示輸入密碼才能進入正確界面。這個時候我們輸入123,點擊登陸,ida中斷在了我們設置斷點的地方,這時選中ida->debugger->use source level debugger,然後點擊ida->debugger->debugger windows->locals打開本地變數窗口,如圖:

然後按f7或f8單步跟蹤程序流程,同時可以觀察到變數值的變化,也可以在ida右鍵選擇圖形視圖,可以看到整個app執行的流程圖:

如上圖所示 變數窗口中我們輸入了123 被轉化成的密碼是么廣亡,pw變數也顯示出了正確的密碼,其實這個時候已經很容易判斷出正確密碼了。
0x03 andoid原生動態鏈接庫動態調試
通常為了加密保護等措施,有時dex執行過程中會調用動態鏈接庫文件,該文件以so為後綴,存在於app文件包里。

這里我們以動態附加的方式來調試原生庫。
3.1 准備工作
1、將ida->dbgsrv目錄下的android_server拷貝到虛擬機里,並賦予可執行許可權
dos命令分別為:
adb shell pull d:\ android_server /data/data/sv
adb shell chmod 755 /data/data/sv

2、啟動調試伺服器android_server
命令:adb shell /data/data/sv
伺服器默認監聽23946埠。
3、重新打開dos窗口進行埠轉發,命令:
adb forward tcp:23946 tcp:23946 如圖:

3.2 利用ida進行動態調試
1、虛擬機里啟動要調試的app 2、啟動ida,打開debugger->attach->remote armlinux/andoid debugger

埠改為23946 其他保持不變,點擊ok

如上圖,選中要調試的app 的數據包名,然後點擊ok。
正常情況下,ida會把app進程掛起。
3、由於當前程序不是在動態鏈接庫領空,這時我們要重新打開一個ida,用它打開需要調試的so文件,找到需要下斷的位置的文件偏移,並做記錄,然後關閉後面打開的這個ida。
4、在原ida界面按下ctrl s鍵,找到並找到需要調試的so,同時記錄該文件的載入基址。然後點擊ok 或者cancel按鈕關閉對話框。
5、按下快捷鍵g 輸入基址 文件偏移所得地址,點擊ok 就跳轉到so文件需要下斷的地方,這時按下f2鍵設置斷點。當app執行到此處時便可以斷下來。
3.3 在反調試函數運行前進行動態調試
程序載入so的時候,會執行jni_onload函數,做一系列的准備工作。通常反調試函數也會放到jni_onload函數里。進行4.2中第2步時也許會遇到如下情況:

這時app檢測到了調試器,會自動退出,那麼這時調試策略需要有所改變。
接著4.1第3步後,在dos命令行執行命令:
adb shell am start -d -n com.yaotong.crackme/com.yaotong.crackme.mainactivity

來以調試模式啟動app 如圖:
com.yaotong.crackme是app包名稱,com.yaotong.crackme.mainactivity是執行入口 這些可以用apk改之理查看。

這時由於app還未運行,那麼反調試函數也起不了作用,按照4.2中第2步把app掛起。這時ida會中斷在某個位置

然後點擊debugger->debugger opions設置如下:

點擊ok 後按f9運行app,然後再dos命令下執行命令:
jdb -connect com.sun.jdi.socketattach:hostname=127.0.0.1,port=8700

這時app會斷下來,然後按照4.2中的3、4、5補找到jni_onload函數的地址並下斷,然後按f9 會中斷下來。然後便可以繼續動態跟蹤調試分析。

② apk反編譯之後沒有dll文件

apk程序包反編譯後當然沒有dll文件,它又不是微軟系統上的軟體,兩者根本毫無關系。

安卓系統的動態庫文件後綴名是so

③ 有動態庫 dll 和.h 怎麼能反編譯 .c或.cpp嗎

不能,只能反成匯編,自己分析

④ 安卓app360加固怎麼反編譯

1 對比

上傳demo進行加固,解包後對比下原包和加固包,發現加固包在assets文件夾下多了libjiagu.so,libjiagu_x86,lib文件夾下多了libjiagu_art.so,同時修改了dex文件和androidmanifest文件

打開manifest文件,看到xxx加固對application標簽做了修改,添加了殼入口,也就是我們反編譯後看到的stubapplication.smali這個文件。

相比於之前版本的加固,自從1.x.x.x加固版本之後,多了幾次反調試,使得動態難度稍微增大了一些,不過針對脫殼機脫殼,再多了反調試也是無用。或者通過修改系統源碼,也能達到消除反調試的作用。


2 動態調試

(1)把app安裝到手機,以調試模式打開app

(2)以shell模式root許可權打開ida的android_server監聽

(3)tcp轉發

(4)打開ida,修改配置為在進程開始時下斷

(5)搜索到進程後jdwp轉發,pid值即為我們進程號,並在命令行下附加。

成功附加後,可以下段了,打開debugger option

我們選擇在線程開始和庫載入時下斷,修改成功後,jdb附加,點擊運行

程序會斷在elf頭處,按下g鍵,搜索mmap,在mmap函數的段首和斷尾下段

f9運行,來到斷尾時f8單步,

來到此處時,在 blunk_5c999c2c下斷,f9一下,f7跟進去

跟進去今後在blx lr處進行下斷,此處就是進行反調試的地方,原理依然是獲取tracepid的值判斷當前是不是處於調試狀態,建議第一次調試的人在fgets和fopen處下斷,再f7跟進此調用就可以看到tracepid的值了。

跟進去之後,我們直接把方法移到最下方,就可以看到kill符號了,這就是殺進程的地方,如果當前處於調試狀態,則直接結束進程。

我們在此函數的所有cmpr0,#0處下斷,f9一下後即斷在斷點處,觀察寄存器窗口的r0值,實質就是當前的tracepid的16進制的值

不確定的可以使用cat /proc/pid/status進行對比一下,我們直接把r0置0,右鍵選擇zero value即可清0,繼續f9

我們看到程序又來到了mmap處,繼續f9

當繼續斷在調用反調試功能的方法時,繼續f7跟進,依然在所有的cmp r0,#0處下斷,斷下後把r0清0後繼續f9運行

目前的規律是,調用blxlr的第一次,第二次和第四次是進行反調試判斷的,第三次並不影響,可以直接f9跳過去,三次反調試搞定後,就可以愉快的f9運行並觀察堆棧窗口了

當看到出現如下所示時:

說明殼已經開始解密並釋放dex文件了,我們直接f8單步十幾步,最後f9一下就可以看到我們需要的dex頭了

直接腳本mp出來即可,最後把libjiagu的所有文件刪除,並修復下application標,如果存在則修復,不存在刪除即可

⑤ 如何防止android代碼被反編譯

關鍵演算法通過ndk 實現並生成動態庫, 用jni 與android 進行數據交互,這樣就是在牛逼的程序員也反編譯不了你的核心演算法和介面

熱點內容
vb資料庫數組 發布:2024-11-19 09:23:40 瀏覽:827
安卓游戲數據保存在哪裡找 發布:2024-11-19 09:22:02 瀏覽:309
解壓出來的文件亂碼 發布:2024-11-19 09:15:40 瀏覽:939
北航ftp是多少 發布:2024-11-19 09:15:32 瀏覽:821
瀏覽保存密碼如何取消 發布:2024-11-19 09:10:17 瀏覽:89
安卓怎麼關簡訊重復提醒 發布:2024-11-19 09:02:00 瀏覽:635
html與php的區別 發布:2024-11-19 09:00:53 瀏覽:193
晚安密碼多少 發布:2024-11-19 09:00:51 瀏覽:945
易語言腳本模塊 發布:2024-11-19 09:00:44 瀏覽:484
經典矩陣c語言 發布:2024-11-19 08:56:23 瀏覽:268
网站地图