微信閃退gif表情包,在各個(gè)微信群中流傳著一個(gè)天線寶寶的GIF表情。在iOS版的微信上,只要打開了包含這個(gè)GIF表情的聊天窗口,就會(huì)造成微信閃退。

微信閃退背景情況
5月17日起,在各個(gè)微信群中流傳著一個(gè)天線寶寶的GIF表情。在iOS版的微信上,只要打開了包含這個(gè)GIF表情的聊天窗口,就會(huì)造成微信閃退。
在進(jìn)行具體分析之前,對(duì)崩潰原因進(jìn)行了猜測(cè):(1)iOS系統(tǒng)自帶GIF解析功能存在問(wèn)題;(2)微信自己實(shí)現(xiàn)GIF解析的功能,由于對(duì)輸入數(shù)據(jù)的校驗(yàn)不嚴(yán)格,導(dǎo)致異常。
經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)iOS版QQ不受影響,因此可以排除iOS的GIF解析問(wèn)題。
微信閃退原因分析
1、樣本精簡(jiǎn)
初始的GIF樣本有1MB之多,不利于定位引起問(wèn)題的具體數(shù)據(jù),因此我們需要對(duì)樣本進(jìn)行精簡(jiǎn)。通過(guò)010 Editor打開原始樣本GIF,利用GIF模板解析,發(fā)生解析異常,這就表示樣本GIF的格式存在問(wèn)題。
從模板解析的情況顯示,在38幀正常的圖片數(shù)據(jù)后,出現(xiàn)了異常的數(shù)據(jù)。如圖所示,因此我們將正常數(shù)據(jù)部分移除,僅保留異常數(shù)據(jù),進(jìn)行下一步精簡(jiǎn)。

可以看到,剩余的異常數(shù)據(jù)的部分有10多萬(wàn)個(gè),通過(guò)二分法的方式進(jìn)行測(cè)試和排除。具體就是,刪除一半后,測(cè)試另外一半是否可以導(dǎo)致崩潰。
如果崩潰了,說(shuō)明引起異常的數(shù)據(jù)在保留的一半中,反之則說(shuō)明在刪除的部分中。

經(jīng)過(guò)不斷的排除后,發(fā)現(xiàn)異常的數(shù)據(jù)就在下圖的紫色部分中。只要帶有GIF的圖像數(shù)據(jù)部分帶有這些異常數(shù)據(jù),就會(huì)導(dǎo)致iOS微信閃退。

2、調(diào)試分析
經(jīng)過(guò)樣本精簡(jiǎn),我們已經(jīng)發(fā)現(xiàn)了引起異常的數(shù)據(jù)位置。那么,現(xiàn)在就需要結(jié)合實(shí)際的調(diào)試,來(lái)確定實(shí)際引起異常的數(shù)據(jù)。
以iOS微信6.5.7版為例,崩潰發(fā)生時(shí)的調(diào)用棧如下,崩潰發(fā)生于微信內(nèi)部,說(shuō)明是微信自身的GIF解析功能存在問(wèn)題。

經(jīng)過(guò)對(duì)相關(guān)函數(shù)的逆向分析,最終確定了引起異常的數(shù)據(jù)。首先來(lái)觀察sub_100B6CBF0這個(gè)函數(shù),對(duì)于GIF中的數(shù)據(jù)進(jìn)行循環(huán)查找,如果存在0x21和0xF9,那么當(dāng)前數(shù)據(jù)就表示是一個(gè)GraphicControlExtension結(jié)構(gòu),并接著對(duì)GraphicControlExtension數(shù)據(jù)進(jìn)行解析。


如果當(dāng)前查找到的數(shù)據(jù)為0x2C,就表示搜索到了一個(gè)ImageDescriptor,跳出while循環(huán),進(jìn)行實(shí)際圖片數(shù)據(jù)的解析。這里也就是異常數(shù)據(jù)的起始位置!

正常的幀數(shù)據(jù)的ImageDescriptor數(shù)據(jù)如下:

而引起異常的數(shù)據(jù)中,恰好存在0x2C這個(gè)關(guān)鍵的分隔符,導(dǎo)致下述紅框中的數(shù)據(jù)被解析成了一個(gè)ImageDescriptor。可以看到,ImageWidth屬性為0,ImageHeight屬性為0x100。


