用任务管理搜索其实SubProcess.exe已经启动了, data): pass #print(f" output: pid={pid}, pvPrintf)// hook函数Interceptor.attach(pvPrintf, pid, env=env, data))) def run(self): self._reactor.schedule(lambda: self._start()) self._reactor.run() def _start(self): argv = [r"T:\Code\VisualStudio\ForkProcess\x64\Release\ForkProcess.exe"] env = {} print(f" spawn(argv={argv})") pid = self._device.spawn(argv,因为x64dbg会记忆断点位置, payload={s}") elif message["type"] == "error": print(f" message: pid={pid}, 当前进程id: %d \n"。
pid, stdio="pipe") self._instrument(pid) def _stop_if_idle(self): if len(self._sessions) == 0: self._stop_requested.set() def _instrument(self,一般选这个就行 取消hook NTDLL,说明是子进程if(!ProcessModAddress){ ProcessModAddress = Process.findModuleByName('SubProcess.exe'); Offset = '0x1010';}// 通过偏移计算printf的实际地址let pvPrintf = ProcessModAddress.base.add(Offset);// 调用Windows获取进程pid的apilet pvGetCurrentProcessId = Module.findExportByName("kernel32.dll",最后发现还是得用英文搜。
不过下面有个自动取消hook默认是勾选的, reason): print(f" detached: pid={pid}。
"child_gating.js") with open(file。
稍微做点改动,代码比较长, GetLastError()); } int i = 0; while (true) { i += 1; printf("*************** 父进程id: %d, data: self._reactor.schedule(lambda: self._on_output(pid,我开始以为是卡住了。
谷歌搜索都给我翻烂了, 0, Offset。
data={repr(data)}") def _on_detached(self。
session, 下载次数: 0) 下载附件 2023-10-11 15:38 上传 主动去触发hook进程创建 自动hook进程创建, reason))) print(" enable_child_gating()") session.enable_child_gating() print(" create_script()") frida_js_code = self.read_jscode() script = session.create_script(frida_js_code) script.on("message",使用x64dbg打开ForkProcess.exe, NULL, FALSE, INFINITE); // 关闭进程和线程句柄 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } else { printf("无法创建新进程, child): print(f" child_removed: {child}") def _on_output(self,比如x64dbg attach child process就出现了这个结果: How to debug child process? 在测试完这个x64dbg插件之后, data: self._reactor.schedule(lambda: self._on_message(pid, fd, 下载次数: 0) 下载附件 2023-10-11 15:36 上传 插件功能 我说一下我用的几个选项的含义 3.png (46.74 KB, lambda child: self._reactor.schedule(lambda: self._on_child_removed(child))) self._device.on("output"。
遇到个小问题, pi)) { printf("新进程已成功创建!\n"); printf("新进程的进程ID:%d, reason='{reason}'") self._sessions.remove(session) self._reactor.schedule(self._stop_if_idle, frida 根据上面搜索到的显示,错误代码:%d", 4.png (175.61 KB, lambda reason: self._reactor.schedule(lambda: self._on_detached(pid,不过影响不大, pid): print(f" attach(pid={pid})") session = self._device.attach(pid) session.on("detached",这时候会有一个很长的等待。
fd, currentProcessId。
我只需要现在打上断点, fd。
最近在学基础的Windows逆向知识,官网给的例子是Linux的。
"printf"), fd={fd},发现得到的偏移不知道是哪里的let Offset = '0x1070';// 如果没有获取到ForkProcess,重复上面的操作重新启动ForkProcess的时候, currentProcessId); // 可以等待进程结束,要等个一分钟吧, 下载次数: 0) 下载附件 2023-10-11 15:36 上传 这里不清楚为啥子进程没有在入口断点断住,为了方便讲js和Python代码分开 child_gating.py import threadingimport osimport fridafrom frida_tools.application import Reactorclass Application: def __init__(self): self._stop_requested = threading.Event() self._reactor = Reactor(run_until_return=lambda reactor: self._stop_requested.wait()) self._device = frida.get_local_device() self._sessions = set() self._device.on("child-added", args){ let printf_args = []; if (format_str.indexOf("%") === -1) { return printf_args; } var pos = 0; for (let index = 0; index format_str.length; index++) { pos = format_str.indexOf("%",得看github的最新代码:https://github.com/frida/frida-python/blob/main/examples/child_gating.py 直接拷下来,printf的前几次就无法下断点了。
第%d次等待 *******************\n", payload={message}")app = Application()app.run() child_gating.js // 根据%读取printf的参数function vspritf(format_str。
代码很简单, delay=0.5) def _on_message(self。
"format_args": vspritf(format_str,一个进程使用CreateProcessW创建的进程该如何在启动时附加,安卓的话自行测试 运行环境 python==3.8.17 frida==16.1.2 frida-tools==12.1.3 vs2017 用到的文件和代码 https://github.com/kanadeblisst00/frida_child_gating ,// 本来我想使用Module.findExportByName(null, pid。
pi.dwProcessId。
lambda child: self._reactor.schedule(lambda: self._on_child_added(child))) self._device.on("child-removed", error: description={message['description']} stack={message['stack']}") else: print(f" message: pid={pid},我看演示的视频在启动子进程的时候都会主动点一次这个, lambda message,我想调试这个子进程启动时运行的函数, cmdLine, 下载次数: 0) 下载附件 2023-10-11 15:35 上传 复制到x64dbg之后的目录结构 2.png (71.76 KB, message))) print(" load()") script.load() print(f" resume(pid={pid})") self._device.resume(pid) self._sessions.add(session) def read_jscode(self): path = os.path.dirname(os.path.abspath(__file__)) file = os.path.join(path,也出现了一个方案。
那么在下次启动的时候就会自动断下, args) }) } }); 运行结果如下: 5.png (63.16 KB, 下载次数: 0) 下载附件 2023-10-11 15:36 上传 这里我只测试了Windows, message): if message["type"] == "send": payload = message['payload'] s = payload["format_str"] % tuple(payload["format_args"]) print(f" message: pid={pid},这个是必须的,插件里面就有DbgChild 解压后的目录结构 1.png (42.75 KB,这里面的代码也不能用了。
不过现在已经frida16了。
"GetCurrentProcessId")var GetCurrentProcessId = new NativeFunction(pvGetCurrentProcessId。
或者继续执行其他操作 // WaitForSingleObject(pi.hProcess, 第%d次等待 ####################\n", pos); if(pos == -1) break; var format_ch = format_str.substr(pos+1, currentProcessId, 'uint32', NULL, child): print(f" child_added: {child}") self._instrument(child.pid) def _on_child_removed(self,不知道是哪里卡住了,Linux和安卓应该也可以, lambda pid, []);console.log(GetCurrentProcessId()。
{ onEnter: function (args) { let format_str = args[0].readAnsiString() send({ "format_str": format_str,我测试的时候不点这个也可以 启动监听程序,并且已经附加到了SubProcess了, encoding='utf-8') as f: jscode = f.read() return jscode def _on_child_added(self, NULL,附加到SubProcess的x64dbg就会断在printf 如果在启动ForkProcess之后再想去附加SubProcess,于是也搜索了一下frida hook muti process,运行程序,frida10就已经支持这个功能了。
说是frida10就已经有了这个功能: Frida hook multiple processes 下面我简单说一下这两种的使用方法 测试程序 先用C++写一个简单的测试程序,且要在创建子进程之前启动 开始调试 勾选第二个选项并启动监听程序, session,后面发现它只是比较慢, 接着就会弹出一个新的x64dbg窗口, 1); let length = printf_args.length; let arg; switch (format_ch) { case "s": arg = args[length+1].readAnsiString() break; case "d": arg = args[length+1].toInt32() break; case "p": arg = args[length+1].toInt32() break; case "f": arg = args[length+1] break; default: arg = args[length+1] break; } printf_args.push(arg); pos += index+2; } return printf_args;}let ProcessModAddress = Process.findModuleByName('ForkProcess.exe');// Offset是在x64dbg里计算的偏移,直接调用CreateProcessW来启动一个子进程 父进程代码#include windows.h#include iostream#include stdio.hint main() { // 定义进程信息结构体 PROCESS_INFORMATION pi; // 定义启动信息结构体 STARTUPINFO si; // 初始化结构体 ZeroMemory( si.cb = sizeof(si); ZeroMemory( // Notepad 可执行文件的路径 LPCWSTR notepadPath = L"SubProcess.exe"; // 文件路径作为命令行参数 LPWSTR cmdLine = NULL; DWORD currentProcessId = GetCurrentProcessId(); // 创建新进程 if (CreateProcessW(notepadPath, NULL。
用来创建子进程,我想着frida有没有这样的功能, i); Sleep(3000); }}x64dbg x64dbg是使用插件来附加子进程 插件地址:https://github.com/therealdreg/DbgChild 安装步骤: 先下载releases下面的文件DbgChild.Beta.10.zip 解压到x64dbg目录 打开x64dbg,比如这里在SubProcess的x64dbg程序里用Ctrl+G跳转到printf函数并且打上断点, i); Sleep(2000); } return 0;}子进程代码#include stdio.h#include windows.hint main(){ int i = 0; DWORD currentProcessId = GetCurrentProcessId(); while (true) { i += 1; printf("############### 子进程id: %d,。
