您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“java動靜態結合逆向WhatsApp的方法”,內容詳細,步驟清晰,細節處理妥當,希望這篇“java動靜態結合逆向WhatsApp的方法”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
在一篇文章帶你領悟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; } }
這樣我們對于方法的所有重載就處理好了,接下來是枚舉所有方法。
還是直接上代碼:
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); }); }
還是上核心部分的代碼:
//枚舉所有已經加載的類 Java.enumerateLoadedClasses({ onMatch: function(aClass) { //迭代和判斷 if (aClass.match(pattern)) { //做一些更多的判斷,適配更多的pattern var className = aClass.match(/[L]?(.*);?/)[1].replace(/\//g, "."); //進入到traceClass里去 traceClass(className); } }, onComplete: function() {} });
// 追蹤本地庫函數 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); } }); }
終于到了實戰的時候,把以上代碼拼接起來,形成一個腳本,其實這個腳本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的外掛,否則等待你的只會是法律的制裁。
讀到這里,這篇“java動靜態結合逆向WhatsApp的方法”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。