一次简单的 hack
背景
朋友公司有款老软件,运行在 Windows下,C/S 架构。客户端为很久前外包开发的。这个客户端为 GUI 界面。朋友想定时自动让软件做些事情。这个客户端以前设计时没有提供这种定时功能,只有每次执行当次的操作。朋友自己对软件开发不熟,于是找到我。
朋友给的解决方案
他表示做个按键脚本之类的,定时的去模拟在客户端上的单次操作。
我的解决方案
了解需求
这是 C/S 架构,之前是每次鼠标点击后,客户端给服务器发送相应的网络包。现在要做的是破解这个协议,然后自己写程序定时发送对应协议的网络包即可。
解决方案
朋友的解决方案,对于擅长客户端的人是可以的。但是我不怎么擅长,会花不少时间。
所以我选择我自己更擅长的网络编程。如上边说的,先破解协议,然后想干啥就非常方便了。
解决过程
破解协议
本想找个协议监听软件,我来远程操作就行了,但是他们使用环境公网无法连入。如果我写文档让他来按步骤走,对于非专业人士来说也挺费事的。
随后我想到他们的行业不那么互联网,他们联系的外包素质应该不是那么高。估计也就是 Windows 那套 .NET 搞的,顶多也就 Java 搞的。所以让他把客户端拷出外网,我来反编译试试。同时我去网上查下. NET 的反编效果,有网友表示没有混淆过的 C# 代码反编出来跟源代码基本没啥区别,另外以前反编译过 Java,反编得的代码也跟原工程差不多。所以开始淡定的祈祷反编顺利。
看了眼客户端里的各文件,感觉到是 C#,找了个 dotPeek,反编译出来相当清晰。这玩意的反编译效果比以前反编译 ActionScript 的代码还清晰,ActionScript 反编译后的变量名基本编程 local1 之流了,这个 C# 反编出来变量名都是未经混淆过的原始变量名。
分析协议
C# 代码虽没写过,但是语法跟 Java/C++ 非常像。分析起来不是很费劲。
果然代码写的很 Windows 的 .NET,客户端直接连接的数据库,然后在客户端发起 select
之类的查询语句。数据库表和字段名基本是中文拼音首字母。
后来具体逻辑也懒得看,直接找到数据库的配置,让朋友在内网装个数据库客户端,连数据库看表里数据了。让他比对表里数据和客户端软件上显示的数据对比,找出咱们要的哪几个字段。
实现需求
这个是整个过程里最简单的了。用了自己最喜欢的 Golang 写了个没有 GUI 的程序,定时给他去数据库查想要的数据。
后记
整个过程的顺利多亏给他们写外包的公司用的 C#,还没有做代码混淆之类的。