android微信照片,一张能让安卓版微信崩溃的图片

这两天,有一张 gif 图片在群里疯传,就是下面的这张:

79d5791698fd496d962d9e98e5dcc1c3.png

样本文件 md5:653b5f03a500b82a3949740d6aedc0f9

安卓版微信在加载这张图的过程中,会出现闪退,而且概率非常高,基本上每次都崩。

迷人的是,这张图只对安卓版微信有效,iOS/Windows/macOS 甚至网页版微信都可以正常显示,当然由于时间方面的原因,我们也没有对安卓版微信的每一个版本进行测试,大家在微信 7.0 上测试过了都会崩溃。

崩溃信息如下:

7abd4ceefcc2f3953908c3f55bdf09ef.png

崩溃地址在 libwechatcommon.so (Java_com_tencent_mm_plugin_gif_MMGIFJNI_drawFramePixels+124),也就是本地 GIF 库在画帧的像素的时候崩溃了。那我们到 libwechatcommon.so 里去看下这个 drawFramePixels 函数的 +124 处长什么样子:

fe715ff4e3e1db3ebfab50b24721d297.png

这里应该是个溢出,也可能是个 bug,但是没有源码,很难进一步分析,我们改变思路,看看能不能修好这个 gif。

既然是画 gif 的帧像素的过程中出现的 bug,那我们来看下这个帧,看看能不能找到“罪魁祸首”的那一帧。

打开 gif 的文件格式,可以看到有文件头、屏幕描述、颜色表、具体数据和文件尾。打开即可解析,说明文件格式还是很标准的,这也解释了为什么 iOS/Windows/macOS 和网页版都没问题的原因。

6ee73520624406ee61c58a3fb91bfdbd.png

接下来既然是 Frame 的问题,我们来看每一帧,帧的组合在 gif 文件格式中也非常规整,打开 struct DATA Data 就可以看到,每一帧的图形拓展、描述和数据都在里面。

cd7fe6acc103d630e17e5bdf4e43406b.png

最后观察到一个现象,就是根据微信崩溃的时机,是在图像的加载之初,说明很有可能在第一帧、第二帧就出现问题,我们观察前三帧的异同,发现第二帧的 ImageLeftPosition 有很大的嫌疑。

57667c6cd1fcac65fabb247bf6e1a8e7.png

8166 这个数字明显太大了,我们把它改成 0 之后,再发送出去,发现已经不会崩溃了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值