安卓逆向之基于Xposed-ZjDroid脱壳 逆向分析(脱壳)
安卓逆向——某力播逆向分析(脫殼)
?
一、環境
這一步真的頭疼,環境很重要,各種測試,一下是我測試的環境,由于沒有真機,就拿虛擬機做測試
1.? Xposed? ? ? ?2.?FDex2? ? ? ? ?3. fiddler? ? ?4.?軟件?
?
二、抓包
通過 fiddler 抓包分析參數
可以看到,倆次請求的參數, udid 是一樣,可以不用變,timestamp 應該是個時間戳,signature 可以經過某種變化的,也是主要分析的
三、脫殼
1、查看加固??
首先對apk進行反編譯
# 首先對apk進行反編譯
apktool d com.iCitySuzhou.suzhou_8.2.apk
進入到反編譯后的文件夾
進入到反編譯后的文件夾
cd com.iCitySuzhou.suzhou_8.2
查看lib文件夾下的so文件
.
├── libBugly.so
├── libYLEncode.so
├── libjcore110.so
├── liblbs.so
├── liblocSDK6a.so
├── libshella-2.9.0.2.so
├── libshellx-2.9.0.2.so
├── mix.dex
└── mixz.dex
如何確認是什么加固呢? 不同的加固廠商有不同的加固特征, 查看lib下的so文件libshella這個就是 樂加固 的特征,可以直接百度搜索一下, 不知道如何確認 就把每個文件都在百度搜索一下。
2、進行脫殼
通過上一步我們知道了該App為樂加固, 現在我們通過FDex2來進行脫殼, 打開我們已經安裝好的FDex2
?? ?? ? ? ? ?
點擊引力播
? ? ? ? ? ??
將這幾個文件 使用adb pull 拉取到本地?
使用jadx把這幾個文件打開看下, 看看哪個是我們所需要的脫殼后的文件,
經過驗證com.iCitySuzhou.suzhou0015542488.dex
這個就是我們脫殼后所需要的文件。 脫殼成功
四、signature分析
1、定位signature
全局搜索signature
可以看到很多結果,這個就需要自己一個一個去看看,去找到正確的,
可以看到這里,應該可以看出是個賦值的操作吧,點進去
我這里用了反混淆,更好的分析代碼,不然搜索一下出現很多不太好分析,找到 那個方法 鼠標右擊 跳轉申明 (跳到申明函數的地方)
(這里反混淆,只是吧方法或者變量變成 唯一的好查找而已,工具----》反混淆)
m12059a(udid, valueOf)? 這里傳了倆個參數,應該udid 應該獲取的設備號,valueOf 是獲取的時間戳
這里 signature 參數方法,在 跳轉聲明 到下面這個地方,這里應該是調用了什么 MD5 的加密方法
通過 上面應該函數的 參數,進行 MD5 加密? 在經過 字節偏移 得到的值
這里 有倆種方法,1.? 自己?重寫 signature算法? ? 2. 復制 原來的 java 代碼
我用 第二種方法吧,
1.? ?復制 java代碼,保持為 java 文件?
2.? ?編譯Java成class?javac MySig.java
2.? ?把class文件打包成jar包? ?jar ?cvf ?(新jar的名字) ?(.class文件,多個則中間用空格隔開)??
? ? ? ? ?如: jar? cvf??test.jar test.class??test2.class
3.? ?python 來執行 jar 包 ,jpype 包,,用 pip install?jpype1 安裝
5.? 擼代碼
把 3個?signature ,timestamp,udid 參數配置好就可以模擬請求了。代碼如下
from jpype import *
import time
import requests
uuid = 'IMEI860000000065903-IMSI460001993232212'
# udid = "IMEI867686021698806-IMSI460NNNNNNNNNNNN"
str_2 = str(int(time.time()))
str_1 = "f1190aca-d08e-4041-8666-29931cd89dde"
str_sign = "%s&&%s&&%s"%(uuid,str_2,str_1)
def Getsignature(str_sign):
jvm_path = getDefaultJVMPath()
jar_path = 'F:\\mysig.jar' # jar包路徑
startJVM(jvm_path, '-ea', '-Djava.class.path=%s' % jar_path) # 啟動虛擬機
JClass2 = JClass('mysig')
instance = JClass2()
sum = str(instance.get_sign(str_sign))
print(type(sum),str(sum))
print(type(str(sum)),str(sum))
# shutdownGuiEnvironment()
# shutdownJVM()
return sum
def GetDate(signature):
Headers = {
'sys': 'Android',
'sysVersion': '6.0.1',
'appVersion': '8.2',
'appVersionCode': '54',
'udid': uuid,
'clientType': 'android',
'timestamp': str_2,
'signature': signature,
'Host': 'app.suzhou-news.cn',
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip',
'User-Agent': 'okhttp/3.9.0',
}
for i in range(1,100):
Url = 'https://app.suzhou-news.cn/api/v1/appNews/getBannerNewsList7?page={}&bannerID=11 '.format(i)
res = requests.get(Url,headers=Headers, verify=False)
print('弟 %s 頁'%(i),res.json())
?模擬請求了100頁,下面是 運行的結果,
?
作者?源代碼??下載
?
補充 :
環境要慢慢測試,模擬器很多問題,建議真機,最好 Android 6 ,以下是我測試過的環境
? ? ? ??
?
前言
之前介紹了普通常見的反編譯模式 但對于使用了?360加固 棒棒 愛加密 等等的加固應用就沒辦法了、
你會發現反編譯出來的dex 只有幾個類 邏輯都是調用so ??
真正的dex會被加載到內存中隱藏起來 加固應用都是多dex這種形式
要想拿到他真正的dex 需要進行脫殼處理 ?基本原理都是從內存中dump?我一般會先用工具來嘗試 不行的話就得上 IDA(反匯編神器)超級強的一個工
具 殺手級別 貫穿移動端 PC端的逆向 但使用IDA 進行靜態分析 動態調試脫殼就變的很麻煩了 而且并不是一兩天能學會的
以后會介紹使用 我們今天先用工具嘗試簡單的脫殼
?
?
?
ZjDroid工具介紹
?
ZjDroid是基于Xposed Framewrok的動態逆向分析模塊,逆向分析者可以通過ZjDroid完成以下工作: 1、DEX文件的內存dump 2、基于Dalvik關鍵指針的內存BackSmali,有效破解主流加固方案 3、敏感API的動態監控 4、指定內存區域數據dump 5、獲取應用加載DEX信息。 6、獲取指定DEX文件加載類信息。 7、dump Dalvik java堆信息。 8、在目標進程動態運行lua腳本。
?
ZjDroid github開源的一個項目 主要功能就是脫殼 基于內存dump 其他功能一般 ?作者很NB 總有些人可以把Xposed玩出花來
我下篇博客會介紹一個針對安卓端應用分析工具 很強大!
工具準備
已ROOT手機一臺并裝好xpsoed框架在裝上ZjDroid模塊 ?
?
JEB ?apk專業逆向工具 但是和IDA一樣要花錢 吾愛論壇提供破解版本
?
這里提一下jeb的優勢 可以直接打開apk進行反編譯 而已還原效果好
jd-gui看反編譯出來的jar(源碼)有些代碼為注釋狀態 顯示不出來 ?但JEB 肯定可以全部還原
?
愛盤地址? ? ? ? ? ??ZjDroid地址
?
實戰案例
某個朋友托我逆向個應用 叫微丟丟 微信營銷的 去官網下載APK 拖到JEB里簡單的看了下
只有幾個類 一看就是加固應用 并且使用的是360加固 ? 這種結構的類 在有個Application 鐵定的加固應用?
至于做了哪些操作 基本都是常見的套路 釋放so文件 到應用沙盒目錄下
?
注意 JEB 反編譯出來的代碼 初始狀態都為smali ?需要用快捷鍵Q或者鼠標右鍵Decompile下?
?
?
?
簡單分析過后 下載apk到安裝好ZjDroid的手機中 ? 打開應用到主界面 ?
?
?
我們需要獲取這個應用的pid值 這就需要用到一個命令了 PC端 WIN+X+R CMD 進入CMD窗口輸入命令
命令:?adb shell dumpsys activity top?
獲取到當前程序的Activity信息 這個命令很實用 最好記一下
?
如果顯示過多 可以寫成 adb shell dumpsys activity top |more ?按行輸出
?
?
?
?
獲取這個應用的包名 com.haiqu.oem 還要牢記這個pid 8445之后的操作都會用到他?
接著我們來使用pid查看這個應用在手機里面 dex 所在的位置
查詢 dex 信息 所在位置
am broadcast -a com.zjdroid.invoke --ei target?8445?--es cmd '{action:dump_dexinfo}'
?
?
有些時候輸入這條命令會報一條警告:
WARNING: linker: app_process has text relocations. This is wasting memory and is a security risk. Please fix.
WARNING: linker: app_process has text relocations. This is wasting memory and is a security risk. Please fix.
?
警告:鏈接器:app_process有文本重定位。 這是浪費記憶,是一個安全隱患。 請修復 ?
無視就可以 警告而已
?
記住先adb shell 一下進到手機目錄 在輸入這條命令
?
輸入這條命令 我們發現并沒有什么實際的變化 需要使用ZjDroid 特有的查看LOG命令
?LOG 查詢 ?后戳為你要查詢應用的包名
adb logcat -s zjdroid-shell-com.haiqu.oem
?
記住在開個CMD窗口哦 ?
?
這就獲取到了 apk所在的位置 filepath: /data/app/com.haiqu.oem-1.apk???記下來 ?下一步我們會用到這個
這里說明下?5792 是我重啟了次手機 pid變成了5792
開始脫殼 ?命令:
?
am broadcast -a com.zjdroid.invoke --ei target?5792?--es cmd '{action:backsmali, "dexpath":"/data/app/com.haiqu.oem-1.apk"}'
?
輸入完命令 回到LOG cmd窗口進行查看
?
?
?
上面的/data/data/com.haiqu.oem/files/dexfile.dex ?就是脫出來的dex 拿到了dex基本就是拿到了源碼?
?
我們使用RE文件管理器 進到這個目前下 直接使用QQ發送電腦不行 該文件不支持此操作?
?
需要把他挪到根目錄下 在使用豌豆莢或者其他工具 直接發送到電腦上
?
在使用 安卓逆向助手把dex轉成jar 或者用dexjar 都行 就可以使用jd-gui直接查看代碼?工具很多 我之前有一篇博客介紹了安卓逆向助手的使用 不懂的可以去看下 ?JEB也可以直接打開dex格式文件 直接進行查看
?
?
總結
到這里這個工具最重要的功能介紹完畢 很簡單 但也能對付一些普通加殼應用?
?
總結
以上是生活随笔為你收集整理的安卓逆向之基于Xposed-ZjDroid脱壳 逆向分析(脱壳)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyQt5在对话框中打开外部链接的方法
- 下一篇: 将本地项目上传到码云(gitee)远程仓