该程序是通过 ClickOnce 部署的 x86 .NET 可执行文件。观察的二进制文件编译于 2019 年 3 月 3 日,md5 哈希值为3C1F9F3CF1E4BC2BD1C53C929F696B6E
. 由于可执行文件是 .NET,因此对相应的二进制文件进行逆向工程是小菜一碟,特别是考虑到二进制文件根本没有被混淆,并且已经发布了完整的类型信息,基本上是给我们 1:1 的源代码。
当您启动监控软件时,会打开一个屏幕覆盖图,告诉您考试尚未开始。在启动的前 5 秒内,整个主屏幕都会被扫描以查找包含 6 个字母的考试识别号的二维码。这个二维码大概会在考试当天显示在网络考试网站上。如果未找到二维码,则会显示一个简单的 winforms 弹出窗口,要求手动输入。
出版商还没有在这个二元,它允许任何人来修补删除任何调试代码,Optional Header -> Subsystem
来Windows Console
看看控制台调试输出。两个考试识别号也已硬编码到应用程序中,000000
并且_TEST_
. 这两个id分别用于离线测试和仿真,后者模拟发送数据,使逆向工程师可以在本地测试其钩子,同时查看数据包数据如何变化。
获得有效的考试标识号后,服务器会收到硬件标识号、Windows 版本和二进制版本的通知。硬件标识号计算如下:
public static string GetFingerPrint()
{
if (string.IsNullOrEmpty(MachineFingerprintGenerator.fingerPrint))
{
MachineFingerprintGenerator.fingerPrint = MachineFingerprintGenerator.GetHash(
"CPU >> " + MachineFingerprintGenerator.cpuId() + '\n' +
"BIOS >> " + MachineFingerprintGenerator.biosId() + '\n' +
"BASE >> " + MachineFingerprintGenerator.baseId() + '\n' +
"DISK >> " + MachineFingerprintGenerator.diskId() + '\n' +
"VIDEO >> " + MachineFingerprintGenerator.videoId() + '\n' +
"MAC >> " + MachineFingerprintGenerator.macId()
);
}
return MachineFingerprintGenerator.fingerPrint;
}
private static string cpuId()
{
string id = MachineFingerprintGenerator.identifier("Win32_Processor", "UniqueId");
if (id != string.Empty)
return id;
id = MachineFingerprintGenerator.identifier("Win32_Processor", "ProcessorId");
if (id != string.Empty)
return id;
id = MachineFingerprintGenerator.identifier("Win32_Processor", "Name");
if (id != string.Empty)
return id;
id = MachineFingerprintGenerator.identifier("Win32_Processor", "Manufacturer");
if (id != string.Empty)
return id;
return MachineFingerprintGenerator.identifier("Win32_Processor", "MaxClockSpeed");
}
private static string biosId() =>
MachineFingerprintGenerator.identifier("Win32_BIOS", "Manufacturer") +
MachineFingerprintGenerator.identifier("Win32_BIOS", "SMBIOSBIOSVersion") +
MachineFingerprintGenerator.identifier("Win32_BIOS", "IdentificationCode") +
MachineFingerprintGenerator.identifier("Win32_BIOS", "SerialNumber") +
MachineFingerprintGenerator.identifier("Win32_BIOS", "ReleaseDate") +
MachineFingerprintGenerator.identifier("Win32_BIOS", "Version")
private static string baseId() =>
MachineFingerprintGenerator.identifier("Win32_BaseBoard", "Model") +
MachineFingerprintGenerator.identifier("Win32_BaseBoard", "Manufacturer") +
MachineFingerprintGenerator.identifier("Win32_BaseBoard", "Name") +
MachineFingerprintGenerator.identifier("Win32_BaseBoard", "SerialNumber");
private static string diskId() =>
MachineFingerprintGenerator.identifier("Win32_DiskDrive", "Model") +
MachineFingerprintGenerator.identifier("Win32_DiskDrive", "Manufacturer") +
MachineFingerprintGenerator.identifier("Win32_DiskDrive", "Signature") +
MachineFingerprintGenerator.identifier("Win32_DiskDrive", "TotalHeads");
private static string videoId() =>
MachineFingerprintGenerator.identifier("Win32_VideoController", "DriverVersion") +
MachineFingerprintGenerator.identifier("Win32_VideoController", "Name");
private static string macId() =>
MachineFingerprintGenerator.identifier("Win32_NetworkAdapterConfiguration", "MACAddress", "IPEnabled");
这是一个非常模糊的硬件标识符,如果参加考试的人更新他们的图形驱动程序,则它会有所不同,使其对于长期识别基本上无用。公平地说,这很可能只是在考试期间用于区分不同的机器,但实施明显草率,包括不增加识别的静态整体。
二进制可执行文件存储了一些“加密”的信息。引号在那里是因为实际的加密已经过时并且绝对没有理由在那里。加密例程如下:
private static byte[] key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
private static byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
public static string Encrypt(string text)
{
ICryptoTransform cryptoTransform = DES.Create().CreateEncryptor(key, iv);
byte[] bytes = Encoding.Unicode.GetBytes(text);
return Convert.ToBase64String(cryptoTransform.TransformFinalBlock(bytes, 0, bytes.Length));
}
public static string Decrypt(string text)
{
ICryptoTransform cryptoTransform = DES.Create().CreateDecryptor(key, iv);
byte[] array = Convert.FromBase64String(text);
return Encoding.Unicode.GetString(cryptoTransform.TransformFinalBlock(array, 0, array.Length));
}
这种机制目前正在生产中使用,并且已经部署在数千台机器上。我们不太确定为什么他们决定用这个加密任何东西,因为 base64 也能完成这项工作。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有