——tim.apk简单逆向
因为防撤回的一个需求: 屏幕上读取到的QQ表情, 存下来是一些无法显示的乱码,
比如 /呲牙 对应的是 0x1400.
因此我的防撤回在找上下文的时候, 如果遇到QQ表情就会GG.
曾经想用 判断是否是相似list 来纠正这些小不同, 结果写出来很麻烦, 性能不好,
于是尝试从tim.apk里寻找映射关系
开始逆向
首先 apktool d tim.apk 能够解出这个 apk 的资源文件和 smali 代码
我想要寻找的是表情图片与文字的对应关系, 所以我得先找到这个图片(的名字), 然后再搜哪些文件里出现过这些名字的
我一个个资源文件翻过去, 最后在 res/drawable-hdpi-v4 里发现了这些表情 命名为 f000.gif - f185.gif
mac自带的搜索功能很强大, 能索引并查找文件里面的内容. 当然 丢进 idea 里它也会帮你建立索引.
搜索 f000 发现有一条 name与资源id的值 id为 0x7f020100
再搜索 0x7f020100 ,很快就能找到与之有关的代码了, 在 Lcom/tencent/mobileqq/text/EmotcationConstants.smali
阅读这个smali 发现他在把一群 Unicode 存到一个数组里, 而这一群 Unicode 正是 {“呲牙”,”眨眼睛”,”流汗”,…}
同时我在这个smali里看到了一个静态常量, 值为 ‘\u0014’, 恰巧之前把表情转成hex的时候发现头上都会包含一个0x14
所以我猜测 0x14 后面跟的数字和这个数组索引有很大的关联, 拿一个验证, 发现正是如此
附上映射表
1 | public static String prefix = "\u0014"; |
映射关系为:
1 | prefix + i <=> strings[i] |
比如 “/呲牙” 这个表情 也就是 “/\u5472\u7259” 也就是 strings 数组里的第0个,
它在手机屏幕上的 的内容以十六进制显示 就是 prefix + i 就是 0x1400