0x00 前言
CS是什么?可能是某款历史久远的第一人称射击游戏,也可能是某个电影。由于法律原因我们这里并不指出CS是什么,但网络江湖上一直流传着他的传说。
江湖上流程最新版本4.1已经有一阵了,但是江湖上还传出各种小道消息说有后门/外联情况,导致小伙伴们都太不敢用啊。所以到底CS4.1有没有后门,今天我们一起来探索下~
0x01 入手CS4.1
我直接从江湖人士手中拿到了流传最火的CS4.1的破解版本。我入手的版本是号称中文版,里边的内容如下:
可以看到主程序jar包的修改日期为2020-07-28,这个时间应该是破解重新打包的时间。我得到版本的jar文件MD5为:187a****9613
我们知道jar包本质上就是zip包,所以我们修改文件后缀名为zip之后直接打开。查看各个文件修改的时间戳:
可以看到大部分文件和文件夹的修改时间为2020-06-24,推测此时间为jar包生成时间,在经过一天后于2020-06-25对外发布。
经过详细排查发现有4个文件的时间戳跟其他文件明显不同:
我们分别叫他们B文件、A文件、S文件和c文件。
这4个文件的修改代表对4.1破解流程的思路。笔者有幸从另一位江湖人士手中获取到4.0的原版,4.0到4.1版本应该只是修复了一些bug和增加了一些功能,所以我们通过对比原版和破解版之间的代码来看看破解者到底做了哪些改动。
0x02 修改验证
首当其冲的就是A文件,从命名上就可以看出来这个文件是进行验证授权的。
我们可以通过Java Decompiler 来看查看源码,大部分验证逻辑都在构造函数中:
原版
破解版:
熟悉CS破解的朋友可以看得出来,这里是CoolCat大佬的思路:
将正确的密钥文件解密后,直接将解密后的数据写到程序里进行下一步验证,并将原本读取c文件并解密的操作代码删除掉。
那既然在这里c文件已经不用读取了,那为啥在破解版本里还要有这个文件的存在呢?
这里就牵扯到CS的另一套产品控制机制,CS会将一些Windows下的操作封装成dll库,如:截屏、bypassuac、mimikatz等。并且为了控制用户需购买密钥,验证之后才可以合法使用,会将这些文件进行加密。使用时先读取文件,再用密钥文件来进行解密后使用。
而修改的文件S文件就是读取文件并进行解密的关键类,我们来看下原版的相关调用代码:
可以很清晰的看出从A文件中调用S文件的过程。
我们再来看下破解版的代码:
我们看到破解版中直接从c文件中读取数据直接作为字节进行注册,而原版读取了c文件中的内容还需要解密之后读取字节才可以注册。所以虽然原版和破解版都包含该文件,但是文件内容和意义大不相同,我们从文件大小也可以看出差别:
所以这些文件的修改都是针对验证进行了破解,并没有加入后门。
0x03 exit暗桩
最后一个修改文件为B文件,
我们来看下B文件,这个文件是TeamServer的核心文件:
this.data.shouldPad
调用的函数就在我们的修改类B文件里,我们来看下原版和破解版的区别:
原版:
破解版:
我们可以看到破解版直接将shouldPad置为了false,这样无论校验结果如何都不会增加exit命令,从而达到去掉exit暗桩的效果。
所以B文件的修改是为了去除作者进行产品控制的exit暗桩。
0x04 外联问题
笔者用的方法比较笨:将服务器端和被控端跑在纯净的操作系统中,操作系统中将更新关闭并且只安装了
WireShark 来进行长期抓包。
经过测试,在运行了24小时之后查看WireShark 报文中并未发现可疑外联。
当然即便是使用这种笨办法测试,也不能完全100% 确信没有外联。
0x05 其他问题
目前看来CS4.1已经可以列入我们的武器库中了,但是其实还有其他问题需要我们来自己动手修改。
过期问题
虽然我们在破解验证的时候通过大佬的分享使用了正版密钥的数据,但这些数据中包含了授权时间信息,网上有资料说需要将过期的判断改一下。
我们来看下破解版中的此部分代码,此部分代码在A文件中:
代码中并没有处理过期判断,我们可以将判断直接返回false即可。
但是我们其实也可以不做任何修改,也不会有影响:
破解版中的密钥字节经过测试计算为29999999,即为永久版。
而在所有调用中只有一个文件有用到这些判断:
非永久版才会进行过期的验证判断,我们既然已经是永久版,就可以不用管过期问题。
WaterMark
watermark即为水印,此参数中在A文件会进行赋值。
经过测试发现此参数赋值为0:
为0就会有一个很不好的后果,从变量命名上我们也可以获知一二,就是会增加水印。但是CS增加的水印并不会显示在界面UI上,而是会在生成的shellcode中:
有人会觉得哪有啥的,不就在shellcode里增加了一段谁都看不懂的字符串,搞不好还进行混淆了呢,这有什么的~
但是非常抱歉,这段神秘代码并不是一段普通的字符串!
这段字符串是EICAR(欧洲计算机防病毒研究所)开发的一种测试代码,本意是用于测试设备的防病毒能力。它本质上不是病毒,也并不包含任何程序代码。
最简单的测试方式是将这段字符串复制到一个空白的”新建文本文档.txt”中并保存,用杀软对此文件进行扫描会立即告警。
所以一旦某个文件包含或者流量中包含这段代码,就会被大部分杀软和流量检测设备检测到并发出告警。
我们的解决方案就是将watermark在验证阶段赋值为非0,并且将这段神秘代码在CS中删除。
经过反编译修改并重新打包后,我们终于可以愉快的玩耍啦~
0x06 总结
所有4个修改的地方我们都一一看过了,外联测试我们用笨方法也测试过了,这个版本还是比较干净的,但人心险恶江湖叵测,随着流传版本越来越多,很有可能在传播过程中有人放进自己的代码。当然也不排除有官方作者藏得更深的暗桩,所以我们可能需要更多的细心和耐心还需要更深的代码功底,才可能挖掘出更深层的东西。