接下來(lái),這部分異常的數(shù)據(jù)就會(huì)進(jìn)入sub_100B6CE90函數(shù)進(jìn)行解析。由于ImageWidth為0,導(dǎo)致與ImageHeight相乘后等于0,在new buffer時(shí),傳入的大小參數(shù)為0,這是第一個(gè)問(wèn)題,但這并不會(huì)導(dǎo)致閃退,仍然可以分配一個(gè)很小的堆塊。

引起崩潰的代碼如下,在else block中,sub_100B6C4F0的作用沒有具體跟蹤,猜測(cè)是進(jìn)行l(wèi)zw解壓縮,并返回解壓縮后的數(shù)據(jù)長(zhǎng)度v21。
由于v10 = 0x0000010000000000,截?cái)喑蓇nsigned int后為0,這就導(dǎo)致 v10 – 1 – v21 為負(fù)數(shù),作為memset第三個(gè)參數(shù),相應(yīng)的unsigned int形式就是一個(gè)很大的正數(shù)。在memset時(shí),就會(huì)導(dǎo)致崩潰,這是第二個(gè)問(wèn)題。

- PC官方版
- 安卓官方手機(jī)版
- IOS官方手機(jī)版














站崗小狗表情包圖片gif免費(fèi)下載
小袋鼠仰頭伸懶腰表情包gif免費(fèi)下載
蘋果微軟新emoji表情包7.16免費(fèi)
我的錢雖然不是大風(fēng)刮來(lái)表情包無(wú)水印版
lol英雄聯(lián)盟T鍵表情包高清png合集版
開心果等級(jí)劃分表情包抖音版
做出了一個(gè)違背祖宗的決定表情包抖音版
后撤步77777原版高清版下載無(wú)水印版
后撤步77777表情包原版抖音版
沒病走兩步動(dòng)態(tài)表情包圖片gif搞笑版
剛才誰(shuí)不回你消息表情包圖片亮劍無(wú)水印動(dòng)圖版
青3創(chuàng)4表情包無(wú)水印版1.0免費(fèi)版
大年初八上班圖片2021祝福語(yǔ)
2021年初二拜年圖片朋友圈
2021超喜慶的萌娃拜年動(dòng)態(tài)圖動(dòng)態(tài)圖
老公新年快樂紅包拿來(lái)表情包圖片大全無(wú)水印版
你還在集五福呢哪年不是幾塊錢表情包袁華gif版
2021集福搞笑朋友圈說(shuō)說(shuō)圖片無(wú)水印版
你把我炸黑了賠錢表情包GIF抖音版
一年里我最喜歡二月了我只用窮28天表情包無(wú)水印版
我被你炸倒了不賠錢不起來(lái)表情包抖音可愛版
2021今年一定暴富熊貓頭表情包gif無(wú)水印版
2021考研上岸表情包最新版
2021元宵專屬表情包圖片無(wú)水印版
2021拜年要紅包表情包圖片抖音版
2021春晚動(dòng)態(tài)表情包gif甄子丹吳京無(wú)水印免費(fèi)
奪筍吶郭老師表情包高清動(dòng)圖版
放假在家的狀態(tài)圖片表情包高清版
直說(shuō)吧我們是走流程還是直接在一起動(dòng)態(tài)圖高清版無(wú)水印版
tmd煩死了都表情包圖片大全無(wú)水印版
熊貓頭集福表情包圖片高清版





我不管我還小我要過(guò)六一兒童節(jié)表情圖片無(wú)水
心疼元凌被碰瓷表情包最新無(wú)水印
雙十一到了表情包可愛版
馬天宇胡歌表情包1.0 最新版
貓喊老公表情圖片最新無(wú)水印版
母親節(jié)表白媽媽表情包無(wú)水印版
皮皮蝦造反了圖片表情包高清無(wú)水印版
海南摩的大叔表情包圖片免費(fèi)下載
反秀恩愛表情包高清無(wú)水印版
謝曉飛表情圖片高清動(dòng)圖無(wú)水印版