
作者:Python進(jìn)階者
來源:Python爬蟲與數(shù)據(jù)挖掘
有時候可能會對APP進(jìn)行字符串加密等操作,這樣的話你的變量名等一些都被混淆了,看代碼就可能無從下手
不管沒關(guān)系,像系統(tǒng)級別的東西,Toast了等函數(shù),是不能混淆的,所以可以根據(jù)蛛絲馬跡,終究找到破解的點
frida -U 連接USB設(shè)備
-F 附加到最前面的app
-l 注入的js
-o 輸出到文件
-f 重新啟動
--no-pause 立馬執(zhí)行,中間不停頓
打印堆棧的本質(zhì)就是拋異常,他的結(jié)果是從下往上看的!
function printStacks() { console.log(
Java.use("android.util.Log")
.getStackTraceString(
Java.use("java.lang.Throwable").$new()
)
);
}
hashMap,,那就很常用了,懂的都懂,但是一定要做好篩選,要不然app容易崩潰!
var hashMap = Java.use("java.util.HashMap");
hashMap.put.implementation = function (a, b) { //a=="username"和a.equals("username")一般都可以 //如果不行換一下即可 if (a=="username") { console.log("hashMap.put: ", a, b);
printStacks();
} return this.put(a, b);
}
Array似乎也很常用
var arrayList = Java.use("java.util.ArrayList");
arrayList.add.overload('java.lang.Object').implementation = function (a) { if (a == "username=18903916120") { console.log("arrayList.add: ", a);
printStacks();
} //console.log("arrayList.add: ", a); return this.add(a);
}
arrayList.add.overload('int', 'java.lang.Object').implementation = function (a, b) { console.log("arrayList.add: ", a, b); return this.add(a, b);
}
這個方法通常是安卓判斷輸入框是否為空必經(jīng)的方法!
var textUtils = Java.use("android.text.TextUtils");
textUtils.isEmpty.implementation = function (a) { if (a == "TURJNk1EQTZNREE2TURBNk1EQTZNREE9") { console.log("textUtils.isEmpty: ", a);
printStacks();
} //console.log("textUtils.isEmpty: ", a); return this.isEmpty(a);
}
這個方法似乎也挺多,去掉開頭和結(jié)尾的空格,防止臟數(shù)據(jù)
var str = Java.use("java.lang.String");
str.trim.implementation = function () { console.log("str.trim: ", this);
printStacks(); return this.trim();
}
var log = Java.use("android.util.Log");
log.w.overload('java.lang.String', 'java.lang.String').implementation = function (tag, message) { console.log("log.w: ", tag, message);
printStacks(); return this.w(tag, message);
}
這個應(yīng)該就多了,但是這個一般在加密的上層,可以考慮使用。
var editText = Java.use("android.widget.EditText");
editText.getText.overload().implementation = function () { var result = this.getText();
result = Java.cast(result, Java.use("java.lang.CharSequence")); console.log("editText.getText: ", result.toString());
printStacks(); return result;
}
排序方法,頻率還湊合
var collections = Java.use("java.util.Collections");
collections.sort.overload('java.util.List').implementation = function (a) {
var result = Java.cast(a, Java.use("java.util.ArrayList"));
console.log("collections.sort List: ", result.toString());
printStacks(); return this.sort(a);
}
collections.sort.overload('java.util.List', 'java.util.Comparator').implementation = function (a, b) {
var result = Java.cast(a, Java.use("java.util.ArrayList"));
console.log("collections.sort List Comparator: ", result.toString());
printStacks(); return this.sort(a, b);
}
// .overload('java.lang.String', 'double')
// .overload('java.lang.String', 'int')
// .overload('java.lang.String', 'long')
// .overload('java.lang.String', 'boolean')
一般在轉(zhuǎn)成json時用的聽過的,可以考慮
var jSONObject = Java.use("org.json.JSONObject");
jSONObject.put.overload('java.lang.String', 'java.lang.Object').implementation = function (a, b) { //var result = Java.cast(a, Java.use("java.util.ArrayList")); console.log("jSONObject.put: ", a, b);
printStacks(); return this.put(a, b);
}
jSONObject.getString.implementation = function (a) { //var result = Java.cast(a, Java.use("java.util.ArrayList")); console.log("jSONObject.getString: ", a); var result = this.getString(a); console.log("jSONObject.getString result: ", result);
printStacks(); return result;
}
這個就很多了,基本上每個app都有,但是hook這個位置又偏加密下層,因為肯定是處理完才彈窗
但是可以考慮不輸入賬號密碼直接提交,這樣位置大概在加密的上層,可以順著往下走
var toast = Java.use("android.widget.Toast");
toast.show.implementation = function () { console.log("toast.show: ");
printStacks(); return this.show();
}
base64就很多了吧,除了消息摘要算法其他最后的形式都是base64格式,很有必要。
var base64 = Java.use("android.util.Base64");
base64.encodeToString.overload('[B', 'int').implementation = function (a, b) { console.log("base64.encodeToString: ", JSON.stringify(a)); var result = this.encodeToString(a, b); console.log("base64.encodeToString result: ", result)
printStacks(); return result;
}
var str = Java.use("java.lang.String");
str.getBytes.overload().implementation = function () { var result = this.getBytes(); var newStr = str.$new(result); console.log("str.getBytes result: ", newStr);
printStacks(); return result;
}
str.getBytes.overload('java.lang.String').implementation = function (a) { var result = this.getBytes(a); var newStr = str.$new(result, a); console.log("str.getBytes result: ", newStr);
printStacks(); return result;
}
這種方式hook代碼,需要frida幫助我們啟動app。
所以本次啟動的命令為
frida -U -f com.dodonew.online -l g_關(guān)鍵代碼快速定位.js -o 1.txt --no-pause
因為可能一開始就綁定了很多控件,所以一開始就要開始hook。
控件id可以通過<SDK目錄>toolsbin下的uiautomatorviewer.bat來進(jìn)行查看
查看登錄按鈕id
所以這個登錄按鈕的id就是btn_login
// 找id var btn_login_id = Java.use("com.dodonew.online.R$id").btn_login.value; console.log("btn_login_id:", btn_login_id); var view = Java.use("android.view.View");
view.setOnClickListener.implementation = function (a) { if(this.getId() == btn_login_id){ console.log("view.id: " + this.getId()); console.log("view.setOnClickListener is called");
printStacks();
} return this.setOnClickListener(a);
}
在嘟嘟牛這個app中,最后使用的是DES算法,并且base64結(jié)果展示加密的內(nèi)容。
所以就hook一下base64試試
Java.perform(function () { //打印堆棧 function printStacks() { console.log(
Java.use("android.util.Log")
.getStackTraceString(
Java.use("java.lang.Throwable").$new()
)
);
} //base64 var base64 = Java.use("android.util.Base64");
base64.encodeToString.overload('[B', 'int').implementation = function (a, b) { console.log("base64.encodeToString: ", JSON.stringify(a)); var result = this.encodeToString(a, b); console.log("base64.encodeToString result: ", result)
printStacks(); return result;
}
})
所以如果說,你如果看結(jié)果像是base或者md5或者h(yuǎn)ex等,直接就使用這些常用的hook代碼試一下,并且拋出堆棧。
就可以很好分析代碼了。
雖然寫的是關(guān)鍵代碼定位,其實只不過是常用的代碼罷了,上面這些使用在逆向app時總結(jié)的hook代碼。
當(dāng)然,實際肯定不止這么少,根據(jù)需求來,經(jīng)驗越多,輪子就越多。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03