frida简单实用脚本的使用

2019-09-25  本文已影响0人  萌木盖

在公众号[跟小雅一起学逆向]看到的 具体怎么用还不知道,先保存上以后再看
下面是python脚本,然后根据需求该js代码就可

import frida, sys

def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)

jscode = """
    Java.perform(function () {
    // Function to hook is defined here
    var http = Java.use('com.cmstop.ctmediacloud.util.SignUtil');
    http.getSignStr.implementation = function (a1,a2,a3) {
            send("start");
            send("参数1:"+a1);
            send("参数2:"+a2);
            send("参数3:"+a3);
            var result = this.getSignStr(a1,a2,a3)
            send("结果:"+result);
            send("end");
            return result;
        };
    });
"""

process = frida.get_usb_device().attach('com.baotounews.api.m')
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
sys.stdin.read()

js代码

console.log("加载脚本成功!");
Java.perform(function x() {
    //定位StringBuilder,StringBuffer类
    const stringbuilder = Java.use("java.lang.StringBuilder");
    const stringbuffer = Java.use("java.lang.StringBuffer");

    //定位方法
    const toString = "toString";


    // 使用log类和Exception类产生堆栈
    var jAndroidLog = Java.use("android.util.Log");
    var jException = Java.use("java.lang.Exception");

    stringbuilder[toString].implementation = function(){
        //执行原逻辑
        const result = this[toString]();
        // 打印返回的字符串内容
        console.log(result);

        // 只有长度大于30时,才打印堆栈
        if (result.length > 30) {
            // 抛出异常。打印堆栈
            console.log(jAndroidLog.getStackTraceString(jException.$new()));
        }

        //return出去
        return result;
    };

    stringbuffer[toString].implementation = function() {
        //执行原逻辑
        const result = this[toString]();
        // 打印返回的字符串内容
        console.log(result);
        // 只有长度大于30时,才打印堆栈
        if (result.length > 30) {
            // 抛出异常。打印堆栈
            console.log(jAndroidLog.getStackTraceString(jException.$new()));
        }
        //return出去
        return result;
    }

});
console.log("加载脚本成功!");
Java.perform(function x() {
    //定位类
    const str = Java.use('java.lang.String');
    const objectClass = 'java.lang.Object';
    console.log("已经定位到目标类");//定位类成功!
    // 在这里更改类的方法的实现(implementation)
    str.equals.overload(objectClass).implementation = function(obj) {
        //打印传入的参数
        var response = str.equals.overload(objectClass).call(this, obj);
        console.log(str.toString.call(this) + ' == ' + obj.toString() + ' ? ' + response);


        //return出去
        return response;
    }

});
console.log("加载脚本成功!");
Java.perform(function x() {
    //定位类
    const str = Java.use('java.lang.String');

    console.log("已经定位到目标类");//定位类成功!
    // 在这里更改类的方法的实现(implementation)
    str.getBytes.overload().implementation = function() {

        var response = this["getBytes"]();
        console.log(this.toString());
        //return出去
        return response;
    }

});
上一篇下一篇

猜你喜欢

热点阅读