FRIDA脚本系列(二)成长篇:动静态结合逆向WhatsApp

栏目: JavaScript · 发布时间: 5年前

内容简介:在在

FRIDA脚本系列(二)成长篇:动静态结合逆向WhatsApp

FRIDA脚本系列(一)入门篇:在安卓8.1上dump蓝牙接口和实例 中,我们学到了枚举模块中所有的类、子类及其方法,以及找到其所有重载,最终还通过蓝牙接口来小小的实战了一下。这一篇我们倒着来,从 hook 所有重载开始,写一个可以动态观察所有模块、类、方法等接口数据的 工具 出来。

0x01.hook方法的所有重载

一篇文章带你领悟Frida的精髓(基于安卓8.1) /READMD.md)一文中,我们已经学会了对放的重载进行处理的方法,我们先回顾一下代码:

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

FRIDA脚本系列(二)成长篇:动静态结合逆向WhatsApp

如图所示 *!open* 根据正则匹配到了 openlogopen64 等导出函数,并hook了所有这些函数,打印出了其参数以及返回值。

接下来想要看哪个部分,只要扔到 jadx 里,静态“分析”一番,自己随便翻翻,或者根据字符串搜一搜。

FRIDA脚本系列(二)成长篇:动静态结合逆向WhatsApp

比如说我们想要看上图中的 com.whatsapp.app.protocol 包里的内容,就可以设置 trace("com.whatsapp.app.protocol")

FRIDA脚本系列(二)成长篇:动静态结合逆向WhatsApp

FRIDA脚本系列(二)成长篇:动静态结合逆向WhatsApp

可以看到包内的函数、方法、包括重载、参数以及返回值全都打印了出来。这就是 frida 脚本的魅力。

当然,脚本终归只是一个工具,你对 Java 、安卓App的理解,和你的创意才是至关重要的。

接下来可以搭配 Xposed module 看看别人都给 whatsapp 做了哪些模块, hook 的哪些函数,实现了哪些功能,学习自己写一写。

FRIDA脚本系列(二)成长篇:动静态结合逆向WhatsApp

当然,再强调一句,做外挂是违法行为,千万不要制作和分发任何App的外挂,否则等待你的只会是法律的制裁。


以上所述就是小编给大家介绍的《FRIDA脚本系列(二)成长篇:动静态结合逆向WhatsApp》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Host Your Web Site In The Cloud

Host Your Web Site In The Cloud

Jeff Barr / SitePoint / 2010-9-28 / USD 39.95

Host Your Web Site On The Cloud is the OFFICIAL step-by-step guide to this revolutionary approach to hosting and managing your websites and applications, authored by Amazon's very own Jeffrey Barr. "H......一起来看看 《Host Your Web Site In The Cloud》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具