前言
最近拿到一个有趣的微信插件 自定义头像.dylib,群友发我让我了解一下看看。功能是可以本地修改任意好友的头像。但是安装后发现有防白嫖机制,非授权用户双击头像会弹出"德发提示",并且无论点什么都会导致微信闪退。这种强验证机制激起了我的兴趣,遂决定通过逆向分析去除这个限制。
一、 初步分析
1.1 现象观察
注入插件后,双击头像弹出 UIAlertController,标题为"德发❤️提示",内容为"支持正版..."。界面上有两个按钮:"复制微信号"和"我想白嫖"。点击任意按钮,微信立即Crash(闪退)。
1.2 字符串定位
将插件拖入 IDA Pro (或者使用 strings 命令),搜索弹窗上的关键字。
CFSTR("德发❤️提示")
CFSTR("支持正版,请联系微信 liu1602389262 获取授权。")
通过搜索这些字符串的引用,我们迅速定位到了弹窗逻辑所在的函数 sub_7858。
二、 逆向追踪
2.1 弹窗逻辑 (sub_7858)
分析 sub_7858 的伪代码(ObjC),可以看到它创建了一个 UIAlertController 并添加了两个 UIAlertAction。
// 伪代码片段
void sub_7858() {
v1 = [UIAlertController alertControllerWithTitle:@"德发❤️提示" message:@"..." ...];
// 按钮1:复制微信号
v2 = [UIAlertAction actionWithTitle:@"复制微信号" handler: ^(UIAlertAction *action){
[UIPasteboard generalPasteboard].string = @"liu1602389262";
exit(0); // <--- 关键点:直接退出应用
}];
// 按钮2:我想白嫖
v3 = [UIAlertAction actionWithTitle:@"我想白嫖" handler: ^(UIAlertAction *action){
exit(0); // <--- 关键点:直接退出应用
}];
[v1 addAction:v2];
[v1 addAction:v3];
// ...显示弹窗代码...
}
分析结论:作者设计了一个死局,一旦弹窗出现,就没有"取消"选项,点击任何按钮都会触发 exit(0) 导致闪退。
2.2 触发源追踪 (sub_5CBC -> sub_5CEC)
查看 sub_7858 的交叉引用(Xref),发现它被 sub_5CBC 调用。
而 sub_5CBC 的逻辑非常简单:
void sub_5CBC(id a1) {
if ( (sub_5CEC(a1) & 1) == 0 ) { // 核心判断
// 如果 sub_5CEC 返回 0 (false),则在主线程执行弹窗
dispatch_async(main_queue, &block_invoke_popup);
}
}
显然,sub_5CEC 就是关键的白名单验证函数。
2.3 白名单验证函数 (sub_5CEC)
进入 sub_5CEC (地址 0x5C68) 分析:
这个函数内部构建了一个巨大的 NSArray,里面包含了数百个 Base64 编码的字符串。代码会对这些字符串进行解码,然后与当前登录用户的 wxid 进行匹配 (containsObject:)。
- 匹配成功:返回
1 (True)。
- 匹配失败:返回
0 (False)。
三、 破解实战 (修改汇编)
既然找到了验证函数 sub_5CEC,最直接的破解方法就是修改它的汇编代码,让它永远返回 1 (True)。
3.1 目标地址
- 函数起始地址 (VM Address):
0x5C68
- 文件偏移 (File Offset):
0x25C68 (注意:实际修改文件时需转换地址)
3.2 原始汇编 (ARM64)
0x5C68: PACIBSP ; 签名指令 (7F 23 03 D5)
0x5C6C: STP X28, X27, [SP, #-0x60]! ; 保存寄存器 (FC 6F BA A9)
...
3.3 修改方案
我们需要将函数头直接修改为:
MOV W0, #1 ; 返回值设为 1 (True)
RET ; 直接返回
对应机器码 (Little Endian):
MOV W0, #1 -> 20 00 80 52
RET -> C0 03 5F D6
3.4 实施修改
使用 Hex Editor (如 010 Editor) 或自己写脚本修改:
- 打开
自定义头像.dylib。
- 跳转到偏移
0x25C68 (对应 IDA 中的 sub_5CEC)。
- 将原本的字节替换为:
20 00 80 52 C0 03 5F D6。
- 保存文件。
四、 彻底净化 (可选)
为了防止有漏网之鱼,或者存在多处检测,我们可以采取三重屏蔽策略:
- 修改验证函数 (
sub_5CEC):如上所述,强制返回 1。
- 修改触发函数 (
sub_5CBC):在入口处直接 RET,彻底切断弹窗调用的路径。
- 修改弹窗函数 (
sub_7858):在入口处直接 RET,让弹窗代码失效。
五、 总结
通过简单的字符串定位和交叉引用分析,我们找到了插件的验证逻辑。通过修改 ARM64 汇编指令,将条件判断改为永真,成功绕过了白名单限制。现在插件已经可以供任何人免费使用了。
这个插件本身技术原理是通过 Hook MMHeadImageView 和 MMUILongPressImageView 来实现本地图片替换,并未修改服务器数据,仅供本地娱乐。
com.liuf.zdytx_0.0.1_iphoneos-arm64.deb.zip
(19.59 KB, 下载次数: 22)
">练手插件在此下载:
本文仅供技术交流学习,请勿用于商业用途。