frida保存日志文件
程序员文章站
2022-05-12 14:20:41
...
这几天在用frida分析apk,遇到了一个问题就是,需要打印堆栈信息,然后来查看内部的方法的调用。在网上找了很久,由于新手的原因,不得入门,最终找了了一个可以打印日志的,经过测试发现可以打印出堆栈信息。
以下是打印日志的具体代码
import frida, sys,os
jscode = """
Java.perform(function () {
//要hook的类名完整路径
var HttpRequestEntity = Java.use('com.tencent.mm.ui.contact');
var threadef = Java.use('java.lang.Thread');
var threadinstance = threadef.$new();
function Where(stack){
for(var i = 0; i < stack.length; ++i){
send(stack[i].toString());
}
}
// 重写要hook的方法,如果是重载的话,overload中是类的全路径(大概~~),function括号为函数的参数个数
HttpRequestEntity.b.overload("com.tencent.mm.ui.contact.SelectContactUI","java.util.List").implementation = function (str,list) {
//调用原始的函数实现并且获得返回值
var ret = this.b(str,list);
//打印日志信息
var stack = threadinstance.currentThread().getStackTrace();
send("Full call stack:" + Where(stack));
//send("Deobfuscated " + ret + " @ " + stack[3].toString());
return ret;
};
});
"""
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
process = frida.get_remote_device().attach('com.tencent.mm')
script = process.create_script(jscode)
script.on('message', on_message)
script.load()
sys.stdin.read()
日志信息过多处理方案
还遇到了一个问题,就是打印日志的时候,堆栈信息有几万行,在cmd的窗口上不能显示,于是考虑是否可以将打印的日志保存到电脑的txt文本中。最终在看雪论坛一篇求助帖,全网就他一个人发了类似的文章,用其中一个老哥的方案就是:
function writeFile(content) {
var file = new File("/sdcard/encrypt.txt","a+");//a+表示追加内容,此处的模式和c语言的fopen函数模式相同
file.write(content+"\n");
file.flush();
file.close();
}
当时楼主说的是可以保存日志,然后我试了一下,一直报错,搞不懂为啥。。最后的解决方案是cmd的日志回显。
在你的frida脚本文件,我的是remote.py目录下,打开cmd窗口,输入以下命令即可。
python remote.py > > log.txt
另外补充一个大佬的
覆盖存储 python -u a.py > ./a.txt
追加存储 python -u a.py >> ./a.txt
附一个我成功的图