一:背景
1.讲故事
前几天有位朋友在微信上找到我,说他的一个程序上了生产之后,被运维监控定位到这个程序会向一个网址为: http://m.365ey.net
上不定期打数据,而且还是加密的格式,要他解释到底是怎么回事?朋友说根本不认识这个网址,最后在恐慌中排查到是项目中引用了 DeveloperSharp.RabbitMQ
组件所致,截图如下:
朋友反编译了下sdk源码,发现都是混淆过的没法看,聊的过程中朋友很恐慌,很焦虑,担心生产的数据被泄漏,让我帮忙看下是否有手段定位下到底都采集了什么数据?
说实话,这种事情听起来就很惊魂,情从肺腑出,方能入肺腑。。。只要是一个正能量的人,这个忙肯定是尽最大可能的帮一下。
二:WinDbg 分析
1. 前置工作准备
从 nuget 中把 DeveloperSharp.RabbitMQ
下载下来,写好一个测试案例。
为了安全,我把程序放到虚拟机中,同时在 hosts 下给它设置个错误的 ip 地址。
接下来打开 Fiddler,再用 WinDbg TTD
的方式把程序启动起来来记录程序的全部行为,方便我后续分析,
正如朋友所说,真的有采集行为:
http://m.365ey.net:13064/AssistLog.svc
http://m.365ey.net:13063/QueryLog.svc
2. 如何寻找请求代码块
截获请求的代码很简单,因为屏蔽了 IP,所以请求肯定会抛异常,我只需要用 sxe clr
拦截下 First Chance Exception
就能捕获到调用代码。
从线程栈看,请求 http://m.365ey.net:13064/AssistLog.svc
是由 Record1
方法发起的,一看就是个 WCF 方法,参数名称和个数都和 Fiddler 中保持一致, 截图如下:
3. 这些参数都是什么
要找到原参数信息,需要找到是谁调用了 Record1
方法,可以用 !U 067c835f
查看函数汇编代码,简化后如下:
原来是 <HashObjectMap>b__19_0
方法做的调用,也就是 call dword ptr ds:[6D01D8h]
,不信的话可以截图看源码:
从混淆的代码看,有几个特征:
- aa 依赖于 n9UuXCvGC
- bb 依赖于 gY03KpyvZ
- cc 依赖于 GsvWjQg1p
- hh 依赖于 text
等等,那怎么提取呢? 这里只演示一个 aa 参数吧,可以在汇编代码的第一个 x4phG7d0qxdP1ZxlQa.pliOsRbOU
方法上下一个断点,即 067c820b
处观察方法参数,下断点后,让程序回流。
上面输出的 ecx, edx, eax
分别就是 pliOsRbOU()
方法的三个参数。
从输出中可以看到,aa 参数原来提取了我的 ip 地址,用同样的方式可以提取出所有的方法参数,这里就不详述了,我做了一个整理,截图如下:
从图中可以看到: AssistLog.svc
请求大概会提取:
- IP地址
- 机器码
- 机器名
- 时间戳
- IP地址 + 机器码 + 时间戳
用同样的方式调查请求 http://m.365ey.net:13063/QueryLog.svc
,整理如下:
这个请求中主要统计了一些接口版本等信息,并没有发现有消息的外泄,分析到这里还是比较欣慰的,将信息反馈给朋友,让朋友不要担心,应该不会有问题。
三: 总结
总的来说我还是非常相信作者,写一个 SDK 已经够辛苦了,做一些违法犯罪的事情道理上说不通,作者也就是纯技术心,想收集下用户端的使用情况,不过在未经许可的情况下确实有所不妥,但初心不坏。
如果 SDK 的作者能够帮他的使用者解答疑惑,让他的粉丝群体可以安心使用,那就更好了,在此感谢作者的辛苦付出,祝组件越来越强大。
标签:
留言评论