今晚不少群和朋友圈都在转发一个二维码,只要点开客户端就会闪退。
除 Windows 客户端外无一幸免——iOS 和 macOS 还有 Android 都崩。点开即中。这里就不截取完整的图片了。
iPhone 可以直接在系统设置里调取 ips 崩溃日志,然后 AirDrop 到电脑分析;或者打开开发者模式之后直接 Xcode 拉取。
在 macOS 上也复现了,可以直接上调试器。
确实是解码二维码的时候出错,崩在 std::basic_string 的字符串拼接方法。传入了一个空指针。
本来想快速分析一下,反编译一看发现这几个函数还挺大。直接关掉了。
在桌面端暂时可以用调试器“热补丁”一下。先 lldb 挂上 WeChat 进程,点开有问题的二维码,挂在 memmove 上。直接改一下参数就好了。
用 lldb print 动态生成一个空字符串
(lldb) print (char *)""
(char *) $0 = 0x00000001179000d0 ""
然后把 x1 寄存器改成空字符串的地址,x2 改成 0
(lldb) reg write x1 0x00000001179000d0
(lldb) reg write x2 0
(lldb) c
Process 93910 resuming
我用的是 M1,和 Intel 的寄存器不一样,这里默认读者都知道。
暂时消停了,也可以把样本提取出来了。
试了一下微信调用摄像头扫描,不必想,当然也是闪退。试试其他 app:
iOS 版 QQ 闪退,看来有可能用了同一个库。
系统相机在码旁边瞄出一个边,但不能识别内容
其他购物、支付类 app 均不识别
这张二维码确实有问题。
直接上传 zxing 的网页版(https://zxing.org/w/decode.jspx),提示未识别到二维码:
随手找了一个 nodejs 的二维码识别库,输出结果和微信识别的一样。
1256196,1256197,1256198,1256199
但是把这一串字符串重新生成一个二维码,连定位点的尺寸都大相径庭。
没有人肉解码调试二维码的能力,文章就先水到这里。大家晚安。