为什么Android QQ打开这张图片会闪退?

论坛 期权论坛 study     
匿名的用户   2019-6-10 01:17   9199   5

--------------------------------------------------------------------------------------------------------------------------------------------
本人亲自测试后发现@Moe Lance  说的很对,用社区安卓端查看大图,社区安卓端也崩溃了!!
分享到 :
0 人收藏

5 个回复

倒序浏览
2#
热心的回应  16级独孤 | 2019-6-10 01:18:00 发帖IP地址来自
=========================
【本人未测试】图片Exif漏洞修复补丁 1.0:最近网上传播一些莫名其妙的图片,像QQ和微博的一些应用点击预览后会直接闪退,这个叫Exif fix的Xposed模块就是用来修复这个bug的,小编是没遇到过啦,但未雨绸缪总是好的。 分享自@酷市场 http://www.coolapk.com/apk/com.flarejune.exiffix
=========================
说明几个问题:1.导致安卓应用程序崩溃的照片全部是经QQ压缩之后的,所以原图并不会崩溃2.6.3.3测试版QQ只是在压缩时屏蔽新照片的属性,所以存在在聊天记录中的图片依旧会导致crash,而且这些旧图片会被屏蔽3.删除了提供的图片,请多多为他人着想~==========================
建议使用root explorer来删除问题图片==========================图库闪退的一般解决办法:清除APP缓存、清除APP数据、删除/sdcard/DCIM/.thumbnails文件夹二般解决办法:双清、刷机==========================
让本萌来详细讲述一下这件事情的经过。【多图预警】4月14日晚七点半,河南绿军拖泥带水更新了当日谷歌为6儿子推送的N的更新之后在绿军群里发了一张图片。
之后群里所有的安卓QQ打开群之后全部崩溃。

然后拔娜娜赶紧刷屏,把图片刷上去


并表示他的小水果没事

烧杯君表示他的水果也没事

大伙纷纷表示要把托尼踢出群示众


而且打起了坏心思- -
【我是图】
=======================================================
好了正片来了,大佬们开始动用资源联系了腾讯。




第二天早晨七点半的时候据消息腾讯那边已经开始着手处理这个bug了,鸡汁的我也试着抓了log

而且都很快发现了问题

将发生crash的图片保存到本地时,部分看图软件依旧crash,而且对图片进行复制或者移动时,系统也发生了crash


腾讯工作人员经过一天的排查,得出了发生crash的原因
Android N最新版拍摄照片调用系统接口写入属性时一个设置有误,app读取图片时会发生crash
并及时推出了Android QQ 6.3.3测试版

这次版本更新主要就是针对这个问题,但目前的解决方案是AndroidN的用户发送照片时经QQ压缩时QQ会删去这个属性,所以之前导致崩溃的图片,现在再次加载依旧会崩溃,而新发送的经压缩后的图片就不会再导致crash。


==============================================================
附上一张导致crash的图片和新版的QQ:链接: http://pan.baidu.com/s/1gfpXjn9 密码: 3km3
下载之前请先查看评论区确认是否需要作死
3#
热心的回应  16级独孤 | 2019-6-10 01:18:01 发帖IP地址来自
=========04/19晚上更新了关于自制 bug 图的尝试=========

其他答主把 bug 最初产生的原因说的很完整了。至于Android M及以下的系统中崩溃的原因,考虑到是 SIGBUS ,可能是非对齐的内存访问,于是试着改了一下:
(external/jhead)
https://gist.github.com/updateing/2b58ebd4a8c75780443f28f514e9bb39
  1. diff --git a/exif.c b/exif.cindex 8dfdaf1..fa9fd99 100644--- a/exif.c+++ b/exif.c@@ -453,7 +453,7 @@ double ConvertAnyFormat(void * ValuePtr, int Format)          // Not sure if this is correct (never seen float used in Exif format)         case FMT_SINGLE:    Value = (double)*(float *)ValuePtr;      break;-        case FMT_DOUBLE:    Value = *(double *)ValuePtr;             break;+        case FMT_DOUBLE:    memcpy(&Value, ValuePtr, sizeof(double));break;          default:             ErrNonfatal("Illegal format code %d",Format,0);
复制代码
应用之后无法复现此bug了:






测试机型是OnePlus One,CM13.0-20160408-NIGHTLY

不知道其他格式的转换有没有问题,反正关于这类图的问题无法复现,就这样好了[doge]

新人第一答,求轻拍啊~

================================

更新一发自制这类图的尝试:
这是EXIF规范的一点微小的解释(人家真的是这么说的)
http://www.media.mit.edu/pia/Research/deepview/exif.html

这是一张正常的图


这是它的文件头


