研究了一天,初步写成。测试了几个没发现bug,如果有问题可以跟贴共同讨论

代码如下:

需要引入的头文件:

#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[i] = (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;
}

转载于:https://www.cnblogs.com/rogee/archive/2010/10/11/1847953.html

根据特征码搜索基址,VC写的源码相关推荐

  1. c语言写辅助基址是进程名,本人纯小白问下,知道基址,有辅助源码,怎么更新辅助中的基址...

    本帖最后由 ewq3391093 于 2016-8-28 20:27 编辑 首先本人纯小白问下,知道基址,有辅助源码,怎么更新辅助中的基址如题.再附上辅助源码http://pan.baidu.com/ ...

  2. java 手写签名,signature java html5+ 手写签名 源码 Develop 238万源代码下载- www.pudn.com...

    文件名称: signature下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 491 KB 上传时间: 2013-08-03 下载次数: 17 提 供 者: 孙晨 ...

  3. Hhadoop-2.7.0中HDFS写文件源码分析(二):客户端实现(1)

    一.综述 HDFS写文件是整个Hadoop中最为复杂的流程之一,它涉及到HDFS中NameNode.DataNode.DFSClient等众多角色的分工与合作. 首先上一段代码,客户端是如何写文件的: ...

  4. Django的rest_framework的视图之Mixin类编写视图源码解析...

    Django的rest_framework的视图之Mixin类编写视图源码解析 Mixin类编写视图 我们这里用auther表来做演示,先为auther和autherdetail写2个url 1 2 ...

  5. 【手写 Promise 源码】第八篇 - 完善 Promise 并通过 promise-aplus-tests 测试

    一,前言 上一篇,实现 Promise 对返回值 x 各种情况的分析和处理,主要涉及以下几个点: 回顾了相关的 Promise A+ 规范内容: 根据 Promise A+ 规范描述和要求,实现了核心 ...

  6. 全新音乐搜索器多站合一源码V1.7.7修复版+PHP内核

    正文: 全新音乐搜索器多站合一源码V1.7.7修复版+PHP内核,PHP版本要求:5.6 修复咪咕音乐/修复酷我音乐/修复5sing原唱及翻唱/修复qq音乐/修复百度音乐,更新修复各大音乐网站接口数据 ...

  7. Node进阶——之事无巨细手写Koa源码

    作者 rocYoung Koa是一个基于Node.js的Web开发框架,特点是小而精,对比大而全的Express(编者按:此处是相对来说,国内当然是有Egg.js和ThinkJS),两者虽然由同一团队 ...

  8. Node进阶—事无巨细手写Koa源码

    作者 rocYoung Koa是一个基于Node.js的Web开发框架,特点是小而精,对比大而全的Express(编者按:此处是相对来说,国内当然是有Egg.js和ThinkJS),两者虽然由同一团队 ...

  9. node进阶——之事无巨细手写koa源码(转)

    https://juejin.im/post/5ba48fc4e51d450e704277fa koa是一个基于nodejs的web开发框架,特点是小而精,对比大而全的express,两者虽然由同一团 ...

  10. 【180630】VC++数独游戏源码

    VC++数独游戏源码 源码下载地址:点击下载 备用下载地址:点击下载

最新文章

  1. Android Studio 配置OpenCV4.4.0 不用安装OpenCV Manager (泪崩居然用了礼拜天2天的时间居然还没配置成功,今天又看了下配置成功了)
  2. o oia ospf 路由优先_OSPF基本配置及OSPF特殊区域配置
  3. pytorch 区间loss 损失函数
  4. PAT (Basic Level) 1080 MOOC期终成绩(模拟+stl)
  5. vlc android 移植版编译
  6. Java从零开始学十四(包和访问控制)
  7. 一阶低通滤波器算法实现
  8. 2000/XP系统蓝屏原因与解决
  9. 一线互联网公司Java高级面试题总结
  10. 苹果Mac设备丢失时怎样利用激活锁保护隐私信息?
  11. 知名的医药管理软件有哪些,说说看
  12. 女神瓦萨比-小黑中国力鉴淘宝给力明星店
  13. Python实现云词图效果
  14. 阿里云 (ECS 部署Javaweb 以及虚拟机操作)
  15. 刺激战场春节版年兽全网最详细位置,另附刺激战场更新内容
  16. Antd表单项根据后端返回字段显示错误的校验提示语
  17. 数据结构和算法学习网站
  18. 川土微电子 | 如何隔离 RS-485 系统
  19. 系统移植丨使用傲梅分区助手和EasyBCD迁移系统盘
  20. 【推荐系统】EMBEDDING 在大厂推荐场景中的工程化实践

热门文章

  1. 使用MySQL存储过程给表批量造数据
  2. 计算机安全模式无法启动,电脑无法启动,电脑安全模式进不去解决方法大全?...
  3. CSS盒子模型居中方法,附超全教程文档
  4. 小甲鱼老师目前所有视频教程下载地址
  5. (一)Python小甲鱼入门教程——第一个小游戏001-004
  6. kubernetes快速切换集群和名称空间
  7. 软件开发职业发展路径
  8. ROVIO安装运行及保存轨迹用evo评估
  9. 集合论—关系的自反、对称和传递闭包
  10. 笔记本电脑怎么拆开后盖_怎么拆解笔记本?新手拆解笔记本注意事项