首页
社区
课程
招聘
[求助]frida 如何保存输出信息到本地文件?
发表于: 2019-9-25 16:27 14898

[求助]frida 如何保存输出信息到本地文件?

2019-9-25 16:27
14898
frida 一般都是命令行窗口输出信息,然后我们分析
但一旦输出信息过多,可能需要先保存到本地。
所以,想请教各位大佬们,怎么把输出信息保存到本地文件?

有没有办法先运行py脚本,再启动apk呢?因为apk启动时可能执行了我想hook的方法,怕缺失这些输出信息。
我想了下,保存命令行窗口输出信息?JavaScript命令?frida命令?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 1489
活跃值: (1063)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
import frida
import sys

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

device = frida.get_usb_device()
pid = device.spawn("com.android.providers.downloads.ui", activity="com.android.providers.downloads.ui.DownloadList") 
with open('AdInfo.js') as f:
    jscode = f.read()
session = device.attach(pid)
session.enable_debugger()
script = session.create_script(jscode, runtime='v8')
script.on('message', on_message)
print('[*] Running CTF')
script.load()
script.exports.init()
device.resume(pid)
sys.stdin.read()
// AdInfo.js
rpc.exports = {
    init: function () {
        setImmediate(function () {
            Java.perform(function () {
                javaClassInit()
                hook_Md5SignData()
                hook_getSign()
                // hook_LocalNativeAdView_bindNativeAd()
            })
        })
    }
};
我自己是这样hook的:
1. 挂起方式启动app:  device.spawn
2. 读取javascript脚本: with open('AdInfo.js') as f:
3. 启用调试器方便在chrome中调试frida JavaScript脚本:  session.enable_debugger()
4. 启用v8引擎方便使用chrome调试
5. 此处可以下python断点,断下之后打开chrome中按f12,选择绿色图标打开nodejs调试器调试JavaScript脚本:script.exports.init()
6. 恢复apk程序运行:device.resume(pid)
最后于 2019-9-25 18:55 被金罡编辑 ,原因:
2019-9-25 18:47
0
雪    币: 1489
活跃值: (1063)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
关于保存日志:
1.在JavaScript脚本中使用send后on_message(message, data):会收到消息方便保存日志,楼主可以尝试使用这种方法中保存日志。
2.python中使用控制台输出流相关函数来读取控制台所有的输出,你可以查查相资料。
3.你可以运行frida_hook.py > log.txt来保存所有日志。
2019-9-25 19:03
0
雪    币: 6266
活跃值: (1276)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
金罡 关于保存日志: 1.在JavaScript脚本中使用send后on_message(message, data):会收到消息方便保存日志,楼主可以尝试使用这种方法中保存日志。 2.python中使 ...
感谢大佬指点。
你说的3种方法我都尝试过了,没什么效果,可能是我代码有问题
我用的是file的写文件。
就是apk启动后,它发了几次消息,然后关闭apk,然后文件一点内容都没有。
我很无奈
2019-9-25 21:14
0
雪    币: 6266
活跃值: (1276)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
金罡 关于保存日志: 1.在JavaScript脚本中使用send后on_message(message, data):会收到消息方便保存日志,楼主可以尝试使用这种方法中保存日志。 2.python中使 ...
具体代码:
import frida
import os
import sys

jscode = """
Java.perform(function() {
    console.log("[*] Starting script --console");
    var f = Java.use('类名');
    console.log("Hook Start");
    f.b.implementation = function(str1, str2) {
        console.log("Hook Start...");
        var ret = this.b(str1, str2);
        console.log("Success!");
	console.log(arguments[1]);
	return ret;
    }
});
"""

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

    else:
        print("else")
        print(message)
        file.write(message)


def execute(str):
    print(str)
    os.system(str)


if __name__ == '__main__':
    file = open(r"C:\Users\Xmhwws\Desktop\rizhi.txt", 'a')
    print("文件:" + file.read())
    execute("adb devices")
    execute("adb shell pm clear 包名")
    execute("adb shell am start -n 包名/启动Activity")
    process = frida.get_remote_device().attach('包名')
    script = process.create_script(jscode)
    script.on("message", message)
    script.load()
    sys.stdin.read()
    print("结束")
    file.flush()
    file.close()

2019-9-25 21:17
0
雪    币: 1489
活跃值: (1063)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
    def __executeCMD(self, cmd, printOutput = True):
        '''return tuple (output, errput, returncode)'''
        print ' '.join(cmd)
        if platform.system() == "Windows":
            subprocess.STARTUPINFO.dwFlags |= subprocess.STARTF_USESHOWWINDOW
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
    ##    while p.poll() is None:
    ##        x = p.stdout.readline()
    ##        if len(x) is not 0:
    ##            print x,
        out, err = p.communicate()
        if printOutput:
            if out is not None:
                print out
            if err is not None:
                print err
            print
        if p.returncode != 0:
            raise Exception("Execute CMD error: %d" % p.returncode)
        return (out, err, p.returncode)

out, err = p.communicate()
注意代码中的变量out就是控制台输出结果。
2019-9-26 01:09
0
雪    币: 175
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
在js代码中,直接使用frida提供的File保存文件,代码如下

function writeFile(content) {
 var file = new File("/sdcard/encrypt.txt","a+");//a+表示追加内容,此处的模式和c语言的fopen函数模式相同
 file.write(content+"\n");
 file.flush()
 file.close();
}
2019-9-26 09:16
1
雪    币: 6266
活跃值: (1276)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
ydscience 在js代码中,直接使用frida提供的File保存文件,代码如下 function writeFile(content) { var file = new File("/sdcar ...
感谢大佬的指点,测试了一下,可以写入数据。
此外,发现了一件事:
必须先给予apk读写权限才行,否则会报权限不足的异常。
/sdcard是不能写入的,data/user/0/包名这种私有目录可以
最后于 2019-9-30 18:06 被xmhwws编辑 ,原因:
2019-9-30 17:38
1
雪    币: 6266
活跃值: (1276)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
金罡     def __executeCMD(self, cmd, print ...

Thanks(・ω・)ノ

最后于 2020-7-10 06:11 被xmhwws编辑 ,原因:
2019-9-30 17:45
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
xmhwws ydscience 在js代码中,直接使用frida提供的File保存文件,代码如下 function writeFile(content) { v ...
楼主你好,就是用了他这段代码,然后就直接报错,frida.InvalidArgumentError: gDBus.Error:re.frida.Error.InvalidArgument: Script(line 16): SyntaxError: unterminated string,请问一下,这个参数就是换成一个字符串也报错。
最后于 2020-1-8 14:08 被wx_宁不知 。编辑 ,原因:
2020-1-7 16:57
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
powershell 可以用的 `| Tee-Object log.log`  保存日志
2020-7-10 00:17
0
雪    币: 33
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
frida -U  com.gdufs.xman -l printHookSample1.js > ./libartSymbols.txt 
2020-9-3 14:51
0
游客
登录 | 注册 方可回帖
返回
//