ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WeChatICU-ForMac源码解析(一):insert_dylib动态库注入三步曲逐行讲解

WeChatICU-ForMac源码解析(一):insert_dylib动态库注入三步曲逐行讲解 WeChatICU-ForMac源码解析一insert_dylib动态库注入三步曲逐行讲解【免费下载链接】WeChatICU-ForMacMac版企业微信消息防撤回, 聊天会话去水印项目地址: https://gitcode.com/gh_mirrors/we/WeChatICU-ForMacWeChatICU-ForMac 是一款 Mac 版企业微信增强小助手主打消息防撤回与聊天会话去水印。它能做到的核心是一项朴素却硬核的逆向技术——insert_dylib 动态库注入在不改动企业微信一行源码的前提下把自己的功能库寄生进官方 App。本文逐行拆解安装脚本把这套注入的三步曲彻底讲透。动态库注入为什么非它不可企业微信是闭源 App我们改不了它的源码。但 macOS 的 Mach-O 可执行文件里有一张加载清单Load Commands其中LC_LOAD_DYLIB就是一条启动时加载某动态库的指令。只要往这份清单里塞进一条指向WeChatICU.framework的指令系统在启动企业微信时就会自动加载我们的库库里的钩子Hook随之生效——这正是逆向工程里经典的动态库注入。而负责往清单里塞指令的就是 insert_dylib 这个预先编译好的小工具。三步曲总览安装脚本 install.sh 的逻辑非常简洁可概括为三步第一步权限与路径准备—— 确认企业微信已安装拿到可写权限第二步部署动态库—— 把WeChatICU.framework拷进 App 的 MacOS 目录第三步insert_dylib 注入—— 备份原始二进制再用insert_dylib重写 Mach-O 加载清单。下面逐步拆解。第一步权限与路径准备先声明所有关键路径install.sh#L3-L9APP_NAME企业微信 FRAMEWORK_NAMEWeChatICU APP_BUNDLE_PATH/Applications/${APP_NAME}.app/Contents/MacOS APP_EXECUTABLE_PATH${APP_BUNDLE_PATH}/${APP_NAME} APP_EXECUTABLE_BACKUP_PATH${APP_EXECUTABLE_PATH}_backup FRAMEWORK_PATH${APP_BUNDLE_PATH}/${FRAMEWORK_NAME}.framework接着做两道安全检查install.sh#L12-L20if test ! -f ${APP_EXECUTABLE_PATH}; then echo 请检查是否安装 ${APP_NAME} exit 1 fi if test ! -w ${APP_BUNDLE_PATH}; then echo -e \n\n请输入密码 sudo chown -R $(whoami) ${APP_BUNDLE_PATH} fi第一道门槛是App 在不在第二道是能不能写。/Applications下的目录默认不可写脚本用sudo chown把所有权临时转给当前用户为后面改写二进制铺路。 这一步是整个注入能否成功的地基。第二步部署动态库光有加载指令还不够——磁盘上得真有一个WeChatICU.framework等着被加载。这一步把编译产物从Rely目录拷进 App 内部install.sh#L33cp -R ${BUILD_OUTPUT_PATH}/${FRAMEWORK_NAME}.framework ${FRAMEWORK_PATH}拷贝完成后App 目录里多出一个WeChatICU.framework它就是第三步要点名加载的目标。第三步insert_dylib 逐行拆解这是全文最关键的两行install.sh#L34-L35cp ${APP_EXECUTABLE_PATH} ${APP_EXECUTABLE_BACKUP_PATH} ./insert_dylib ${FRAMEWORK_PATH}/${FRAMEWORK_NAME} ${APP_EXECUTABLE_BACKUP_PATH} ${APP_EXECUTABLE_PATH} --all-yes第 34 行先备份原始可执行文件为企业微信_backup保证随时可回滚第 35 行调用insert_dylib其参数顺序是dylib 输入 输出WeChatICU.framework/WeChatICU—— 要注入的动态库路径相对主程序企业微信_backup——输入从备份里读取原始二进制企业微信——输出把改写后的二进制写回正式路径。这个先备份、再读备份、写回原路径的设计非常聪明无论运行多少次都以干净的原始文件做输入绝不叠加污染。而--all-yes用于跳过工具的所有交互确认适合脚本一键执行。insert_dylib 到底改了什么它在 Mach-O 头部的 Load Commands 区域追加了一条LC_LOAD_DYLIB并同步更新LC_COUNT与sizeofcmds字段。从此系统动态加载器 dyld 启动企业微信时会顺着这条指令把WeChatICU.framework拉进内存。注入如何生效一个构造函数搞定库被加载后如何启动功能答案藏在框架入口 main.mstatic void __attribute__((constructor)) initialize(void) { [NSObject hook]; }__attribute__((constructor))是 C 语言的特性dyld 加载完库会自动执行这个函数无需任何人调用。它随即触发 NSObjectICUHook.m 里的一系列方法交换Swizzle把判断消息是否被撤回会话是否带水印等逻辑接管过来实现防撤回与去水印。卸载注入的可逆性正因为第一步做了备份卸载脚本 uninstall.sh 只需删掉 framework、把_backup还原回原路径即可一步回退、干净利落。小结insert_dylib 的本质是改写 Mach-O 的LC_LOAD_DYLIB加载清单三步曲权限准备 → 部署动态库 → 注入二进制备份机制让整个注入过程可逆、可重复执行。看懂了注入就拿到了 WeChatICU 的第一把钥匙下一篇我们将深入 ObjC Runtime看 Hook 是如何把防撤回、去水印真正落地的。【免费下载链接】WeChatICU-ForMacMac版企业微信消息防撤回, 聊天会话去水印项目地址: https://gitcode.com/gh_mirrors/we/WeChatICU-ForMac创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表