(偷个懒)据说是曝光时间的锅?那么来改了试试:
  • 曝光时间的 Tag 是0x829a,这个文件的EXIF信息指示字节序是 Motorola 风格(大端),于是这个 Tag 在文件中的表现就是0x829a
  • 搜索到这个 Tag
    1. 82 9A 00 05 00 00 00 01 00 00 01 C6
    复制代码
  • 本来的类型是0x5(比值),改成0xc(双精度浮点)
  • 保存,传到手机上

这是修改后的图,大家可以试试看有没有问题……(我这里社区客户端点大图就挂了)


注意:上面的过程中没有验算是否出现了对齐问题,因为基础地址会在哪里并不能提前得知……所以这张图能复现bug也许是个巧合

注意2:如果要实现在QQ里崩溃的效果,需要想办法避免二压。这里大家就自己开脑洞吧~

貌似并不是所有人点大图都会出问题,比如部分华为(基于 Android 6.0 的版本)和三星的设备。不清楚是不是它们的固件里已经打了针对此问题的补丁。基于 AOSP 的第三方固件几乎全军覆没……

如果存了 bug 图导致相册打不开,可以参照其他答案的方法来删除有问题的图片。比如 Root Explorer、终端模拟器、adb shell。


4#
热心的回应  16级独孤 | 2019-6-10 01:18:02 发帖IP地址来自
这个崩溃根本就不管qq的事,你们也看到了,有很多其他应用也会崩溃!这是android的共享库libjhead.so在解析exif的一个属性时出的错,出错的指令叫vldr,这个指令要求操作的指针要4字节对齐,出错的指针由基地址加上属性所对应的值而来,基地址是4字节对齐的,但那个属性所对应的值并不是4的倍数。这就导致vldr指令出错,造成了sigbus。关于sigbus基本不可利用,也有观点认为,编译器在汇编的时候应该增加对vldr,sltr这类指令的检验代码。。。
5#
热心的回应  16级独孤 | 2019-6-10 01:18:03 发帖IP地址来自
这张图片是QQ二压后的图,所有用安卓系统图片控件做的软件都会受到影响,比如系统图库闪退之类的,QQ、微信也都会闪退。
有些人觉得这段是被人人为修改了,其实你随便打开一个QQ传输过的图片,就可以看出,这段是QQ二压的标记,也就是QQ检测到二压之后的照片,就不会再去压缩,所以你去直接发这张图,QQ是不会压缩的,于是这个图片会被原封不动发出去。
至于猜测该图片里面有代码什么的,目前不能肯定,我推测是QQ二压算法正好算到了一个会让安卓图片控件崩溃的图,造成巧合,当然也不排除高手发现了安卓的图片控件BUG,但是我觉得后者几率比较小,如果是高手炫耀,不会去选择这么一张图,甚至我们可以看到照片的信息是用nexus拍摄的,所以我认为,这个是QQ二压造成的巧合。
另外,这个是安卓控件的BUG,应当由谷歌进行修补,具体细节尚不明了,JPG本身就是一种需要“解压”的图片格式,很有可能是安卓处理这类图片没有周到,导致内存溢出之类的问题。
继续关注
=====================================
4-17补充:
楼下照片的拍摄者 @孟英杰 童鞋已经出现了,该图片确实没有经过人为处理,而且和QQ工程师聊天确认是QQ二压算法的问题,同时楼下的童鞋们放出的crash报告可以看出,安卓系统控件不能正确处理这种“问题”图片,所以这个问题确实是安卓和QQ共同的锅,嘿嘿,看来推断没有问题,QQ6.3.3经测试还是没有修复这个问题。
但是目前我发现该图片原图发送到群内,会被腾讯的服务器过滤掉,已经发不出去了,单独聊天还可以发出,但是,将该图保存后,用16进制编辑器随意修改一个字节后还可以正常发出,想要从根源解决问题,还是需要推出系统补丁,这件事我觉得安卓系统的锅更大一些,因为在其他平台,至今还没有看图就能导致应用崩溃的情况出现,应该属于设计疏忽了。
6#
热心的回应  16级独孤 | 2019-6-10 01:18:04 发帖IP地址来自
原因:
7.0 第二次推送的预览版的bug,锅是谷歌的。
调用系统API拍摄照片属性里曝光时间(快门速度)有误,导致照片写入了错误值。
再读取时调用到这个属性的时候GG..
PS:这是手机QQ的工程师们查出的原因,我只是不负责任的胡乱抄了下。
PS2:照片真是楼里某位孟同学照的并且多次导致本地一ingress玩家群受害。
PS3:别传了…下个QQ版本就修复了。
……
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:32080
帖子:6440
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP