为什么这个简单的 C 代码 Frida trace 运行不稳定?

Why does this simple Frida trace of C code act erratically?

我正在试验 Frida,我发现一些最简单的示例在 macOS 上无法按预期运行。这是一个例子。

考虑这个 C 代码:

#include <stdio.h>
#include <unistd.h>

void print_hello(int n, char a, float f) {
    printf("hello %d %c %f\n", n, a, f);
}

int main(int argc, char *argv[]) {
    while (1) {
        print_hello(10, 'a', 3.141f);
        sleep(1);
    }
    return 0;
}

它的作用一目了然。

现在这是一个 Frida python 启动器:

#!/usr/bin/env python3

import frida

def on_message(message, data):
    print(message)

pid = frida.spawn('./a.out')
session = frida.attach(pid)
script = session.create_script("""
    Interceptor.attach(Module.findExportByName(null, 'print_hello'), {
        onEnter(args) {
            send('enter')
        },
        onLeave(retval) {
            send('leave')
        }
    })
""")
script.on('message', on_message)
script.load()
frida.resume(pid)

人们会期望它每秒打印 enter/leave。相反,这里是我得到的一些结果:


% ./trace.py 
hello 10 a 3.141000
{'type': 'send', 'payload': 'enter'}
hello 10 a 3.141000
hello 10 a 3.141000
hello 10 a 3.141000
hello 10 a 3.141000
hello 10 a 3.141000
hello 10 a 3.141000
hello 10 a 3.141000
hello 10 a 3.141000
hello 10 a 3.141000
^C

% ./trace.py 
hello 10 a 3.141000
{'type': 'send', 'payload': 'enter'}
hello 10 a 3.141000
hello 10 a 3.141000
hello 10 a 3.141000
^C

% ./trace.py 
hello 10 a 3.141000
{'type': 'send', 'payload': 'enter'}
hello 10 a 3.141000
^C

% ./trace.py 
hello 10 a 3.141000
{'type': 'send', 'payload': 'enter'}
{'type': 'send', 'payload': 'leave'}

% ./trace.py 
hello 10 a 3.141000
{'type': 'send', 'payload': 'enter'}
hello 10 a 3.141000
hello 10 a 3.141000
^C

% ./trace.py 
hello 10 a 3.141000
{'type': 'send', 'payload': 'enter'}
hello 10 a 3.141000
hello 10 a 3.141000
hello 10 a 3.141000
^C

在第三次调用时它退出了 w/o ^C.

没有任何东西可以让 trace.py 保持活动状态,因此一旦到达脚本末尾,检测就会恢复 - 作为 Python 解释器关闭的一部分。您可以在脚本末尾添加对 sys.stdin.read() 的调用以避免这种情况。