CE搜索内存数据的原理
最近发现有朋友在玩游戏时, 使用一款工具来修改游戏的部分数据,作弊的效果, 也就是CE(Cheat Engine),这款工具是 delphi 编写的, 于是好奇, 然后瞬间想到API OpenProcess,ReadProcessMemory,WriteProcessMemory,VirtualQueryEx 这几个API,
OpenProcess是必须的(不讲R0),MSDN上说,Read/Wirte一个进程虚拟内存时, 要先打开进程, 带有读写虚拟内存权限才行,VirtualQueryEx 函数是用来检查内存属性,因为并不是所有的内存地址都是可读可以写, 所以很明白,
操作顺序是 OpenProcess -> ReadProcessMemory(WriteProcessMemory) ->VirtualQueryEx , 等等, 很多问题,
VirtualQueryEx 是检查内存属性的, 已经读写了, 还检查个啥子??
所以变成 OpenProcess ->VirtualQueryEx-> ReadProcessMemory(WriteProcessMemory),
问题又出现了, VirtualQueryEx 是检查内存属性的, 那么应该从那个地址检查呢??
Windows 32位 系统, 内存寻址范围是 2 的32次方, 4G左右, 也就是要寻址4G的地址??? 这个地址非常的大,
再看MSDN, 发现 内存地址分成了两部分, 用户空间 和 内核空间(本文里不讲内核空间), 各用了2G的空间, 而且用户空间是不能直接访问内核空间的, 所以确定了搜索范围是 2G 内,即 0x7FFFFFF 个地址, 好,这个范围不会错误了, 问题又来了, 2G的地址, 我怎么知道那个地址是可读, 那个地址是可写???, VirtualQueryEx函数MSDN上说了
VirtualQueryEx provides information about a region of consecutive pages beginning at a specified address that share the following attributes:
The state of all pages is the same (MEM_COMMIT, MEM_RESERVE, MEM_FREE, MEM_PRIVATE, MEM_MAPPED, or MEM_IMAGE).
If the initial page is not free, all pages in the region are part of the same initial allocation of pages.
The access granted to all pages is the same (PAGE_READONLY, PAGE_READWRITE, PAGE_NOACCESS, PAGE_WRITECOPY, PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_EXECUTE_WRITECOPY, PAGE_GUARD, or PAGE_NOCACHE).
The VirtualQueryEx function determines the attributes of the first page in the region and then scans subsequent pages until it scans the entire range of pages, or until it encounters a page with a nonmatching set of attributes. The function returns the attributes and the size of the region of pages with matching attributes, in bytes. For example, if there is a 40 megabyte (MB) region of free memory, and VirtualQueryEx is called on a page that is 10 MB into the region, the function will obtain a state of MEM_FREE and a size of 30 MB.
虽然我英语也是入门水平, MSDN说了, VirtualQueryEx 是可以检查出一个内存页面的属性,也就是要读写内存,属性就得是有读写属性(PAGE_READWRITE,PAGE_WRITECOPY,PAGE_EXECUTE_READWRITE,PAGE_EXECUTE_WRITECOPY), 那么到底是那个呢???
不多说, 跟踪下CE, 看看CE何如去搜索, 下面是跟踪的情况
只跟踪 VirtualQueryEx 函数即可

跟踪可知, CE从 0x0400000这个地址开始搜索, 为什么从这个地址开始搜索呢?? 这里不多说, 请去了解下PE结构, 函数的第三个参数lpBuffer放了页面内存的属性,页面大小,保护状态等信息, 根据大小, 可计算出下一个要检查的位置, 跟进发现, CE并没有读写属性的页面, 所以, 我在程序里也将没有读写属性的过虑了, 这样就可以降低搜索范围,

实现后的效果, 基本于CE一样

下面贴下核心代码

jpg改rar.adtxt { text-align: center }
.adtxt ul { margin: 5px 0; border-top: 1px solid #B9B9B9; border-bottom: 1px solid #B9B9B9; background-color: #F2F6FB; padding: 5px 0 }
.adtxt ul li { display: inline-block; font-size: 12px }
.adtxt ul li a { color: #333 }
CE搜索内存数据的原理的更多相关文章
- Elasticsearch由浅入深(十)搜索引擎:相关度评分 TF&IDF算法、doc value正排索引、解密query、fetch phrase原理、Bouncing Results问题、基于scoll技术滚动搜索大量数据
相关度评分 TF&IDF算法 Elasticsearch的相关度评分(relevance score)算法采用的是term frequency/inverse document frequen ...
- 内存数据网格hazelcast的一些机制原理
hazelcast作为一个内存数据网格工具,还算比较优秀,听说有Apache顶级项目使用它,值得研究下,使用文档可以直接看官方文档,但机制原理相关的资料基本没有,本人硬撸源码写的一些东西,跟大家分享一 ...
- 大数据组件原理总结-Hadoop、Hbase、Kafka、Zookeeper、Spark
Hadoop原理 分为HDFS与Yarn两个部分.HDFS有Namenode和Datanode两个部分.每个节点占用一个电脑.Datanode定时向Namenode发送心跳包,心跳包中包含Datano ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用 ...
- malloc内存分配与free内存释放的原理
malloc内存分配与free内存释放的原理 前段时间一直想看malloc的原理,在搜了好几篇malloc源码后遂放弃,晦涩难懂. 后来室友买了本深入理解计算机系统的书,原来上面有讲malloc的原理 ...
- ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...
- 重新学习MySQL数据库3:Mysql存储引擎与数据存储原理
重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有 ...
随机推荐
- printf 的场宽
这个经常忘记,从百度直到上搜到的,做个记录. 可以在"%"和字母之间的数字表示最大场宽.例如: %3d 表示输出3位整型数, 不够3位右对齐.%9.2f 表示输出场宽为9的浮点数, ...
- Oracle 修改现有列的数据类型
如果表中有数据,Oracle是不能修改其数据类型的.但可以通过新建一个临时列,将要修改列的数据复制到临时列中,删除原列再修改临时列的名字.这样说好像有点拗口,分步解说一下. 表AC_REG中有列:is ...
- 【leetcode】Largest Number ★
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- 【leetcode】Balanced Binary Tree(middle)
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- va_list使用
http://www.programfan.com/blog/article.asp?id=41937
- Excel统计工作簿sheet个数
按Alt+F11调出VBE后,在"视图"-“立即窗口”中输入: debug.print ThisWorkbook.Sheets.Count 回车后就可看到工作表数量.
- Xcode找不到模拟器
今天新建的工程,突然发现模拟器找不到了,之前遇到过忘记怎么解决了,于是再次记录下解决方法. 首先说下问什么找不到模拟器了,原因就是之前运行的版本和现在xcode的版本不同(的确,我从 Xcode7.3 ...
- September 12th 2016 Week 38th Monday
After all, tomorrow is another day. 不管怎样,明天又是全新的一天. Another day? Maybe. Remember when you reach for ...
- linux安装软件
安装方式一: RPM包安装 安装方式二:yum包安装 安装方式三:源码包安装 安装方式四:脚步安装包 视频教程
- 让chrome的控制台更高大上(装B用)
作为一名屌丝前端程序员,在装B的道路上是越走越远了!废话不多说,直接先上几张图:我的Element是这样的: 我的console是这个样子的: 我的Timeline是这个样子的: ---------- ...