当前位置: 首页 > news >正文

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

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

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

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

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

#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");
}
http://www.lryc.cn/news/124168.html

相关文章:

  • vue + less 实现动态主题换肤功能
  • matlab使用教程(15)—图论基础
  • 【量化课程】02_4.数理统计的基本概念
  • 【计算机视觉|生成对抗】改进的生成对抗网络(GANs)训练技术
  • SQLyog中导入CSV文件入库到MySQL中
  • Spring Security6 最新版配置该怎么写,该如何实现动态权限管理
  • CommandLineRunner 和 ApplicationRunner 用于Spring Boot 应用启动后执行特定逻辑
  • 一、Dubbo 简介与架构
  • 软考:中级软件设计师:文件管理,索引文件结构,树型文件结构,位示图,数据传输方式,微内核
  • 实践-CNN卷积层
  • 【设计模式】MVC 模式
  • 看康师傅金桔柠檬X国漫IP跨界出圈,打开IP合作新思路
  • ElementUI的MessageBox的按钮置灰且不可点击
  • pc端与flutter通信失效, Method not found
  • linux 防火墙经常使用的命令
  • Docker desktop安装mysql
  • Java SpringBoot Vue ERP系统
  • 什么是CSS中的渐变(gradient)?如何使用CSS创建线性渐变和径向渐变?
  • 【深度学习】PyTorch快速入门
  • 学习Vue:组件通信
  • springboot项目打包后读取jar包里面的
  • 设计模式之七大原则
  • pytorch入门-TensorBoard和Transforms
  • 【java】Java基础——接口和实现
  • JetPack Compose 学习笔记(持续整理中...)
  • 遍历集合List的五种方法以及如何在遍历集合过程中安全移除元素
  • 【SQL应知应会】索引(二)• MySQL版
  • Android 简单的视频、图片压缩工具
  • 信息论、推理和机器学习算法之间交叉的经典例子
  • 【多线程】网络原理初识