前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >监视的最低点(1)

监视的最低点(1)

原创
作者头像
franket
发布2021-12-24 12:36:12
1.5K0
发布2021-12-24 12:36:12
举报
文章被收录于专栏:技术杂记

可执行信息

该程序是通过 ClickOnce 部署的 x86 .NET 可执行文件。观察的二进制文件编译于 2019 年 3 月 3 日,md5 哈希值为3C1F9F3CF1E4BC2BD1C53C929F696B6E. 由于可执行文件是 .NET,因此对相应的二进制文件进行逆向工程是小菜一碟,特别是考虑到二进制文件根本没有被混淆,并且已经发布了完整的类型信息,基本上是给我们 1:1 的源代码。

当您启动监控软件时,会打开一个屏幕覆盖图,告诉您考试尚未开始。在启动的前 5 秒内,整个主屏幕都会被扫描以查找包含 6 个字母的考试识别号的二维码。这个二维码大概会在考试当天显示在网络考试网站上。如果未找到二维码,则会显示一个简单的 winforms 弹出窗口,要求手动输入。

出版商还没有在这个二元,它允许任何人来修补删除任何调试代码,Optional Header -> SubsystemWindows Console看看控制台调试输出。两个考试识别号也已硬编码到应用程序中,000000并且_TEST_. 这两个id分别用于离线测试和仿真,后者模拟发送数据,使逆向工程师可以在本地测试其钩子,同时查看数据包数据如何变化。

获得有效的考试标识号后,服务器会收到硬件标识号、Windows 版本和二进制版本的通知。硬件标识号计算如下:

代码语言:txt
复制
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");

这是一个非常模糊的硬件标识符,如果参加考试的人更新他们的图形驱动程序,则它会有所不同,使其对于长期识别基本上无用。公平地说,这很可能只是在考试期间用于区分不同的机器,但实施明显草率,包括不增加识别的静态整体。

加密

二进制可执行文件存储了一些“加密”的信息。引号在那里是因为实际的加密已经过时并且绝对没有理由在那里。加密例程如下:

代码语言:txt
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 可执行信息
  • 加密
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档