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# 后序遍历(左->右-> ...
随机推荐
- Spring框架的AOP技术(注解方式)
1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...
- Oracle 基础表查询
--查询所有用户表的数据 SELECT * FROM ALL_TABLES WHERE OWNER='USER_NAME' --如果是用该用户登录使用以下语句: SELECT * FROM USER_ ...
- 757A Gotta Catch Em' All!
A. Gotta Catch Em' All! time limit per test 1 second memory limit per test 256 megabytes input stand ...
- [SoapUI] Datasink怎么显示每次循环的结果
https://www.soapui.org/reporting/the-report-datasink.html
- 开启多个tomcat 注意
1. 将tomcat 复制到另一个文件夹 2. 更改 tomcat 文件夹中 conf/ server.xml 文件 .共3个地方. 1. shutdown 的port 2. connector ...
- python panda库自动去重
http://blog.csdn.net/xinxing__8185/article/details/48022401
- 负值之美:负margin在页面布局中的应用
本文转载自:http://www.topcss.org/?p=94,有修改. 负数给人总是一种消极.否定.拒绝之感,不过有时利用负margin可以达到奇妙的效果,今天就表一表负值在页面布局中的应用.这 ...
- Linux命令:sed
简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...
- HDU 5957 Query on a graph (拓扑 + bfs序 + 树剖 + 线段树)
题意:一个图有n个点,n条边,定义D(u,v)为u到v的距离,S(u,k)为所有D(u,v)<=k的节点v的集合 有m次询问(0<=k<=2): 1 u k d:将集合S(u,k)的 ...
- SPSS-相关性和回归分析(一元线性方程)案例解析
任何事物和人都不是以个体存在的,它们都被复杂的关系链所围绕着,具有一定的相关性,也会具备一定的因果关系,(比如:父母和子女,不仅具备相关性,而且还具备因果关系,因为有了父亲和母亲,才有了儿子或女儿), ...