文章目录
  1. 1. 背景
  2. 2. 朋友给的解决方案
  3. 3. 我的解决方案
    1. 3.1. 了解需求
    2. 3.2. 解决方案
  4. 4. 解决过程
    1. 4.1. 破解协议
    2. 4.2. 分析协议
    3. 4.3. 实现需求
  5. 5. 后记

背景

朋友公司有款老软件,运行在 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#,还没有做代码混淆之类的。

文章目录
  1. 1. 背景
  2. 2. 朋友给的解决方案
  3. 3. 我的解决方案
    1. 3.1. 了解需求
    2. 3.2. 解决方案
  4. 4. 解决过程
    1. 4.1. 破解协议
    2. 4.2. 分析协议
    3. 4.3. 实现需求
  5. 5. 后记