Android QQ 7.6.0~7.6.3 表情骂人BUG 的分析

5月27日晚,微博上看到些QQ 上发送[菜刀]+数字+[表情]就会被转为骂人的话,28日中午就分析完了,但一直懒得发出来,今天补上。吐槽一下知乎上的某些沙雕分析文(小声 bb)

一、demo

演示视频挺多的,这没什么好被和谐的,随便贴两个视频链接吧

https://weibo.com/tv/v/GiE0hBfQe?fid=1034:2bd3171c50e53c24e1bcd6669c610e31

https://weibo.com/tv/v/GiDDnbtYD?fid=1034:4ff5a3565d2ee8b3cead9daca06a8902

是不是很刺激?第一反应是某开发不高兴,在里面内嵌了脏话,或者是测试时候用脏话测试的,忘了删掉了。

二、分析

1、先下载最新版的 QQ,确认一下情况,确实存在这种现象,先判断一下是本地还是远程的吧,幸运的是在本地配置的,在 classes2.dex 里搜到了硬编码的脏话,而且是一个脏话数组。(过于恶心的我就打码了)

本地试了一下,以2个testcase 为例, [菜刀]+"1"+[] 被翻译为死胖子, [菜刀]+" "+[] 被翻译为 [跳舞]AmN you 。

2、硬编码位于 com.tencent.mobileqq.lovelanguage.LoveLanguageConfig ,附近还有 LoveLanguageManager 。

dirtyList  的引用地方不多,分别是以下几处
a. String LoveLanguageConfig.convertCase(String) ,将前6个char改变大小写,这也是为什么”damn you”被转为了”[跳舞]AmN you” 的一个原因
b. boolean LoveLanguageConfig.isValidIndex(char) ,看是否下标越界
c. String LoveLanguageManager.AAA(String)  似乎是判断是否收到骂人的话,是的话就本地和谐掉,换成友好的表情
d. int LoveLanguageManager.BBB(EditText)  似乎是判断是否发出骂人的话,是的话就本地和谐掉,换成友好的表情
e.  void LoveLanguageManager.CCC(EditText)  判断是否输入0x11,a,b,c,是的话就替换为脏话

这里有两个对 char 的运算

既然 dirtyList 是数组,那么肯定是有对应关系的,这两个方法很可能与它有关,因为输入 [菜刀]+"1"+[] 被翻译为死胖子, [菜刀]+" "+[] 被翻译为 [跳舞]AmN you 。而 "1"-" " 是 17 ,死胖子和 damn you 的间隔也是 17,稍微猜一下就是线性的。

" " - (char)30 =2 , "damn you" 的index也是2,所以这个运算就是将 char 和 dirtyWord 对应起来。

3、LoveLanguageManager

这里面 Log 有很多,有两句给了我们提醒, handleLoveLanguageConvert  和 handleLoveLanguageRevert ,似乎是转化之间的关系。

按顺序看吧,【其实我当时没看到后面那个方法】

这段代码,安排明白了吧?看中间那段拿到输入框内容以后的逻辑,扫描一下,扫到 '\x11' + charA + charB + charC  这种格式的,调用 LoveLanguageConfig 的函数,进行转化后替换掉原来的文本,之后发出去。

绝大部分情况下,用户肯定不会输入 \x11 这个字符,所以猜测是[菜刀]表情编码中带有 \x11,然后拼接了后面的几个任意的 char,就会被替换成脏话。【后来发现菜刀确实是 \x14\x11组成的】

记住这个函数啊,叫 int a(EditText) ,附近还有个函数叫 void a(EditText) ,后面这个函数是将脏话替换为表情的。

验证一下猜想,输入 [菜刀]+"111" ,触发;输入 [菜刀]+1234567 ,发现123消失了。

所以,我觉得是手滑把这两个函数写反了,毕竟参数一样,返回值可有可无这种。

4、上 xposed

我们输入:[菜刀]1[心]的时候
输入输出的Log:

 

我们输入:[菜刀]123的时候

 

我们输入:[菜刀]空格[心]的时候

 

5、[菜刀]表情包含2个 char,是 \x14\x11 ,既然如此,这里又有一个细节,其实转化为脏话以后,第一个 char 还是保留着的,当它与字母拼接时,是可以组合成 QQ 快捷表情发出去的,我们可以通过复制粘贴在聊天界面里获得它。

三、总结

开发手滑,两个函数调用弄混了,虽然 \x11这个字符不容易写出来,但[菜刀]加上任意3个字符还是很常见的,经过3个小版本,还是被用户不小心测出来了,哈哈哈,就看谁来背这个锅吧。


=============================================================
随着访客的增多,LeadroyaL在本站流量的开支越来越多了,曾经1元能用1个月,现在1元只能用3天。如果觉得本文帮到了你,希望能够为服务器的流量稍微打赏一点,谢谢!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code