腾讯面试题算法还原【游戏安全】

本题的参考链接:https://share.weiyun.com/5Xg2b7v

其实拿到这个题我就感觉在哪里看过,后来想想是在旺仔那里看到的,以下是旺仔写的分析过程可以参考一下https://bbs.kanxue.com/thread-276536.htm

但是这个题要比旺仔拿到的那个要增加些许难度,主要就是增加了类似于CRC校验的东西还有反调试的一些东西,需要动态的获取到目标偏移位置的字节值作为运算

后续还有更高级的其它要求,比如过掉反调试,但是我感觉像过反调试这种东西一定要用驱动的,不然随意的重写几个反调试的API就会让分析变得非常难,当然也可以选择使用一些别人写好的插件(但是那样并不代表你自身的实力),在分析了一些反调试后发现果真重写了几个反调试API,随即停止后续分析,以下是算法的整个还原结果

c 复制代码
#include<stdio.h>
#include<Windows.h>

int main()
{
	char True_Key[26];
	char Name[1024] = "12345678";

	char v20[28];
	char v18[28];
	char v22[28];
	int j;
	int i;
	unsigned int v13 = 0x19820714;
	int m;
	int v2;
	DWORD targetProcessId;
	printf("请输入目标进程PID:");
	scanf_s("%d",&targetProcessId);

   // 打开目标进程
	HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, targetProcessId);
	if (hProcess == NULL)
	{
		return 1;
	}

	// 要读取的内存地址
	LPVOID address = (LPVOID)0x401BA9; // 替换成目标进程中要读取的实际内存地址

	// 读取的数据缓冲区
	BYTE buffer[10000] = { 0 }; // 根据需要调整缓冲区大小

	// 实际读取的字节数
	SIZE_T bytesRead = 0;

	// 读取内存
	if (ReadProcessMemory(hProcess, address, buffer, sizeof(buffer), &bytesRead))
	{
		// 在此处处理读取到的内存数据
		for (i = 0; i < 2400; v13 ^= *((DWORD*)buffer + i++))
			v2 = i;
	}
	else
	{
		// 读取失败处理逻辑
		printf("读取失败\n");
	}

	// 关闭目标进程句柄
	CloseHandle(hProcess);

	memset(v20, 0, 25);
	memset(v22, 0, 25);
	memset(v18, 0, 28);
	memset(True_Key, 0, sizeof(True_Key));
	v20[0] = '0';
	v22[0] = 'A';
	v18[0] = 'a';
	unsigned __int8 v8;
	unsigned __int8 v7;
	unsigned __int8 v6;
	for (j = 1; j < 26; ++j)
	{
		v20[j] = v20[j - 1] + 1;
		v22[j] = v22[j - 1] + 1;
		v18[j] = v18[j - 1] + 1;
	}

	char v25[] = { 0xF7,0xFF,0xFF,0x89,0x8D,0x4C,0xF7,0xFF };
	char v19[] = { 0x07,0x82,0x19,0xE8,0x1F,0xFE,0xFF,0xFF };
	int k;

	for (k = 0; k < 8; ++k)
	{
		Name[k] ^= k;
		Name[k] ^= v25[k];
		Name[k] ^= v19[k];
	}


	*(DWORD*)Name ^= v13;
	*(DWORD*)&Name[4] ^= v13;

	memset(True_Key, 0, sizeof(True_Key));
	for (m = 0; m < 8; ++m)
	{
		v8 = (unsigned __int8)(Name[m] & 0xE0) / 32;
		v6 = (Name[m] & 0x1C) / 4;
		v7 = Name[m] & 3;
		if (m % 3 == 2)
		{
			True_Key[3 * m] = v20[v7];
			True_Key[3 * m + 1] = v22[v8 + 8];
			True_Key[3 * m + 2] = v18[v6 + 16];
		}
		if (m % 3 == 1)
		{
			True_Key[3 * m] = v22[v8 + 16];
			True_Key[3 * m + 1] = v18[v6 + 8];
			True_Key[3 * m + 2] = v20[v7];
		}
		if (!(m % 3))
		{
			True_Key[3 * m] = v22[v6 + 16];
			True_Key[3 * m + 1] = v18[v7 + 8];
			True_Key[3 * m + 2] = v20[v8];
		}
	}

	printf("%s\n", True_Key);
	system("pause");
}
相关推荐
little~钰18 分钟前
倍增算法和ST表
算法
知识领航员1 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
薛定e的猫咪1 小时前
因果推理研究方向综述笔记
人工智能·笔记·深度学习·算法
如何原谅奋力过但无声2 小时前
【灵神高频面试题合集06-08】反转链表、快慢指针(环形链表/重排链表)、前后指针(删除链表/链表去重)
数据结构·python·算法·leetcode·链表
平行侠2 小时前
037插入排序 - 整理扑克牌的算法
数据结构·算法
ECT-OS-JiuHuaShan3 小时前
彻底定理化:从量子纠缠到量子代谢
数据库·人工智能·学习·算法·生活·量子计算
视觉&物联智能3 小时前
【杂谈】-当人工智能能力增速凌驾于安全管控模型之上
人工智能·安全·ai·chatgpt·agi·deepseek
爱喝雪碧的可乐3 小时前
2026 腾讯广告算法大赛优秀方案启示:行为条件化多模态自回归生成推荐摘要
算法·数据挖掘·回归·推荐系统·推荐算法
碧海银沙音频科技研究院3 小时前
音箱在加入 NN AEC(神经网络声学回声消除) 后出现反复重启问题解决
人工智能·深度学习·算法