C++实现-特征码遍历
//需要引入的头文件:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
union Base
{
DWORD address;
BYTE data[];
};
/************************************************************************/
/* 函数说明:根据特征码扫描基址
/* 参数一:process 要查找的进程
/* 参数二:markCode 特征码字符串,不能有空格
/* 参数三:特征码离基址的距离,默认距离:1
/* 参数四:findMode 扫描方式,找到特征码后,默认为:1
/* 0:往上找基址(特征码在基址下面)
/* 1:往下找基址(特征码在基址上面)
/* 参数五:offset 保存基址距离进程的偏移,默认为:不保存
/************************************************************************/
DWORD ScanAddress(HANDLE process, char *markCode,
DWORD distinct = , DWORD findMode = ,
LPDWORD offset = NULL)
{
//起始地址
const DWORD beginAddr = 0x00400000;
//结束地址
const DWORD endAddr = 0x7FFFFFFF;
//每次读取游戏内存数目的大小
const DWORD pageSize = ; ////////////////////////处理特征码/////////////////////
//特征码长度不能为单数
if (strlen(markCode) % != ) return ;
//特征码长度
int len = strlen(markCode) / ;
//将特征码转换成byte型
BYTE *m_code = new BYTE[len];
for (int i = ; i < len; i++){
char c[] = {markCode[i*], markCode[i*+], '\0'};
*m_code = (BYTE)::strtol(c, NULL, );
} /////////////////////////查找特征码/////////////////////
BOOL _break = FALSE;
//用来保存在第几页中的第几个找到的特征码
int curPage = ;
int curIndex = ;
Base base;
//每页读取4096个字节
BYTE page[pageSize];
DWORD tmpAddr = beginAddr;
while (tmpAddr <= endAddr - len){
::ReadProcessMemory(process, (LPCVOID)tmpAddr, &page, pageSize, );
//在该页中查找特征码
for (int i = ; i < pageSize; i++){
for (int j = ; j < len; j++){
//只要有一个与特征码对应不上则退出循环
if (m_code[j] != page[i + j])break;
//找到退出所有循环
if (j == len - ){
_break = TRUE;
if (!findMode){
curIndex = i;
base.data[] = page[curIndex-distinct-];
base.data[] = page[curIndex-distinct-];
base.data[] = page[curIndex-distinct-];
base.data[] = page[curIndex-distinct-];
}else{
curIndex = i + j;
base.data[] = page[curIndex+distinct+];
base.data[] = page[curIndex+distinct+];
base.data[] = page[curIndex+distinct+];
base.data[] = page[curIndex+distinct+];
}
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 = , DWORD findMode = )
{
DWORD offset;
DWORD call = ScanAddress(process, markCode, distinct, findMode, &offset);
call += offset;
if(findMode) call = call + + 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", , );
printf("人物基址:%X\n",addr);
DWORD call = ScanCall(process, "5557535152C6400801E8");
printf("call基址:%X\n",call);
::CloseHandle(process);
return ;
}
C++实现-特征码遍历的更多相关文章
- CF特征码遍历
HOOK_游戏代码 8B 00 8B 08 8B 91 A8 00 00 00 地址-15 4E5E954E5EA 44E5E95DIRECT 从733E00开始搜 6B 00 94 51 6C 地址 ...
- MyCCL特征码定位原理学习
这段时间学习WEB方面的技术,遇到了木马免杀特征码定位的问题,这里做一下学习笔记. 这里对MyCCL的分块原理做一下探究 对指定文件生成10个切块 对指定的木马进行切块后,文件列表是这样的. 注意这里 ...
- 遍历PspCidTable表检测隐藏进程
一.PspCidTable概述 PspCidTable也是一个句柄表,其格式与普通的句柄表是完全一样的,但它与每个进程私有的句柄表有以下不同: 1.PspCidTable中存放的对象是系统中所有的进程 ...
- PE文件格式对定位病毒特征码的作用
本文主要从杀毒软件查杀病毒的原理出发,分析PE文件格式在杀毒软件定位病毒特征码中的作用.杀毒软件通过快速准确定位病毒特征码,对伪装,隐藏,变种病毒进行查杀. 一.杀毒软件查杀病毒的原理概述 对于操作系 ...
- windows:根据特征码查找内核任意函数
在windows平台做逆向.外挂等,经常需要调用很多未导出的内核函数,怎么方便.快速查找了?可以先用IDA等工具查看硬编码,再根据硬编码定位到需要调用的函数.整个思路大致如下: 1.先查找目标模块 ...
- PHP中遍历XML之SimpleXML
简单来讲述一些XML吧,XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.XML是当今用于传输数据的两大工具之一,另外一个是json. 我们在PHP中使用XML也是用来传输数据, ...
- 邻接表的广度优先遍历(java版)
到 0 的权是 91 到 2 的权是 31 到 3 的权是 61 到 4 的权是 7 2 到 0 的权是 22 到 3 的权是 5 3 到 0 的权是 33 到 4 的权是 1 4 到 2 的权是 2 ...
- 邻接矩阵的深度优先遍历(java版)
这是一个有向边带权的图 顶点数组:[v0, v1, v2, v3, v4] 边数组: v0 v1 v2 v3 v4 v0 6 v1 9 3 v2 2 5 v3 1 v4 package com.dat ...
- 二叉树的创建和遍历(C版和java版)
以这颗树为例:#表示空节点前序遍历(根->左->右)为:ABD##E##C#F## 中序遍历(左->根->右)为:#D#B#E#A#C#F# 后序遍历(左->右-> ...
随机推荐
- jmeter 常见问题汇总
文件读取中文乱码: 读取CSV文件,出现中文乱码,纠正方式如下: txt文件乱码 在用到该变量的请求上加上UTF-8 post请求 返回“ Content type 'application/x-ww ...
- DB2与oracle类型对比
本文摘自http://www.cnblogs.com/cy163/archive/2010/11/17/1880280.html 做过DB2数据库应用迁移的工程师,了解IBM MTK工具在迁移过程中所 ...
- PAT 1020 月饼 (25)(精简版代码+思路+推荐测试用例)
1020 月饼 (25)(25 分)提问 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是 ...
- 类方法 isAssignableFrom、instanceof 和 asSubclass
类方法 isAssignableFrom.instanceof 和 asSubclass Spring 框架 CollectionFactory 的 asEnumType 方法使用 "类.a ...
- Hadoop 系列(二)安装配置
Hadoop 系列(二)安装配置 Hadoop 官网:http://hadoop.apache.or 一.Hadoop 安装 1.1 Hadoop 依赖的组件 JDK :从 Oracle 官网下载,设 ...
- 设计模式-生成者模式之c#代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 用Notepad++在文本文件里快速在每行头尾都加上指定的内容(转载)
- 2018.08.22 NOIP模拟 string(模拟)
string [描述] 给定两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母. 你可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字 ...
- hdu-1698(线段树,区间修改)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 注意:用位运算会更快,不然超时. #include<iostream> #inclu ...
- bootstrap-treeview的 简单使用
理论:http://blog.csdn.net/babyxue/article/details/73835444 插依赖Bootstrap 和jQuery <link href="~/ ...