抖音資料采集教程,動靜態結合逆向WhatsApp
0x01.hook方法的所有多載
在一篇文章帶你領悟Frida的精髓一文中,我們已經學會了對放的多載進行處理的方法,我們先回顧一下代碼:
my_class.fun.overload("int" , "int").implementation = function(x,y){
my_class.fun.overload("java.lang.String").implementation = function(x){
也就是說我們需要構造一個多載的陣列,并把每一個多載都列印出來,我們直接上代碼:
//目標類
var hook = Java.use(targetClass);
//多載次數
var overloadCount = hook[targetMethod].overloads.length;
//列印日志:追蹤的方法有多少個多載
console.log("Tracing " + targetClassMethod + " [" + overloadCount + " overload(s)]");
//每個多載都進入一次
for (var i = 0; i < overloadCount; i++) {
//hook每一個多載
hook[targetMethod].overloads[i].implementation = function() {
console.warn("\n*** entered " + targetClassMethod);
//可以列印每個多載的呼叫堆疊,對除錯有巨大的幫助,當然,資訊也很多,盡量不要列印,除非分析陷入僵局
Java.perform(function() {
var bt = Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new());
console.log("\nBacktrace:\n" + bt);
});
// 列印引數
if (arguments.length) console.log();
for (var j = 0; j < arguments.length; j++) {
console.log("arg[" + j + "]: " + arguments[j]);
}
//列印回傳值
var retval = this[targetMethod].apply(this, arguments); // rare crash (Frida bug?)
console.log("\nretval: " + retval);
console.warn("\n*** exiting " + targetClassMethod);
return retval;
}
}
這樣我們對于方法的所有多載就處理好了,接下來是列舉所有方法,
0x02.hook類的所有方法
還是直接上代碼:
function traceClass(targetClass)
{
//Java.use是新建一個物件哈,大家還記得么?
var hook = Java.use(targetClass);
//利用反射的方式,拿到當前類的所有方法
var methods = hook.class.getDeclaredMethods();
//建完物件之后記得將物件釋放掉哈
hook.$dispose;
//將方法名保存到陣列中
var parsedMethods = [];
methods.forEach(function(method) {
parsedMethods.push(method.toString().replace(targetClass + ".", "TOKEN").match(/\sTOKEN(.*)\(/)[1]);
});
//去掉一些重復的值
var targets = uniqBy(parsedMethods, JSON.stringify);
//對陣列中所有的方法進行hook,traceMethod也就是第一小節的內容
targets.forEach(function(targetMethod) {
traceMethod(targetClass + "." + targetMethod);
});
}
0x03.hook類的所有子類
還是上核心部分的代碼:
//列舉所有已經加載的類
Java.enumerateLoadedClasses({
onMatch: function(aClass) {
//迭代和判斷
if (aClass.match(pattern)) {
//做一些更多的判斷,適配更多的pattern
var className = aClass.match(/[L]?(.*);?/)[1].replace(/\//g, ".");
//進入到traceClass里去
traceClass(className);
}
},
onComplete: function() {}
});
0x04.hook本地庫的匯出函式
// 追蹤本地庫函式
function traceModule(impl, name)
{
console.log("Tracing " + name);
//frida的Interceptor
Interceptor.attach(impl, {
onEnter: function(args) {
console.warn("\n*** entered " + name);
//列印呼叫堆疊
console.log("\nBacktrace:\n" + Thread.backtrace(this.context, Backtracer.ACCURATE)
.map(DebugSymbol.fromAddress).join("\n"));
},
onLeave: function(retval) {
//列印回傳值
console.log("\nretval: " + retval);
console.warn("\n*** exiting " + name);
}
});
}
0x05.動靜態結合逆向WhatsApp
終于到了實戰的時候,把以上代碼拼接起來,形成一個腳本,其實這個腳本awesome-frida
里面也有介紹,代碼在這里,就是有點小bug,經葫蘆娃修改好之后,終于可以用了,
我們來試下它的幾個主要的功能,首先是本地庫的匯出函式,
setTimeout(function() {
Java.perform(function() {
trace("exports:*!open*");
//trace("exports:*!write*");
//trace("exports:*!malloc*");
//trace("exports:*!free*");
});
}, 0);
我們hook的是open()函式,跑起來看下效果:
$ frida -U -f com.whatsapp -l raptor_frida_android_trace_fixed.js --no-pause

如圖所示*!open*根據正則匹配到了openlog、open64等匯出函式,并hook了所有這些函式,列印出了其引數以及回傳值,
接下來想要看哪個部分,只要扔到jadx里,靜態“分析”一番,自己隨便翻翻,或者根據字串搜一搜,

比如說我們想要看上圖中的com.whatsapp.app.protocol包里的內容,就可以設定trace("com.whatsapp.app.protocol"),


可以看到包內的函式、方法、包括多載、引數以及回傳值全都列印了出來,這就是frida腳本的魅力,
當然,腳本終歸只是一個工具,你對Java、安卓App的理解,和你的創意才是至關重要的,
接下來可以搭配Xposed module看看別人都給whatsapp做了哪些模塊,hook的哪些函式,實作了哪些功能,學習自己寫一寫,

當然,再強調一句,做外掛是違法行為,千萬不要制作和分發任何App的外掛,否則等待你的只會是法律的制裁,
短視頻、直播資料實時采集介面,請查看檔案: TiToData
免責宣告:本檔案僅供學習與參考,請勿用于非法用途!否則一切后果自負,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/249777.html
標籤:其他
上一篇:Redis基礎之組態檔
下一篇:資料型別轉換的一些特殊規則
