IDA去除so簽名驗(yàn)證(新手向)
眾所周知,簽名校驗(yàn)是一個(gè)對(duì)安卓逆向人超級(jí)頭大的一個(gè)問題,與其用工具去除,不如用了解簽名校驗(yàn)的原理后用ida去除
Part 0 原理
簽名驗(yàn)證必須調(diào)用系統(tǒng)api
Java層一般通過getPackageManager().getPackageInfo.signatures來獲取簽名信息。
NDK層一般調(diào)用Native方法/DLL/Lua腳本等通過獲取Java的context/Activity對(duì)象,動(dòng)態(tài)JNI反射調(diào)用getPackageInfo等來獲取簽名。
Part 1 查簽名驗(yàn)證
我們拿到這個(gè)apk后重簽名,發(fā)現(xiàn)無法正常運(yùn)行,說明有簽名驗(yàn)證。我們?cè)侔惭b原簽名apk斷網(wǎng)后正常運(yùn)行,說明是本地驗(yàn)證
先用jeb打開
搜索signatures
并未找到,說明Java層面沒有簽名校驗(yàn)

接著,我們搜索loadLibrary,這是Java層面調(diào)用so的api

我們雙擊跳轉(zhuǎn)

這段代碼的大意是將JniTest賦值到寄存器0再將此作為參數(shù)傳入LoadLibrary()
我們解壓apk打開lib目錄,選擇對(duì)應(yīng)手機(jī)型號(hào)的cpu,UP是armabi架構(gòu)
用IDA pro打開libJniTest.so
用以下選項(xiàng)打開

如果沒有Elf for arm 就安裝ELF.b
我們搜索signature,勾選查找所有事件

????????我們會(huì)搜索出很多結(jié)果,一般只需要看一看函數(shù)(function)

我們先點(diǎn)開第一個(gè)函數(shù),打開圖標(biāo)視圖


發(fā)現(xiàn)沒有關(guān)鍵跳轉(zhuǎn),接著往下看,我們會(huì)在圖中所示的函數(shù)發(fā)現(xiàn)關(guān)鍵跳轉(zhuǎn)

右鍵,轉(zhuǎn)換為文本視圖,按F5轉(zhuǎn)換為偽C代碼(前提你的IDA支持)

我們發(fā)現(xiàn)了簽名校驗(yàn)的函數(shù),按ESC退出反編譯模式,因此我們要讓跳轉(zhuǎn)失效

BEQ指令是“相等(或?yàn)?)跳轉(zhuǎn)指令”,
BNE指令是“不相等(或不為0)跳轉(zhuǎn)指令”,
B指令是“無條件跳轉(zhuǎn)指令”,
CBZ 指令是“比較,為零則跳轉(zhuǎn)”,
CBNZ指令是“比較,為非零則跳轉(zhuǎn)”。
通過工具,我們發(fā)現(xiàn):
BNE跳轉(zhuǎn)指令對(duì)應(yīng)的HEX機(jī)器碼是D1,
BEQ跳轉(zhuǎn)指令對(duì)應(yīng)的HEX機(jī)器碼是D0,
CBZ跳轉(zhuǎn)指令對(duì)應(yīng)的HEX機(jī)器碼是B1,
CBNZ跳轉(zhuǎn)指令對(duì)應(yīng)的HEX機(jī)器碼是B9。
所以,我們需要把BNE改為BEQ,即把D1改為D0,IDA無法修改,只是為了定位

記住內(nèi)存地址,用notepad++或mt的hex編輯器修改

????最后,我們重簽名,就不會(huì)退出了