原文链接: https://frida.re/docs/javascript-api/#console
欢迎加入 Frida 交流群: 1049977261
console
-
console.log(line)
,console.warn(line)
,console.error(line)
:
将line
写入到你的 Frida 应用的控制台. 具体的行为取决于 frida-core 在哪里被集成.
例如, 使用 frida-python 时, 它输出到 stdout 或者 stderr, 使用 frida-qml 时则是 qDebug, 等等.
参数中包含的ArrayBuffer
对象将被hexdump
以默认选项输出的结果替代.
rpc
-
rpc.exports
: 一个可以替换或者插入的空对象以便给你的应用暴露 RPC 风格的 API. 键指定方法的名称, 值则是你导出的方法.
被导出的方法可以立即返回一个值给调用方, 也可以返回一个Promise
对象以便异步执行.
例如:
rpc.exports = {
add: function (a, b) {
return a + b;
},
sub: function (a, b) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(a - b);
}, 100);
});
}
};
对于使用 Node.js 绑定物的应用, 这个 api 可以被这样使用:
const frida = require('frida');
const fs = require('fs');
const path = require('path');
const util = require('util');
const readFile = util.promisify(fs.readFile);
let session, script;
async function run() {
const source = await readFile(path.join(__dirname, '_agent.js'), 'utf8');
session = await frida.attach('iTunes');
script = await session.createScript(source);
script.message.connect(onMessage);
await script.load();
console.log(await script.exports.add(2, 3));
console.log(await script.exports.sub(5, 3));
}
run().catch(onError);
function onError(error) {
console.error(error.stack);
}
function onMessage(message, data) {
if (message.type === 'send') {
console.log(message.payload);
} else if (message.type === 'error') {
console.error(message.stack);
}
}
Python 版本也很相似:
import codecs
import frida
def on_message(message, data):
if message['type'] == 'send':
print(message['payload'])
elif message['type'] == 'error':
print(message['stack'])
session = frida.attach('iTunes')
with codecs.open('./agent.js', 'r', 'utf-8') as f:
source = f.read()
script = session.create_script(source)
script.on('message', on_message)
script.load()
print(script.exports.add(2, 3))
print(script.exports.sub(5, 3))
session.detach()
上面的例子中我们使用了 script.on('message', on_message)
来监听被注入进程中发来的消息.
另外还有很多其他的通知可以让你观察 script
和 session
对象.
如果你想在进程退出时被通知, 可以使用 session.on('detached', your_function)
.