Windows
直接监控 jvm.dll 的示例工具
本示例展示如何使用 Frida 监控由 fledge.exe 进程(BB 模拟器)执行的 jvm.dll。
将代码保存为 bb.py,启动 BB 模拟器(fledge.exe),然后运行 python.exe bb.py fledge.exe
即可监控 jvm.dll 中 AES 算法的使用情况。
import frida
import sys
def on_message(message, data):
print("[%s] => %s" % (message, data))
def main(target_process):
session = frida.attach(target_process)
script = session.create_script("""
// 获取主进程 fledge.exe 当前导入的 jvm.dll 基地址
const baseAddr = Module.findBaseAddress('Jvm.dll');
console.log('Jvm.dll 基地址: ' + baseAddr);
const setAesDecrypt0 = resolveAddress('0x1FF44870'); // 此处使用反汇编器中看到的函数地址
Interceptor.attach(setAesDecrypt0, { // 拦截对 SetAesDecrypt 函数的调用
// 函数被调用时打印其参数
onEnter(args) {
console.log('');
console.log('[+] 调用 SetAesDeCrypt0' + setAesDecrypt0);
console.log('[+] 上下文: ' + args[0]);
console.log('[+] 输入: ' + args[1]); // 明文
console.log('[+] 输出: ' + args[2]); // 该指针将存储加/解密后的数据
console.log('[+] 长度: ' + args[3]); // 待加/解密数据的长度
dumpAddr('输入数据', args[1], args[3].toInt32());
this.outptr = args[2]; // 保存 arg2 和 arg3 以便在函数退出时查看
this.outsize = args[3].toInt32();
},
// 函数执行完成时
onLeave(retval) {
dumpAddr('输出数据', this.outptr, this.outsize); // 打印输出数组,其中将包含加/解密后的数据
console.log('[+] 从 setAesDecrypt0 返回: ' + retval);
}
});
function dumpAddr(info, addr, size) {
if (addr.isNull())
return;
console.log('数据转储 ' + info + ' :');
const buf = addr.readByteArray(size);
// 如需彩色显示,将 ansi 设为 true
console.log(hexdump(buf, { offset: 0, length: size, header: true, ansi: false }));
}
function resolveAddress(addr) {
const idaBase = ptr('0x1FEE0000'); // 输入您使用的反汇编器(此处为 IDA)中看到的 jvm.dll 基地址
const offset = ptr(addr).sub(idaBase); // 计算内存中相对于 IDA 数据库基地址的偏移量
const result = baseAddr.add(offset); // 将当前内存基地址与要监控函数的偏移量相加
console.log('[+] 新地址=' + result); // 在控制台输出函数在内存中的位置
return result;
}
""")
script.on('message', on_message)
script.load()
print("[!] 在 UNIX 系统按 Ctrl+D,在 Windows/cmd.exe 按 Ctrl+Z 以脱离被检测程序。\n\n")
sys.stdin.read()
session.detach()
if __name__ == '__main__':
if len(sys.argv) != 2:
print("用法: %s <进程名或 PID>" % __file__)
sys.exit(1)
try:
target_process = int(sys.argv[1])
except ValueError:
target_process = sys.argv[1]
main(target_process)
原文链接:Windows | Frida • A world-class dynamic instrumentation toolkit
翻译来源:DeepSeek