#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++实现 特征码遍历相关推荐

  1. 安卓模拟器刷小米系统_小米安卓模拟器|小米手游模拟器下载 v1.0.0.8 电脑版_小皮网...

    小米手游模拟器是一款强大的电脑安卓模拟器.小米手游模拟器采用全新的vb虚拟机技术,可完美兼容运行各种安卓应用和游戏,告别手机玩游戏带来的各种困扰. 小米手游模拟器特色介绍: 1.小米手游模拟器等你来玩 ...

  2. 吃鸡战歌用计算机,电脑玩刺激战场用什么模拟器好 电脑玩吃鸡手游模拟器对比...

    腾讯正版授权的吃鸡手游已经上线一段时间了,和PC版相比还原度算是很高了,所以人气相当火爆.最关键的是,各大PC安卓模拟器纷纷宣布支持正版吃鸡手游,这是不是意味着电脑配置不够强的玩家,可以用电脑加键鼠来 ...

  3. 荒野乱斗手游怎么在电脑上玩 荒野乱斗手游模拟器教程

    <荒野乱斗>是Supercell旗下开发的全新射击游戏.游戏将每场对战时间定为3分钟,玩家可以在3分钟内享受有别以往的刺激玩法,体验你来我往的激烈对决.游戏除有3v3玩法,还包含3位玩家对 ...

  4. 隐世录手游如何在电脑上玩 隐世录手游模拟器玩法教程

    <隐世录>手游是一款角色扮演RPG手游,极具带入感的剧情演绎一段全新冒险人生,人物的设定都有着各自的差异,在这里你所遇到的NPC都有属于自己的独特个性,想要得到他们的帮助,你就得投其所好, ...

  5. 模拟器和服务器共享文件,多玩手游模拟器和电脑上的文件共享设置教程

    多玩手游模拟器是yy多玩旗下的安卓手游模拟器,可以使用yy账号登录,可以玩多玩旗下所有手游,当然安卓模拟器都有需要和电脑上的文件共享的功能,那么怎么设置呢,下文是完整的多玩手游模拟器和电脑上的文件共享 ...

  6. 雷电模拟器多开cpu优化_哪个电脑手游模拟器好用 安卓手游模拟器测试对比排行榜...

    源于http://sy.pcgames.com.cn/756/7567673.html不代表本人观点 电脑上玩手游的模拟器有好几款,什么模拟器好用?电脑玩手游应该用哪个模拟器?虽然针对不同的游戏不同的 ...

  7. android模拟器玩手游,手游模拟器使用说明 手游在电脑上玩的方法介绍

    手游模拟器使用说明 手游在电脑上玩的方法介绍 2018-06-05 16:33:31来源:游戏下载编辑:评论(0) 随着移动互联网的不断发展,人们时间愈加聚焦于移动互联设备工具,移动手机端各种应用逐年 ...

  8. 无需安卓手游模拟器,电脑玩绝地求生:全军出击TC Games完美匹配手游服

    全军出击怎么在电脑上玩?电脑玩刺激战场如何匹配手游服玩家?刺激战场手游模拟器哪个最流畅?最好用的全军出击手游模拟器是什么? tcgames电脑玩手游助手,目前最流畅的电脑玩吃鸡手游工具,无需安卓模拟器 ...

  9. 猎人X猎人手游如何在电脑上玩 猎人X猎人手游模拟器教程

    <猎人×猎人>是一款大型多人在线的角色扮演动作手游,在独特的角色培养基础上,忠实原著,极致剧情还原,可以说算是圆了曾经的梦,虽然这个梦来得有点晚.接下来,和小编一起看下猎人X猎人手游模拟器 ...

最新文章

  1. transform总结
  2. matlab怎么重复一个数字,有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?用matlab编程怎么编...
  3. 图解Windows网络命令使用实例
  4. 深度学习arm MMU一篇就够了
  5. Web自适应布局你需要知道的所有事儿
  6. 信息收集之子域名查询--子域名扫描器: 子域名挖掘机 Subdomainbrute
  7. python实现二叉树和它的七种遍历
  8. P2014-选课【树形dp,背包】
  9. C++实现二维码扫码登录
  10. Vue学习笔记之10-组件化开发
  11. java材质_教程 - JAVA版材质包制作教程 | MineBBS 我的世界中文论坛
  12. VS2015调试无法加载PDB 文件
  13. 3dB带宽的概念解释
  14. CF 346 B vectorpair s[100]
  15. 华为新机预装鸿蒙,华为新机来了!预装鸿蒙OS,搭载麒麟9000
  16. 最全的的初中数学公式大全
  17. 浅谈基于openssl的多级证书,Multi-level CA的签发和管理,以及双向认证
  18. 设计师超爱用的六款软件
  19. Mac 安装 IntelliJ IDEA 以及激活方法
  20. 必测的支付漏洞(一)——使用fiddler篡改支付金额

热门文章

  1. [转]中国佛学66句震撼世界的禅语
  2. JavaScript代理模式之四大代理
  3. Spring boot Mybatis-Plus数据库单测实战(三种方式)
  4. 给定3个数字,求出这3个数字中的最大值,并将最大值输出
  5. vue关于时间顺序排序
  6. [音乐]阿桑的《叶子》
  7. 【小米8手机的状况】
  8. 【卡特兰数】【高精】WZK打雪仗(war)
  9. 移动通信的主要测量指标及注意事项(转)
  10. 【软件测试技术期末复习选择题】