付费客户端攻防篇
场景描述:
付费客户端,比如微软offic,付费idea,游戏外挂等等。定时或者每次都会检查客户端是否有授权信息、是否注册等。
一般而言,授权信息就是一个卡密或者注册码。
卡密与注册码区别:
卡密:有卡号与卡密2个东西
注册码:只有一个码
区别:从验证的角度而言,2者没有太多区别,那为什么要有卡密呢?其实是为了解决一些场景,比如售后,因为卡密或者注册码是比较隐秘的信息,就算是客服也不能告知,这时候如果有卡号与卡密之分,那么卡号可以公开给客服去排查问题。但是如果只有注册码,那往往要关联上系统账号等等,有时候往往只有注册码,比较不方便。
付费客服端攻防
基于付费客户端一般都是用卡密或者注册码这个前提,一般授权都有过期时间或永久,且绑定机器~
攻1:劫持服务端验证返回结果,比如直接返回true,欺骗客户端放行
防1:
要防止欺骗客户端,要做到返回信息不可伪造,且和卡密关联
1、客户端验证需要用非对称加密(推荐rsa)可以参考我这篇文章,以保证返回的是合法的,防止伪造返回,但不防被抓包截取的合法返回。这里解决了伪造问题。
2、返回信息需要包含与卡密相关联的字段,以保证这个返回是属于该卡密的,防止没有合法卡密的验证请求,客户端需要根据卡密去关联验证这个字段。这里解决了抓包截取有效卡密的返回,用在无效卡密请求的问题。另外也可以在返回参数加上时间戳,保证请求返回的时效性
攻2:修改系统时间,延长授权码的使用
防2:一般而言,如果做到防1,那么这个时间判断是在服务端,返回字段包含是否过期,客户端只要判断服务端的返回即可。
攻3:一码多机的情况
防3:绑定机器,一般不绑ip(ip随时会变)
1、一般在局域网内只有一个路由的情况下,是不允许相同的mac地址同时存在的,但是可以用多路由或者非同时上线的方式绕开。(不同路由,可以允许相同mac)
2、极端情况下,可以在服务端保存在线状态的方式去防止一码多机,但是这种方法有个弊端就是下线状态问题,且验证完后仍不能脱机使用,下线状态处理不妥,会导致比较多的客诉问题。
3、有一种做法是当第一次验证注册之后,会在本地生产一个隐秘的唯一码,服务端记录激活状态(俗称激活机制),后面验证就需要带上这个唯一码才能通过,但是破解也很简单,把生产的唯一码文件复制过去即可。当然你可以把唯一码生成在隐秘的地方比如appdata里面,破解方法也很暴力,现在都用虚拟机都是整个镜像复制过去的。
4、最安全的一种就是定时上报,在较短一定间隔的时间内如果一个卡密上报的频率过高或者有不同mac+ip的上报,证明有超过一个客户端在使用。
以上的攻防都是基于服务端验证返回的,其实更加常规的做法是本地爆破,直接修改二进制文件,修改你程序的判断逻辑,从而绕开验证判断。参考52破解。
这种基本无解,但是可以加壳来提高爆破的复杂程度,这里推荐一个强力壳:SProtect https://sp0101.com/