好久没有更新这个系列了(这个系列计划是完成大约3-4篇短文),换了新工作,开始做手机网游相关的东西,服务器、客户端都弄,加班也比较多,因此这个逆向学习软件设计的小系列就没有来的及更新。这次补上,另外完成这个系列后,我将会写一些关于手机网游开发的相关心得体会或者经验教训,在客户端上面:主要围绕Cocos2d-x游戏引擎的理解、使用、扩展;在服务器端上:主要围绕Linux64位服务器端的开发过程中的问题与解决方法,记录一下工作过程中的点滴。言归正传,接着分析这块不错的网络收音机软件。
本篇的目的有两个:第一、去除分析过程中软件自带的广告部分,记录相应的思路及实现方法;第二、定位最为关键的dat数据文件解码读取函数及其过程,为接下来的一到两篇最为核心的解码算法做铺垫。
由于在分析的过程中,发现软件会从网络上面获取相应的广告信息,当然这个对于免费软件来说无可厚非,但是对于用户来说还是不甚喜欢,毕竟好好的一款软件,打些算命之类的广告总觉得别扭。也影响分析的心情,因此首先把这个广告部分去掉再说。(如图1)
(图1、显示广告的区域)
首先,打开APIMonitor这个软件,在使用启动监视的功能,勾选相应的API类型(如图2)
(图2、API 过滤中选取相关的API类型进行过滤)
然后可以开启软件监控了,直到出现广告后即可停止监控,然后观察监控结果(如图3)。
(图3、通过APIMonitor获取的疑似广告页面URL)
通过将这个广告页面URL输入到浏览器中Check的结果,恰好满足刚才的猜想,现在疑似的问题就做实了,的确就是广告页面的URL。接下来用OD打开该软件进行动态分析,这个时候使用API断点就可以了,至于该断哪个API,这里需要说明一下,当然是WS2_32.send与WS2_32.recv了,注意一定是WS2_32下的哦,注意截取HTTP请求的内容及获取的内容,根据内容再来做进一步的分析即可(如图4)
(图4、send\recv获取的数据)
通过对send\recv获取去的数据进行分析,发现其关键的广告部分URL正是通过HTTP请求获取的,同样获取到得还有关键的版本升级信息,看到这里就不能通过屏蔽HTTP请求来达到屏蔽广告的目的了,除非你不想升级了。因此需要选择更加合理的方式来处理。这里观察一下获取数据的格式,针对这个格式,程序必定需要进行解析处理,做逆向的同时一定要有正向的思路作为辅助,如果你来解析这个地方如何办,针对特定字段,必然都有关键字的匹配判断过程,相应会出现类似if\switch..case的语句,那么接下来找到相关广告部分的解析处理函数就是去除广告的重点所在了。针对这类数据解析的要点,找关键字就是一个捷径,针对当前获取的数据我们不难发现其关键字有:ad、count、http等。这个时候,使用OD的字符串搜索功能即可,很快就找到了疑似函数体了,如图5:
(图5,疑似解析处理广告部分数据的函数体)
找到函数头,下断点,跑一下就可以知道是否就是了,通过实际运行发现这个函数就是一个处理广告数据的函数体,回溯到源头,发现其正是一个switch...case的处理,针对不同的关键字分类处理,用IDA找到该函数如下图6
(图6,处理recv到的数据的函数体)
接下来,将有关广告数据处理的函数调用nop掉,就可以完成去除广告了,这里稍微注意一下是否需要做堆栈平衡,运气不错,这里不需要:D,函数自平衡的。nop掉两个有关广告函数处理就完成了去除广告的效果了(图7)。
(图7,最终去除广告的效果,清爽多了)
接下来准备定位解密函数,由于整个电台自有数据的读取过程必然伴随相应的文件操作API的调用,因此,继续使用APIMonitor获取分析的宏观蓝图(图8)
(图8、关于电台数据文件使用的过程)
针对这个调用过程,很容易想到利用OD,使用API断点,采用栈回溯的方法定位相关的函数,从而找到最为关键的函数,分析出相应的解密算法。
文章的目的是学习如何做软件设计,如何实现,这里针对这些内容做一个简短的说明,回到这个学习软件设计上来。首先,这个网络收音机软件的数据组织形式是可以学习的,针对这类数据是如何组织分文件的方法等,都是可以学习,该具体采用定位索引文件+数据文件的方式,其中还有一些二分法的定位方式这些都是比较好的方法。另外,针对网络程序需要更新需要升级的特点如何来做到监控升级等,利用HTTP协议,及关键字格式的分析,这个也是可以学习的,获取的升级、广告、等相关的数据,首先是如何组织的,如果作为一个这方面的新手来说,可以参考该软件的实现方式来组织自己的网络应用程序升级更新的方式。(To be continued......)