微信閃退王表情是最近微信群里流傳非常廣的一個閃退表情,這個動態(tài)表情會讓你的微信自動閃退,目前只針對ios系統(tǒng)用戶,安卓親測無效。如果你想跟群里的蘋果手機用戶開個玩笑可以試試這個表情,絕對讓對方摸不著頭腦。
閃退表情原理:
1. 樣本精簡
初始的GIF樣本有1MB之多,不利于定位引起問題的具體數(shù)據(jù),因此我們需要對樣本進(jìn)行精簡。通過010 Editor打開原始樣本GIF,利用GIF模板解析,發(fā)生解析異常,這就表示樣本GIF的格式存在問題。
從模板解析的情況顯示,在 38 幀正常的圖片數(shù)據(jù)后,出現(xiàn)了異常的數(shù)據(jù)。如圖所示,因此我們將正常數(shù)據(jù)部分移除,僅保留異常數(shù)據(jù),進(jìn)行下一步精簡。
可以看到,剩余的異常數(shù)據(jù)的部分有 10 多萬個,通過二分法的方式進(jìn)行測試和排除。具體就是,刪除一半后,測試另外一半是否可以導(dǎo)致崩潰。如果崩潰了,說明引起異常的數(shù)據(jù)在保留的一半中,反之則說明在刪除的部分中。
經(jīng)過不斷的排除后,發(fā)現(xiàn)異常的數(shù)據(jù)就在下圖的紫色部分中。只要帶有GIF的圖像數(shù)據(jù)部分帶有這些異常數(shù)據(jù),就會導(dǎo)致iOS微信閃退。
2. 調(diào)試分析
經(jīng)過樣本精簡,我們已經(jīng)發(fā)現(xiàn)了引起異常的數(shù)據(jù)位置。那么,現(xiàn)在就需要結(jié)合實際的調(diào)試,來確定實際引起異常的數(shù)據(jù)。以iOS微信6.5. 7 版為例,崩潰發(fā)生時的調(diào)用棧如下,崩潰發(fā)生于微信內(nèi)部,說明是微信自身的GIF解析功能存在問題。
經(jīng)過對相關(guān)函數(shù)的逆向分析,最終確定了引起異常的數(shù)據(jù)。首先來觀察sub_100B6CBF0 這個函數(shù),對于GIF中的數(shù)據(jù)進(jìn)行循環(huán)查找,如果存在0x21 和0xF9,那么當(dāng)前數(shù)據(jù)就表示是一個GraphicControlExtension結(jié)構(gòu),并接著對GraphicControlExtension數(shù)據(jù)進(jìn)行解析。
如果當(dāng)前查找到的數(shù)據(jù)為0x2C,就表示搜索到了一個ImageDescriptor,跳出while循環(huán),進(jìn)行實際圖片數(shù)據(jù)的解析。這里也就是異常數(shù)據(jù)的起始位置!
正常的幀數(shù)據(jù)的ImageDescriptor數(shù)據(jù)如下:
而引起異常的數(shù)據(jù)中,恰好存在0x2C這個關(guān)鍵的分隔符,導(dǎo)致下述紅框中的數(shù)據(jù)被解析成了一個ImageDescriptor?梢钥吹,ImageWidth屬性為0,ImageHeight屬性為0x100。
接下來,這部分異常的數(shù)據(jù)就會進(jìn)入sub_100B6CE90 函數(shù)進(jìn)行解析。由于ImageWidth為0,導(dǎo)致與ImageHeight相乘后等于0,在new buffer時,傳入的大小參數(shù)為0,這是第一個問題,但這并不會導(dǎo)致閃退,仍然可以分配一個很小的堆塊。
引起崩潰的代碼如下,在else block中,sub_100B6C4F0 的作用沒有具體跟蹤,猜測是進(jìn)行l(wèi)zw解壓縮,并返回解壓縮后的數(shù)據(jù)長度v21。由于v10 = 0x0000010000000000,截斷成unsigned int后為0,這就導(dǎo)致 v10 – 1 – v21 為負(fù)數(shù),作為memset第三個參數(shù),相應(yīng)的unsigned int形式就是一個很大的正數(shù)。在memset時,就會導(dǎo)致崩潰,這是第二個問題。
微信閃退表情怎么解決:
1.目前GIF圖片里插入代碼從技術(shù)上并非完全不可能,所以可能是有人把會導(dǎo)致ios系統(tǒng)崩潰的代碼寫入GIF圖里導(dǎo)致微信閃退。
2.通過動圖的特質(zhì)讓某一個像素點或者分辨率讓iphone識別不出來,導(dǎo)致內(nèi)存溢出,讓微信閃退。
其實即使真的遇到類似這種搞騷擾攻擊的人也不必太擔(dān)心,一般人有兩種做法。
1.先斷網(wǎng),不要點擊進(jìn)入群組聊天界面,直接左滑或長按對話刪除當(dāng)前群組的聊天記錄或者憑借多年的手速進(jìn)入聊天界面點擊右上角退出群聊。
2.登陸電腦端微信,優(yōu)雅的退群。