
网络安全应用安全逆向工程移动开发【免费下载链接】BlackDexBlackDex is an Android unpack(dexdump) tool, it supports Android 5.0~12 and need not rely to any environment. BlackDex can run on any Android mobile phone or emulator, you can unpack APK File in several seconds.项目地址https://gitcode.com/gh_mirrors/bl/BlackDex点击查看免费下载本篇技术指南以 BlackDex 仓库内置的 Dobby hook 框架intro-board.md为核心系统讲解其“轻量、模块化、多平台、多架构”的设计理念并结合仓库内真实源码给出 DobbyHook 函数替换、DobbyInstrument 动态二进制插桩、DobbySymbolResolver 符号解析以及 Android/iOS/桌面端构建配置的完整实战方案。读完本文你将掌握 Dobby 的公开 API 用法、CMake 构建选项并能看懂 BlackDex 脱壳引擎如何借助 Dobby 完成对 libart.so 关键方法的 inline hook。Dobby 是什么Dobby 是一个 lightweight轻量级、multi-platform多平台、multi-architecture多架构的 exploit hook 框架被 BlackDex 作为底层 hook 引擎内嵌于 Bcore/src/main/cpp/Dobby 目录下。它与 Frida、Substrate、Minhook 等同类工具定位相近但更强调“最小化、模块化”与“内核友好”。其核心定位由官方文档明确列出Minimal and modular library最小化且模块化的库无冗余依赖Multi-platform support支持 Windows / macOS / iOS / Android / LinuxMultiple architecture support支持 X86、X86-64、ARM、ARM64intro-board 原文写作 X86-64、ARM、ARM64仓库 README.md 进一步明确为 X86、X86-64、ARM、ARM64 四种Clean code without STL不依赖 C STL便于移植到内核态Plugin support提供 SymbolResolver、SupervisorCallMonitor 等插件intro-board 中带问号的 DobbyDrill 属计划性描述仓库中可确认落地的是 SymbolResolver 与 SupervisorCallMonitoriOS kernel exploit supportGollum文档中同样以问号标注属于路线图性质的能力仓库中未包含对应实现源码本文不作展开。多平台与多架构支持的内幕从 CMake 看架构分派Dobby 的平台/架构适配逻辑集中在 CMakeLists.txt它通过SYSTEM.*与PROCESSOR.*宏把源码按平台和 CPU 架构切分编译# arch prefix if(PROCESSOR.ARM) set(ARCH1 ARM) set(arch1 arm) set(core_arch arm) elseif(PROCESSOR.AARCH64) set(ARCH1 ARM64) ... elseif(PROCESSOR.X86) set(ARCH1 X86) ... elseif(PROCESSOR.X86_64) set(ARCH1 X64) ... endif()随后按架构选取对应的指令重定位、跳板与汇编模块例如指令重定位source/InstructionRelocation/${arch1}/${ARCH1}InstructionRelocation.cc对应 arm、arm64、x64、x86跳板桥source/TrampolineBridge/Trampoline/${arch1}/trampoline-${arch1}.cc平台工具层source/UserMode/PlatformUtil/${platform2}/ProcessRuntimeUtility.cc与source/UserMode/UnifiedInterface/platform-${platform1}.ccposix / windows 两套实现。不依赖 STL 的设计则体现在外部依赖仅引入 logging、misc-helper、xnucxx 三个自研小库见 CMakeLists 中add_subdirectory(external/...)段落全部由纯 C/C 手写无第三方模板库参与。公开 API 速览五个核心入口公共头文件 include/dobby.h 以extern C形式导出了全部对外接口同时附带了跨平台的RegisterContext寄存器上下文与HookEntryInfo结构定义。核心函数如下API作用签名DobbyHook用 replace_call 替换目标函数可保存原始函数指针int DobbyHook(void *address, void *replace_call, void **origin_call)DobbyInstrument对目标指令/函数做动态二进制插桩回调携带寄存器上下文int DobbyInstrument(void *address, DBICallTy dbi_call)DobbyDestroy销毁并还原 hookint DobbyDestroy(void *address)DobbySymbolResolver遍历符号表查找符号地址void *DobbySymbolResolver(const char *image_name, const char *symbol_name)DobbyGlobalOffsetTableReplace替换 GOT全局偏移表条目int DobbyGlobalOffsetTableReplace(char *image_name, char *symbol_name, void *fake_func, void **orig_func)此外还有DobbyBuildVersion()返回构建日期、dobby_enable_near_branch_trampoline()/dobby_disable_near_branch_trampoline()控制近分支跳板与dobby_register_image_load_callback()注册镜像加载回调。RegisterContext按架构区分ARM64 下可通过ctx-general.regs.x0等访问通用寄存器、通过ctx-floating访问浮点寄存器默认仅保证 q0–q7 可访问dobby.h 注释明确提示除非启用完整浮点寄存器打包否则不能访问 q8–q31x64 下对应ctx-general.regs.rdi等ARM 下对应ctx-general.regs.r0等。这些结构是编写插桩回调时取参数的依据。三种 Hook 模式与示例代码get-started.md 给出了三种经典用法均为可直接编译运行的完整示例。模式一函数替换replace hook functionextern C { extern int DobbyHook(void *function_address, void *replace_call, void **origin_call); } size_t (*origin_fread)(void * ptr, size_t size, size_t nitems, FILE * stream); size_t (fake_fread)(void * ptr, size_t size, size_t nitems, FILE * stream) { // Do What you Want. return origin_fread(ptr, size, nitems, stream); } DobbyHook((void *)fread, (void *)fake_fread, (void **)origin_fread);要点替换函数与被替换函数保持完全一致的签名origin_call保存原始函数指针在 fake 函数内调用它即可“先拦截、再透传”实现无侵入的监控或改写。模式二动态二进制插桩instrument functionuintptr_t getCallFirstArg(RegisterContext *ctx) { uintptr_t result; #if defined(_M_X64) || defined(__x86_64__) #if defined(_WIN32) result ctx-general.regs.rcx; // Windows x64 调用约定第一个参数在 rcx #else result ctx-general.regs.rdi; // SysV x64 调用约定第一个参数在 rdi #endif #elif defined(__arm64__) || defined(__aarch64__) result ctx-general.regs.x0; // ARM64 第一个参数在 x0 #elif defined(__arm__) result ctx-general.regs.r0; // ARM 第一个参数在 r0 #else #error Not Support Architecture. #endif return result; } void malloc_handler(RegisterContext *ctx, const HookEntryInfo *info) { size_t size_ getCallFirstArg(ctx); // [ATTENTION]: printf 内部会调用 malloc在循环中会崩溃请使用 puts ... } DobbyInstrument((void *)malloc, malloc_handler);文档特别强调了插桩场景的一个坑printf内部会调用malloc对 malloc 插桩后再在回调里调用 printf 会形成递归死循环应改用puts等不触发目标函数的输出手段。这也是编写插桩回调时必须注意的“回调内禁止调用被 hook 函数”原则。模式三替换 PAC 签名函数iOS arm64evoid *posix_spawn_ptr __builtin_ptrauth_strip((void *)posix_spawn, ptrauth_key_asia); void *fake_posix_spawn_ptr __builtin_ptrauth_strip((void *)fake_posix_spawn, ptrauth_key_asia); DobbyHook((void *)posix_spawn_ptr, (void *)fake_posix_spawn_ptr, (void **)orig_posix_spawn); *(void **)orig_posix_spawn (void *)ptrauth_sign_unauthenticated((void *)orig_posix_spawn, ptrauth_key_asia, 0);针对 arm64e 的指针认证PAC机制先用ptrauth_strip剥离签名拿到真实函数地址再 hook最后用ptrauth_sign_unauthenticated重新为原始指针签名保证透传调用时认证仍可通过。符号解析与真实调用链从 DobbySymbolResolver 到 BlackDex 脱壳Dobby 的符号解析插件Plugin.SymbolResolver默认开启实现在 builtin-plugin/SymbolResolver/elf/dobby_symbol_resolver.ccELF 平台与 macho/dobby_symbol_resolver.ccMach-O 平台。DobbySymbolResolver(NULL, dlopen)这类调用可在当前进程映像中查找动态库导出符号传镜像名如libart.so则定位到指定 so。BlackDex 正是利用这一能力完成脱壳核心 hook。在 DexDump.cpp 的hookDumpDex中依次按 Android L / M / O 三个版本尝试解析art::ClassLinker::LoadMethod的 C mangled 符号符号随 ART 版本演进而变化// L loadMethod DobbySymbolResolver(libart, _ZN3art11ClassLinker10LoadMethodEPNS_6ThreadERKNS_7DexFileERKNS_21ClassDataItemIteratorENS_6HandleINS_6mirror5ClassEEE); // M loadMethod DobbySymbolResolver(libart, ...ClassAccessor...); // O loadMethod DobbySymbolResolver(libart, ...ClassAccessor6Method...);解析到目标地址后先调用_make_rwx(loadMethod, _page_size)将目标页置为可读可写可执行再按系统 API level 分派到new_LoadMethodO / new_LoadMethodM / new_LoadMethodL三个替换函数通过DobbyHook(loadMethod, (void *) new_LoadMethodO, (void **) orig_LoadMethodO)完成 inline hook从而在 ART 加载方法时截获并转储 dex。这完整展示了“符号解析 → 内存权限修改 → DobbyHook 函数替换”的工业级 hook 链路。插件生态SymbolResolver / GOT Hook / 链接器限制等Dobby 以 CMake option 形式提供可裁剪插件默认值见 CMakeLists.txtCMake 选项默认说明DOBBY_GENERATE_SHAREDON构建共享库OFF 则构建静态库DOBBY_DEBUGON开启调试日志宏DOBBY_DEBUG/LOGGING_DEBUGNearBranchON启用近分支跳板单指令内跳转x86/x64 强制开启DynamicBinaryInstrumentON启用动态二进制插桩携带寄存器上下文的指令级 hookFullFloatingPointRegisterPackOFF打包保存全部浮点寄存器开启后 ARM64 才能访问 q8–q31Plugin.SymbolResolverON符号解析插件Plugin.GlobalOffsetTableHookONGOT hook 插件当前仅在 Darwin 平台编译Plugin.LinkerLoadCallbackOFF镜像加载回调插件Plugin.Android.BionicLinkerRestrictionOFFAndroid bionic 链接器命名空间限制绕过仅 Android 可用Plugin.ApplicationEventMonitorOFF自动监控 linker、文件等事件的示例插件集EnableObfuscationOFF启用 LLVM 混淆builtin-plugin/ApplicationEventMonitor目录下的多个监控器是官方提供的“插件写法范例”dynamic_loader_monitor.cc 通过DobbySymbolResolver(NULL, __loader_dlopen)与DobbyHook监控 dlopen/dlsym/dlcloseposix_file_descriptor_operation_monitor.cc 监控 open/read/write/close 等 POSIX 文件描述符操作memory_operation_instrument.cc 演示对 mmap/free 做DobbyInstrument插桩。iOS 侧另有 MGCopyAnswerMonitor.cc对libMobileGestalt.dylib的MGCopyAnswer插桩与 objc_runtime_hook.mmObjective-C 运行时 hook 工具。Android 链接器限制插件 bionic_linker_restriction.cc 则展示了更进阶的用法解析__loader_dlopen后 hook 它再调用linker_disable_namespace_restriction()解除 bionic 的 namespace 访问限制使dlopen可以加载任意库详见 get-started-android.md。构建指南桌面端、iOS、Androidbuild-documentation.md 给出了全平台构建流程仓库根 CMakeLists 要求 CMake ≥ 3.5、C/C11。构建本机版本cd Dobby mkdir build_for_host cd build_for_host cmake .. make -j4构建 iOSarm64部署目标 9.3cmake .. -DCMAKE_SYSTEM_NAMEiOS -DCMAKE_OSX_ARCHITECTURESarm64 -DCMAKE_SYSTEM_PROCESSORarm64 -DCMAKE_OSX_DEPLOYMENT_TARGET9.3 make -j4如需 Xcode 工程将cmake ..替换为cmake -G Xcode即可生成DobbyX.frameworkCMakeLists 中通过FRAMEWORK TRUE将 Darwin 目标配置为 FrameworkPUBLIC_HEADER include/dobby.h。构建 AndroidNDK clangexport ANDROID_NDK/path/to/ndk-bundle # arm64-v8aAPI 21 cmake .. \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_SYSTEM_NAMEAndroid -DCMAKE_ANDROID_ARCH_ABIarm64-v8a \ -DCMAKE_ANDROID_NDK$ANDROID_NDK -DCMAKE_SYSTEM_VERSION21 \ -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSIONclang # armeabi-v7aAPI 16 cmake .. \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_SYSTEM_NAMEAndroid -DCMAKE_ANDROID_ARCH_ABIarmeabi-v7a \ -DCMAKE_ANDROID_NDK$ANDROID_NDK -DCMAKE_SYSTEM_VERSION16 \ -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSIONclang非 Debug 构建会自动启用裁剪Android 下加-ffunction-sections -fdata-sections与--gc-sections --exclude-libs,ALLClang 下加-fno-rtti -fvisibilityhidden仅导出少量白名单符号见 CMakeLists 中 Darwin/Windows 的-exported_symbol//export列表这正是“最小化、模块化”在产物层面的体现。集成进 Android Studio 工程get-started-android.md与 build 文档给出了同一套 CMake 集成模板通过add_subdirectory把 Dobby 编入主工程并借助TARGET_PROPERTY:dobby,INCLUDE_DIRECTORIES自动传播头文件路径if(NOT TARGET dobby) set(DOBBY_DIR /path/to/Dobby) macro(SET_OPTION option value) set(${option} ${value} CACHE INTERNAL FORCE) endmacro() SET_OPTION(DOBBY_DEBUG OFF) SET_OPTION(DOBBY_GENERATE_SHARED OFF) add_subdirectory(${DOBBY_DIR} dobby) get_property(DOBBY_INCLUDE_DIRECTORIES TARGET dobby PROPERTY INCLUDE_DIRECTORIES) include_directories( . ${DOBBY_INCLUDE_DIRECTORIES} $TARGET_PROPERTY:dobby,INCLUDE_DIRECTORIES ) endif() add_library(native-lib SHARED ${DOBBY_DIR}/example/android_common_api.cc native-lib.cpp)集成后即可在 native 代码中#include dobby.h使用全部公开 APIexample/android_common_api.cc 还提供了一份可直接复用的通用插桩回调common_handler按符号名打印调用日志并演示了对 ART 内部符号如_ZN3art11ClassLinker30ShouldUseInterpreterEntrypointEPNS_9ArtMethodEPKv、hiddenapi 判定等的监控写法与 BlackDex 脱壳场景高度同源。注意事项与最佳实践回调内禁止调用被 hook 的目标函数如文档所警示对malloc插桩后回调内调用printf内部 malloc会死循环替换场景中如需透传只能通过origin_call原始指针调用。浮点寄存器访问限制ARM64 默认只能访问 q0–q7需要访问 q8–q31 必须开启FullFloatingPointRegisterPack编译选项。架构差异x64 平台DobbyHook使用绝对间接跳转ARM/ARM64 默认使用b xxx近分支指令跨架构取参务必参考 dobby.h 中RegisterContext的字段布局。Hook 前确认目标地址符号解析失败返回 NULL时应做判空处理BlackDex 在 DexDump.cpp 中逐版本回退解析并在if (loadMethod)内再 hook是良好的防御性写法。产物裁剪发布版建议关闭DOBBY_DEBUG并利用各平台导出符号白名单机制控制 so/framework 的符号暴露。小结从 intro-board.md 提出的“轻量、多平台、多架构、无 STL、插件化”五项设计目标出发本文结合仓库源码逐一落地验证CMake 的架构/平台分派、五个公开 C API、三种 hook 模式示例、插件体系以及 Android/iOS/桌面构建流程均已覆盖。Dobby 在 BlackDex 中的真实用法DobbySymbolResolver解析 libart 符号 →_make_rwx改页权限 →DobbyHook替换LoadMethod也完整呈现了一条可复制的“符号定位 inline hook”实战路径可直接迁移到自己的脱壳、监控或逆向工程项目中。赞分享网络安全应用安全逆向工程移动开发【免费下载链接】BlackDexBlackDex is an Android unpack(dexdump) tool, it supports Android 5.0~12 and need not rely to any environment. BlackDex can run on any Android mobile phone or emulator, you can unpack APK File in several seconds.项目地址https://gitcode.com/gh_mirrors/bl/BlackDex点击查看免费下载相关推荐Dobby轻量级Hook框架跨平台函数拦截的终极指南Dobby轻量级Hook框架跨平台函数拦截的终极指南 Dobby是一款轻量级、跨平台、多架构的Hook框架能够帮助开发者在不同操作系统和硬件架构上实现高效的开发工具逆向工程Dobby钩子框架终极指南轻量级多平台Hook技术完全解析Dobby是一个轻量级、多平台、多架构的钩子框架为开发者提供了强大的函数拦截和代码修改能力。无论你是进行安全分析、性能监控还是逆向工程Dobby都能成为你的开发工具逆向工程Dobby Hook框架跨平台ARM64架构的终极解决方案Dobby Hook框架跨平台ARM64架构的终极解决方案 Dobby是一个轻量级、多平台、多架构的Hook框架专为现代软件开发需求而生。它支持Window开发工具逆向工程上一篇Modin 社区翻译指南如何为多语言文档贡献力量下一篇the-practical-linux-hardening-guide翻译进度多语言支持状态创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考