Chromatic深度解析:基于QuickJS的跨平台动态代码注入框架实现原理
Chromatic深度解析基于QuickJS的跨平台动态代码注入框架实现原理【免费下载链接】chromaticUniversal modifier for Chromium/V8 | 广谱注入 Chromium/V8 的通用修改器项目地址: https://gitcode.com/gh_mirrors/be/chromatic你是否曾经遇到过这样的技术挑战需要在不修改目标程序源码的情况下动态注入JavaScript代码到Chromium或V8引擎中或者在逆向工程、安全分析、插件开发时需要一套类似Frida的脚本化调试框架但希望它更加轻量级且跨平台Chromatic正是为解决这些问题而生的通用修改器它提供了广谱注入Chromium/V8的能力让你能够像Frida一样用JavaScript操控原生程序。Chromatic的核心创新在于构建了一个基于QuickJS的JavaScript运行时环境通过巧妙的代码重定位和内存操作技术实现了对目标进程的无缝注入。这个开源项目不仅继承了BetterNCM的基因更将其扩展为通用的动态代码注入框架支持Windows、Linux、macOS和Android等多平台。技术挑战与Chromatic的解决方案挑战一如何在不重启进程的情况下注入JavaScript运行时传统的动态代码注入通常需要复杂的DLL注入或进程劫持技术但Chromatic采用了更加优雅的解决方案。它通过code_relocator模块实现代码重定位将QuickJS引擎和自定义的JavaScript运行时直接注入到目标进程的内存空间中。这种设计的精妙之处在于它不需要修改目标程序的二进制文件而是通过内存操作技术创建一个隔离的JavaScript执行环境。src/core/bindings/internal/code_relocator.cc中的重定位算法能够处理复杂的地址依赖关系确保注入的代码能够在目标进程的地址空间中正确运行。挑战二如何提供类似Frida的完整API集Frida之所以强大是因为它提供了一套完整的动态插桩API。Chromatic通过精心设计的TypeScript接口和C绑定层实现了几乎与Frida兼容的API// Chromatic提供的核心API import { Memory, Process, Module, Interceptor } from chromatic; // 内存操作 const buffer Memory.alloc(1024); buffer.writeU32(0xDEADBEEF); // 进程信息 console.log(Arch: ${Process.arch}, Platform: ${Process.platform}); // 模块查找 const mallocAddr Module.findExportByName(null, malloc); // 函数拦截 Interceptor.attach(mallocAddr, { onEnter(args) { console.log(malloc called with size: ${args[0]}); }, onLeave(retval) { console.log(malloc returned: ${retval}); } });Chromatic的API设计哲学是最小化学习成本最大化功能覆盖。如果你熟悉Frida几乎可以零成本迁移到Chromatic。这种兼容性是通过src/core/typescript/src/目录下的TypeScript定义文件和src/core/bindings/中的C绑定实现的。核心架构三层分离的设计哲学1. 注入层Injectee Layer注入层是Chromatic与目标进程交互的桥梁位于src/injectee/目录。这个模块负责进程附着与分离通过injectee.cc实现安全的进程注入内存空间管理分配和设置可执行内存区域异常处理捕获和处理目标进程的异常事件// 注入器的核心逻辑简化示例 void inject_into_process(pid_t pid) { // 1. 打开目标进程 process_handle open_process(pid); // 2. 分配内存空间 remote_memory allocate_remote_memory(process_handle, code_size); // 3. 写入重定位后的代码 write_remote_memory(process_handle, remote_memory, relocated_code); // 4. 创建远程线程执行注入代码 create_remote_thread(process_handle, remote_memory); }2. 核心运行时层Core Runtime Layer这是Chromatic的大脑位于src/core/目录。它包含模块功能描述关键文件内存管理提供内存分配、读写、保护修改等操作native_memory.cc/h函数拦截实现函数调用拦截和参数修改native_interceptor.cc/h断点系统软件和硬件断点支持native_breakpoint.cc/h,native_hw_breakpoint.cc/h指令分析反汇编和指令流分析native_disassembler.cc/hFFI系统外部函数接口调用原生代码native_ffi.cc/h3. JavaScript绑定层JavaScript Binding Layer这一层通过QuickJS将C功能暴露给JavaScript位于src/core/bindings/目录自动绑定生成通过TypeScript定义自动生成C绑定代码类型安全转换在JavaScript和C类型间安全转换异步操作支持提供Promise-based的异步API// 绑定示例NativePointer类的JavaScript暴露 JSValue create_native_pointer_class(JSContext* ctx) { JSClassDef class_def { NativePointer, .finalizer native_pointer_finalizer, .gc_mark native_pointer_gc_mark }; // 注册方法 JS_SetPropertyStr(ctx, class_proto, add, JS_NewCFunction(ctx, native_pointer_add, add, 1)); JS_SetPropertyStr(ctx, class_proto, readU8, JS_NewCFunction(ctx, native_pointer_read_u8, readU8, 0)); return JS_NewClass(ctx, class_id, class_def); }关键技术实现细节动态代码重定位技术Chromatic最核心的技术之一是code_relocator模块。这个模块解决了注入代码中的地址依赖问题// src/core/bindings/internal/code_relocator.cc class CodeRelocator { public: // 重定位代码段修复所有地址引用 std::vectoruint8_t relocate(const void* code, size_t size, uintptr_t new_base); // 处理不同类型的重定位记录 bool process_relocation(uint8_t* relocated_code, const RelocationRecord record); };重定位过程分为三个步骤解析原始代码分析代码中的绝对地址引用计算偏移量根据新的基地址计算相对偏移修复引用更新代码中的所有地址引用跨平台内存操作抽象Chromatic通过native_memory.cc实现了跨平台的内存操作接口// 跨平台内存保护设置 std::string NativeMemory::protect(NativePointer address, size_t size, const std::string protection) { #if defined(CHROMATIC_WINDOWS) DWORD old_protect; VirtualProtect(address.ptr(), size, protection_to_windows(protection), old_protect); return windows_to_protection(old_protect); #elif defined(CHROMATIC_LINUX) || defined(CHROMATIC_DARWIN) int prot protection_to_unix(protection); mprotect(align_to_page(address.ptr()), align_to_page_size(size), prot); return unix_to_protection(prot); #endif }函数拦截器的实现拦截器是动态分析的核心Chromatic的拦截器支持多种架构class NativeInterceptor { public: // 附加拦截器到目标函数 InterceptorHandle attach(NativePointer target, const InterceptorCallbacks callbacks); private: // ARM64架构的trampoline生成 std::vectoruint8_t generate_arm64_trampoline(NativePointer target); // x64架构的trampoline生成 std::vectoruint8_t generate_x64_trampoline(NativePointer target); // 保存原始指令 bool backup_original_code(NativePointer target, size_t size); };拦截器的工作原理指令备份保存目标函数开头的指令跳转生成生成跳转到hook处理函数的指令上下文保存保存CPU寄存器状态回调执行调用JavaScript回调函数上下文恢复恢复寄存器并执行原始代码硬件断点的架构支持硬件断点是Chromatic的高级特性它利用CPU的调试寄存器class NativeHardwareBreakpoint { public: // 设置硬件断点 static HardwareBreakpointHandle set(NativePointer address, BreakpointType type, size_t size, HardwareBreakpointCallback callback); // 获取支持的断点数量 static size_t max_breakpoints() { #if defined(CHROMATIC_X64) return 4; // x64架构支持4个硬件断点 #elif defined(CHROMATIC_ARM64) return 2; // ARM64通常支持2个硬件断点 #else return 0; // 其他架构不支持 #endif } };开发实践从零开始构建Chromatic插件环境搭建与构建Chromatic使用xmake作为构建系统依赖管理清晰# 克隆项目 git clone https://gitcode.com/gh_mirrors/be/chromatic # 安装依赖 xmake require breeze-js-runtime capstone fmt libffi asmjit # 构建核心库 xmake build chromatic-core # 构建测试程序 xmake build chromatic-test # 运行测试 xmake run chromatic-test编写第一个注入脚本创建一个简单的JavaScript脚本演示Chromatic的基本功能// demo.js - 监控malloc调用 const malloc Module.findExportByName(null, malloc); Interceptor.attach(malloc, { onEnter(args) { this.size args[0].toUInt32(); console.log([] malloc(${this.size}) called); }, onLeave(retval) { console.log([-] malloc returned: ${retval}); console.log( Allocated ${this.size} bytes); } }); // 设置内存访问监控 const targetBuffer Memory.alloc(64); const monitor MemoryAccessMonitor.enable( [{ address: targetBuffer, size: 64 }], (details) { console.log(Memory accessed at: ${details.address}); console.log(Operation: ${details.operation}); } ); // 设置硬件断点如果支持 if (HardwareBreakpoint.maxBreakpoints 0) { const breakpoint HardwareBreakpoint.set( malloc, execute, 1, () { console.log(Hardware breakpoint hit at malloc!); } ); }高级应用函数参数修改Chromatic允许修改函数参数和返回值这在逆向工程中非常有用// 修改函数参数示例 const targetFunc Module.findExportByName(target.dll, secretFunction); Interceptor.attach(targetFunc, { onEnter(args) { // 修改第一个参数 args[0] ptr(0x12345678); // 记录原始参数 this.originalArg1 args[1]; }, onLeave(retval) { // 修改返回值 this.returnValue.replace(ptr(0xDEADBEEF)); console.log(Modified return value from ${retval} to 0xDEADBEEF); } });性能优化与最佳实践内存管理优化Chromatic在内存管理方面做了大量优化内存池技术重用已分配的内存块减少系统调用页面对齐所有内存操作都按页面边界对齐提高性能批量操作支持批量内存读写减少上下文切换异步操作支持对于耗时的操作Chromatic提供了异步API// 异步内存扫描 async function findPatternInModule(moduleName, pattern) { const module Process.findModuleByName(moduleName); if (!module) return []; // 异步扫描不阻塞主线程 const results await Memory.scan( module.base, module.size, pattern ); return results.map(r r.address); } // 并行处理多个扫描任务 async function scanMultipleModules(modules, patterns) { const promises modules.map(module Memory.scan(module.base, module.size, patterns[module.name]) ); return Promise.all(promises); }错误处理与资源清理正确的资源管理对于长期运行的注入脚本至关重要class ResourceManager { constructor() { this.interceptors []; this.breakpoints []; this.monitors []; } attachInterceptor(target, callbacks) { const listener Interceptor.attach(target, callbacks); this.interceptors.push(listener); return listener; } cleanup() { // 清理所有资源 this.interceptors.forEach(listener listener.detach()); this.breakpoints.forEach(bp bp.remove()); this.monitors.forEach(monitor monitor.disable()); SoftwareBreakpoint.removeAll(); HardwareBreakpoint.removeAll(); MemoryAccessMonitor.disableAll(); Interceptor.detachAll(); } } // 使用示例 const manager new ResourceManager(); // 脚本结束时自动清理 Script.bind(destroyed, () { manager.cleanup(); });技术展望Chromatic的未来发展方向1. 更多架构支持目前Chromatic主要支持x64和ARM64架构未来计划扩展到RISC-V架构随着RISC-V生态的发展支持这一新兴架构32位系统完善x86和ARM32的支持嵌入式平台针对IoT设备的轻量级版本2. 增强的调试功能计划中的调试功能增强源代码级调试支持源映射和符号调试时间旅行调试记录执行历史并支持反向调试可视化分析集成图形化分析界面3. 性能监控与分析未来的性能监控特性实时性能分析监控目标进程的CPU和内存使用调用图生成自动生成函数调用关系图热点分析识别性能瓶颈和优化机会4. 安全增强安全特性的路线图反检测技术对抗反调试和反注入技术隐蔽模式减少注入痕迹提高隐蔽性加密通信保护脚本和数据的传输安全总结为什么选择ChromaticChromatic作为一个通用的Chromium/V8修改器在动态代码注入领域提供了独特的价值技术优势跨平台支持Windows、Linux、macOS、Android全平台覆盖⚡高性能基于QuickJS的轻量级运行时开销极小完整API提供与Frida兼容的完整动态插桩API️安全稳定经过严格测试的生产级代码质量完善文档详细的API文档和示例代码应用场景安全研究恶意软件分析、漏洞挖掘逆向工程软件分析、协议逆向插件开发为现有软件添加扩展功能自动化测试UI自动化、功能测试性能分析内存泄漏检测、性能优化通过src/core/typescript/中的TypeScript定义和src/core/bindings/中的C实现Chromatic建立了一个强大而灵活的动态代码注入框架。无论是安全研究人员、逆向工程师还是插件开发者都能在这个框架中找到需要的工具和API。Chromatic不仅是一个工具更是一个技术平台它展示了现代C、JavaScript和系统编程技术的完美结合。随着项目的不断发展它有望成为动态代码注入领域的标准解决方案之一。【免费下载链接】chromaticUniversal modifier for Chromium/V8 | 广谱注入 Chromium/V8 的通用修改器项目地址: https://gitcode.com/gh_mirrors/be/chromatic创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考