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代码
- Android中使用StringBuffer,
StringBuilder这两个类操作字符串,Hook其toString方法并打印堆栈,在很多情况下可以定位到加密字段的生成堆栈。
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;
}
});
- Hook 用于字符串比较的方法,同样可以得到大量信息,需要注意的是,代码没有做优化,应该加上堆栈调用+输出筛选,否则遇到较大的应用会崩溃。
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;
}
});
- 加密算法中,明文调用getBytes方法转换为字节数组,Hook并打印堆栈可以快速定位
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;
}
});