使用Frida能够方便地获取到DLL基址,还能修改寄存器值。首先要通过任务管理器获得进程的PID,然后写Python脚本把Frida附加到这个PID进程,根据IDA分析出来的函数地址,HOOK到目标函数,修改寄存器的值,最终实现控制进程逻辑。
获取PID
在任务管理器的详细信息里获得进程的PID。
代码实现
import frida
import sys
def main(target_process):
session = frida.attach(target_process)
script = session.create_script("""
// 获取基地址 3.9.2.23
const baseAttr = Module.findBaseAddress("xx.dll");
console.log("xx.dll基地址: "+ baseAttr);
// 函数地址 revokemsg
// 调用SyncMgr::ProcessRevokeMsg 0x10D13470
const revokeMsgFunAddr = getRealAddr("0x10D23BC0");
console.log("函数地址:", revokeMsgFunAddr);
// 函数注入
Interceptor.attach(revokeMsgFunAddr, {
onEnter(args) {
// 用来判断是否Hook成功
// console.log("== revokeMsg ==");
// 查看和修改esi
console.log(this.context.esi);
// 设置esi的值,跳过判断
this.context.esi = 0;
}
});
// 从IDA地址转化到内存地址
function getRealAddr(addr) {
// IDA基地址,在IDA View-A顶部的HEADER里查到
const idaBase = ptr('0x10000000');
const offset = ptr(addr).sub(idaBase); // 偏移
const result = ptr(baseAttr).add(offset); // 实际内存地址
return result;
}
""")
script.load()
print("程序附加成功!")
sys.stdin.read()
session.detach()
if __name__ == "__main__":
target_process = 4496
main(target_process)
参考
https://frida.re/docs/examples/windows/