手游模拟器里也可以用C++实现 特征码遍历
#include <stdio.h>
#include <stdlib.h>
#include <windows.h> union Base
{ DWORD address; BYTE data[4];
};/************************************************************************/
/* 函数说明:根据特征码扫描基址
/* 参数一:process 要查找的进程
/* 参数二:markCode 特征码字符串,不能有空格
/* 参数三:特征码离基址的距离,默认距离:1
/* 参数四:findMode 扫描方式,找到特征码后,默认为:1
/* 0:往上找基址(特征码在基址下面)
/* 1:往下找基址(特征码在基址上面)
/* 参数五:offset 保存基址距离进程的偏移,默认为:不保存
/************************************************************************/
DWORD ScanAddress(HANDLE process, char *markCode, DWORD distinct = 1, DWORD findMode = 1, LPDWORD offset = NULL)
{ //起始地址 const DWORD beginAddr = 0x00400000; //结束地址 const DWORD endAddr = 0x7FFFFFFF; //每次读取游戏内存数目的大小 const DWORD pageSize = 4096; 处理特征码/ //特征码长度不能为单数 if (strlen(markCode) % 2 != 0) return 0; //特征码长度 int len = strlen(markCode) / 2; //将特征码转换成byte型 BYTE *m_code = new BYTE[len]; for (int i = 0; i < len; i++){ char c[] = {markCode[i*2], markCode[i*2+1], '\0'}; *m_code = (BYTE)::strtol(c, NULL, 16); } /查找特征码/ BOOL _break = FALSE; //用来保存在第几页中的第几个找到的特征码 int curPage = 0; int curIndex = 0; Base base; //每页读取4096个字节 BYTE page[pageSize]; DWORD tmpAddr = beginAddr; while (tmpAddr <= endAddr - len){ ::ReadProcessMemory(process, (LPCVOID)tmpAddr, &page, pageSize, 0); //在该页中查找特征码 for (int i = 0; i < pageSize; i++){ for (int j = 0; j < len; j++){ //只要有一个与特征码对应不上则退出循环 if (m_code[j] != page[i + j])break; //找到退出所有循环 if (j == len - 1){ _break = TRUE; if (!findMode){ curIndex = i; base.data[0] = page[curIndex-distinct-4]; base.data[1] = page[curIndex-distinct-3]; base.data[2] = page[curIndex-distinct-2]; base.data[3] = page[curIndex-distinct-1]; }else{ curIndex = i + j; base.data[0] = page[curIndex+distinct+1]; base.data[1] = page[curIndex+distinct+2]; base.data[2] = page[curIndex+distinct+3]; base.data[3] = page[curIndex+distinct+4]; } break; } } if (_break) break; } if (_break) break; curPage++; tmpAddr += pageSize; } if(offset != NULL){ *offset = curPage * pageSize + curIndex + beginAddr; } return base.address;
} /************************************************************************/
/* 函数说明:根据特征码扫描call地址
/* 参数一:process 要查找的进程
/* 参数二:markCode 特征码字符串,不能有空格
/* 参数三:特征码离基址的距离,默认距离:1
/* 参数四:findMode 扫描方式,找到特征码后,默认为:1
/* 0:往上找基址
/* 1:往下找基址
/************************************************************************/
DWORD ScanCall(HANDLE process, char *markCode, DWORD distinct = 1, DWORD findMode = 1)
{ DWORD offset; DWORD call = ScanAddress(process, markCode, distinct, findMode, &offset); call += offset; if(findMode) call = call + 5 + distinct; else call = call - distinct; return call;
} -------------------------------------------------------------------------------------
测试代码如下:
-------------------------------------------------------------------------------------int main(int argc, char* argv[])
{ HWND hGame = ::FindWindow("DxFirst", NULL); //查找游戏窗口if(hGame == NULL) return FALSE; DWORD processId; HANDLE process; ::GetWindowThreadProcessId(hGame, &processId); process = ::OpenProcess(PROCESS_ALL_ACCESS, false, processId);//83C404C3CCCCA1 1 人物基址往下搜索 //C3CCCCCCCCCCCCCCCCCCCC8B442404A3ECA72001 0 人物基址往上搜索 //5557535152C6400801E8 1 打怪call //基址在特征码下面 DWORD addr = ScanAddress(process, "83C404C3CCCCA1"); printf("人物基址:%X\n",addr); //基址在特征码上面 DWORD addr = ScanAddress(process, "C3CCCCCCCCCCCCCCCCCCCC8B442404A3ECA72001", 3, 0); printf("人物基址:%X\n",addr); DWORD call = ScanCall(process, "5557535152C6400801E8"); printf("call基址:%X\n",call); ::CloseHandle(process); return 0;
}
手游模拟器里也可以用C++实现 特征码遍历相关推荐
- 安卓模拟器刷小米系统_小米安卓模拟器|小米手游模拟器下载 v1.0.0.8 电脑版_小皮网...
小米手游模拟器是一款强大的电脑安卓模拟器.小米手游模拟器采用全新的vb虚拟机技术,可完美兼容运行各种安卓应用和游戏,告别手机玩游戏带来的各种困扰. 小米手游模拟器特色介绍: 1.小米手游模拟器等你来玩 ...
- 吃鸡战歌用计算机,电脑玩刺激战场用什么模拟器好 电脑玩吃鸡手游模拟器对比...
腾讯正版授权的吃鸡手游已经上线一段时间了,和PC版相比还原度算是很高了,所以人气相当火爆.最关键的是,各大PC安卓模拟器纷纷宣布支持正版吃鸡手游,这是不是意味着电脑配置不够强的玩家,可以用电脑加键鼠来 ...
- 荒野乱斗手游怎么在电脑上玩 荒野乱斗手游模拟器教程
<荒野乱斗>是Supercell旗下开发的全新射击游戏.游戏将每场对战时间定为3分钟,玩家可以在3分钟内享受有别以往的刺激玩法,体验你来我往的激烈对决.游戏除有3v3玩法,还包含3位玩家对 ...
- 隐世录手游如何在电脑上玩 隐世录手游模拟器玩法教程
<隐世录>手游是一款角色扮演RPG手游,极具带入感的剧情演绎一段全新冒险人生,人物的设定都有着各自的差异,在这里你所遇到的NPC都有属于自己的独特个性,想要得到他们的帮助,你就得投其所好, ...
- 模拟器和服务器共享文件,多玩手游模拟器和电脑上的文件共享设置教程
多玩手游模拟器是yy多玩旗下的安卓手游模拟器,可以使用yy账号登录,可以玩多玩旗下所有手游,当然安卓模拟器都有需要和电脑上的文件共享的功能,那么怎么设置呢,下文是完整的多玩手游模拟器和电脑上的文件共享 ...
- 雷电模拟器多开cpu优化_哪个电脑手游模拟器好用 安卓手游模拟器测试对比排行榜...
源于http://sy.pcgames.com.cn/756/7567673.html不代表本人观点 电脑上玩手游的模拟器有好几款,什么模拟器好用?电脑玩手游应该用哪个模拟器?虽然针对不同的游戏不同的 ...
- android模拟器玩手游,手游模拟器使用说明 手游在电脑上玩的方法介绍
手游模拟器使用说明 手游在电脑上玩的方法介绍 2018-06-05 16:33:31来源:游戏下载编辑:评论(0) 随着移动互联网的不断发展,人们时间愈加聚焦于移动互联设备工具,移动手机端各种应用逐年 ...
- 无需安卓手游模拟器,电脑玩绝地求生:全军出击TC Games完美匹配手游服
全军出击怎么在电脑上玩?电脑玩刺激战场如何匹配手游服玩家?刺激战场手游模拟器哪个最流畅?最好用的全军出击手游模拟器是什么? tcgames电脑玩手游助手,目前最流畅的电脑玩吃鸡手游工具,无需安卓模拟器 ...
- 猎人X猎人手游如何在电脑上玩 猎人X猎人手游模拟器教程
<猎人×猎人>是一款大型多人在线的角色扮演动作手游,在独特的角色培养基础上,忠实原著,极致剧情还原,可以说算是圆了曾经的梦,虽然这个梦来得有点晚.接下来,和小编一起看下猎人X猎人手游模拟器 ...
最新文章
- transform总结
- matlab怎么重复一个数字,有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?用matlab编程怎么编...
- 图解Windows网络命令使用实例
- 深度学习arm MMU一篇就够了
- Web自适应布局你需要知道的所有事儿
- 信息收集之子域名查询--子域名扫描器: 子域名挖掘机 Subdomainbrute
- python实现二叉树和它的七种遍历
- P2014-选课【树形dp,背包】
- C++实现二维码扫码登录
- Vue学习笔记之10-组件化开发
- java材质_教程 - JAVA版材质包制作教程 | MineBBS 我的世界中文论坛
- VS2015调试无法加载PDB 文件
- 3dB带宽的概念解释
- CF 346 B vectorpair s[100]
- 华为新机预装鸿蒙,华为新机来了!预装鸿蒙OS,搭载麒麟9000
- 最全的的初中数学公式大全
- 浅谈基于openssl的多级证书,Multi-level CA的签发和管理,以及双向认证
- 设计师超爱用的六款软件
- Mac 安装 IntelliJ IDEA 以及激活方法
- 必测的支付漏洞(一)——使用fiddler篡改支付金额