花费了整整一个多月时间终于将抖音IOS客户端与服务端通信中的加密算法破解了,这里简要地回溯下整个破解过程。这里只是记录整个破解过程中碰到的难点与关键点,但不会讲解具体算法的细节。对算法的实现有需求的朋友,可以私下里留言。
算法定位
使用charles工具抓包,可以在任意链接中发现其都包含有as/mas这样的加密参数,破解目标就是找到这两个参数的生成算法。
使用ida搜索链接的域名,顺着网络请求的流程往下走,不出意外的话可以看到整个抖音客户端的加解密类IESAntiSpam,并发现网络请求流程中会调用该类的encryptDataWithTimeStamp:parameters:接口。通过动态调试能够发现传入该接口的parameters参数正是网络请求链接中拼接的各个参数。毫无疑问,这个接口就是我们需要突破的目标。
突破STL库
encryptDataWithTimeStamp:parameters:内部使用C++加密数据,因而STL库函数的定位成了本人碰到的第一个坎。虽然IDA已经识别出了STL库函数的名称,但看着那又臭又长的函数名称,没有多少C++经验的我完全不能将那些接口与STL map库中的接口一一对应起来,无奈之下只能使用动态调试一点一点地理解其具体作用,最终确定其对应的接口。
就是这么恶心事实证明,与obj-c代码相比,C/C++代码的安全性要高上一个数量级。OC中对字典进行遍历仅仅只是一个接口调用的事,更复杂点的也就涉及到block,但对C++的map进行遍历就完全不一样了,涉及到STL库中map对象的具体数据结构、string对象的数据结构,[]操作符的重定义等,最为要命的是每一个接口定义的名字都又臭又长。
常用加密算法识别
在花费的一个月时间时,有三分之二的时间花费在了MD5算法的逆向上,这是完全没必要的。当然这也是成长所必需付出的代价。
在破解MD5算法的过程中,我也隐约的感觉到这可能是一个比较通用的加密算法,因为时间、工期等各方面的原因没有把这个想法延伸下去。直到整个MD5算法被完全反写出来,有机会回顾整个代码时,才意思到问题,查阅资料发现其与MD5非常类似,最后通过得到验证。
这是一个非常有用的根据算法特征定位常用算法的帖子,相信其能极大地提高算法逆向的效率。
在逆向MD5算法的过程中接触到了neon指令集,原来还有这样一块我完全没有意思到其存在的领域。后面有人问性能优化方面的问题,这是很值得吹一吹的点。一个不记得从哪个网站上搞到的PDF文件,对于neon指令的使用很有帮助,无论逆向或者正向。
花指令的去除
本次破解碰到了这样一些代码:它不是普通的垃圾代码,而是实际执行的分支代码的拷贝,仅仅只是将使用的寄存器换了下顺序而已。整个函数通过浮点数控制if语句将实际执行分支与伪分支组合在一起,且伪分支的数量是实际分支的数倍,给静态分析制造了非常大的不便。
结合lldb动态调试最终确认了浮点数控制语句的实际执行情况,将不执行的代码分支屏蔽掉后,函数的流程瞬间流畅清晰起来。
总结
其实破解的不是算法,而是其它开发者为代码安全所做的各种伪装。毛主席说“与天斗,其乐无穷,与地半,其乐无穷,与人斗,其乐无穷”,逆向破解中,只有享受与人斗争的快乐,才能克服连续数日毫无进展的沮丧,才能克服对未知代码的恐惧。
让我们享受快乐!
网友评论
多谢 ! 多谢 !
neihanshe@gmail.com
谢谢大佬~
ano.zh.cn@gmail.com
已赞,谢谢了。邮箱:medias@qq.com
已赞,谢谢了。邮箱:breakios@163.com
944946217@qq.com
873991734@qq.com