欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

附一个我成功的图
frida保存日志文件

相关标签: Android