一个由proguard与fastJson引起的血案(转)
更新微信sdk导致ComposeData中的内部类ComposeDataSender方法被混淆
根本原因,fastjson使用姿势不对。
问题描述:
一个发件人列表里,应当呈现的数据(这里命名为ComposeData)为空
(1)业务逻辑层
获取发件人列表时,如果Composedata超时,会从网络重新拉取Json格式的ComposeData,拉取后利用FastJson的toString()方法,将ComposeData写入DB。
混淆情况下,toString()生成的json字符串会缺少alias字段。
定位问题到FastJson的toString()。
(2)FastJson层
FastJson执行JSON类的toString()方法时,
对普通的Object对象(这里是ComposeDataSender),会将这个对象当做JavaBean对象处理,
在JavaBeanSerializer中,找到这个对象的getter方法,
来确定要生成的Json格式数据中,K-V的值。
在JavaBeanSerializer中打log,发现不混淆时,getter有4个(getNick(),getAlias(),getType(),getSignvalid()),混淆后,只找到一个getter(getType())。
定位问题到getter方法。
(3)混淆后的ComposeDataSender
反编译没问题的旧包和有问题的新包,
发现, 旧包的ComposeDataSender有getAlias()和getType()方法和一个被混淆后的return this.XXX方法(混淆前为getNick()方法)
新包的ComposeDataSender有getType()方法和两个被混淆后的return this.XXX方法(混淆前为getNick(),getAlias()方法)
导致发件人列表为空的原因:
获取发件人列表时,依赖于需要读取DB中的各个别名帐号的alias和type ,
旧包中,getAlias()和getType()方法没有混淆,toString()时存入DB的数据是可用的(实际上,nick字段在4.1.1也丢失了,但由于没有使用到这个字段,不会引起问题)
新包中,getType()方法没有混淆,其他getter被混淆,toString()存入DB的数据只有type(丢失了nick,alias),所以在获取发件人列表时,alias为空
(4)新包丢失alias分析
在反编译后的旧包所有代码中中查找getAlias()
可以看到mm.sdk.contact中有RContact这个类,包含了getAlias方法,因为是第三方库,其中public的getAlias方法没有被混淆,
因为proguard混淆时,同名的方法(不论是否在同一个类中)是被替换为相同的名字,(可以查看~\build\outputs\mapping\debug\mapping.txt查看混淆时变量和方法的替换规则)
所以,代码中所有getAlias方法都没有被混淆,(相同的情况还可以在ComposeDataSender里看到,accountId属性虽然是私有的,但也没有被混淆)
而新包中,更新了mm.sdk,去掉了RContact这个类,没有getAlias方法,所以ComposeDataSender里的getAlias被混淆
而getType()没有丢失:
查找getType()方法,发现在新包或旧包中的很多第三方库中仍然被保留,所以没有被混淆,toString()时仍然可以将type字段正确存入DB
(经实验,把ComposeDataSender里的type名字改为senderType,并相应地改变get方法和set方法,就会被混淆)
(5)解决方案
修改ComposeData toString()方法,原有toString()方法,在处理items这一array对象时,直接往JSONArray中存入了ComposeDataSender对象,
所以toString生成K-V时会依赖于ComposeDataSender的getter方法。
修改为:
往JSONArray中存入JSONObject对象,将K-V信息存入JSONObject,解析时走MapSerializer流程,不需要依赖于ComposeDataSender的getter方法。不会受混淆影响。
http://www.cnblogs.com/hellocwh/p/4908730.html
一个由proguard与fastJson引起的血案(转)的更多相关文章
- 一个由proguard与fastJson引起的血案
更多内容在这里查看 https://ahangchen.gitbooks.io/windy-afternoon/content/ 更新微信sdk导致ComposeData中的内部类ComposeDat ...
- 一个基于STSdb和fastJson的磁盘/内存缓存
一个基于STSdb和fastJson的磁盘/内存缓存 需求 业务系统用的是数据库,数据量大,部分只读或相对稳定业务查询复杂,每次页面加载都要花耗不少时间(不讨论异步),觉得可以做一下高速缓存,譬如用n ...
- 一个无锁消息队列引发的血案(六)——RingQueue(中) 休眠的艺术 [续]
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 一个无锁消息队列引发的血案(四)——月:RingQueue(上) 自旋锁
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 一个无锁消息队列引发的血案(三)——地:q3.h 与 RingBuffer
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 一个ajax同步与异步引发的血案。
前言 公司做网上促销活动,需要充值换取相应的抽奖资格,抽奖可以获得丰厚的礼品,而且抽奖资格门槛有点高,领导下达命令保证活动的正常上线与运行,领导很重视,就这样,在领导的安排下进行了相关活动的codin ...
- 一个MySQL JDBC驱动bug引起的血案
1.1 问题背景 公司是做电商系统的,整个系统搭建在华为云上.系统设计的时候,考虑到后续的用户和订单数量比较大,需要使用一些大数据库的组件.关系型数据库这块,考虑到后续数据量的快速增长,不是 ...
- Dynamics CRM中一个查找字段引发的【血案】
摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复267或者20180311可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...
随机推荐
- Spark 1.0.0 横空出世 Spark on Yarn 部署(Hadoop 2.4)
就在昨天,北京时间5月30日20点多.Spark 1.0.0最终公布了:Spark 1.0.0 released 依据官网描写叙述,Spark 1.0.0支持SQL编写:Spark SQL Progr ...
- 重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示
原文:重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示 [源码下载] 重新想象 Windows 8 Store Ap ...
- svn创建并应用补丁
有时,我们不能提交临时局部变化,而我们需要回滚到svn最新的版本号.然,这些变化,我们要保持.提交或发送给其他同事的未来review. 怎么做?非常easy,只需要两个步骤: (1)创建一个补丁文件并 ...
- 生活中的大数据 hadoop
大数据和我有关吗?大数据就是大量的数据吗?只有互联网公司才有大数据吗?想盘活大数据必须买昂贵的软硬件吗?大数据怎么存储计算?大数据,这个时下最火热的互联网词语,你了解多少呢?
- C# The process cannot access the file because it is being used by another process
C# The process cannot access the file because it is being used by another process The process cann ...
- ios pop 折叠动画
今天写了一个很有趣的电影太,我们可以去githoub下载. 这部动画是高级写作,我参考了它.而凝视,我希望你能看的懂. 各种动画.事实上,一些不起眼的开始.我也只是摸索. 我希望有更多的交流.[ ...
- ZOJ Monthly, October 2010 ABEFI
ZOJ 3406 Another Very Easy Task #include <cstdio> #include <cstring> const int N = 10000 ...
- 得到View Frustum的6飞机
笔者:i_dovelemon 资源:CSDN 日期:2014 / 9 / 30 主题:View Frustum, Plane, View Matrix, Perspective Projection ...
- 简单的虚拟摇杆控制移动(NGUI)
一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个BoxCollider,再创建一个sprite child作为虚拟摇杆中间的按钮,叫做button 二.通 ...
- Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状)
Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状) 本篇博客来给大家介绍怎样使用Lua这门语言来开发一个简单的小游戏-记数字踩白块. 游戏的流程是这种:在界面上生成5个数1~5字并显 ...