c语言,如何实现搜索内存数据

author author     2023-04-09     392

关键词:

我大概知道要使用openprocess ReadProcessMemory ,但是具体要怎么搜索内存数据呢,既然要在内存中搜那么ReadProcessMemory函数第二参数的起始位置应该在哪,用什么类型数据装读到的内容 一次读多大数据?并且读取完一段数据之后 下一段的内存该如何去搜索?

一般的讲,内存里边虽然说有*G的空间,但有些地方只是挂名存在,实际上是不存在的,所以访问了就会出错,所以就要判断内存是不是为有效地址,
就要用到VirtualQuery获取指定内存属性, 根据属性来判断能不能进行读取,
如果能读取就从调用VirtualQuery中得到的内存信息minfo中获取当前内存地址的有效区域的大小,然后再进行读取. 你可以用VC调试来看看,不能访问的内存就用?号来表示.由于搜所内存是一种运算量庞大的工作,所以,在对比处理要作速度优化处理. 如果数据大于4字节,请用 long 的数据格式来作对比运算, long 是 char 的处理速度的三倍以上,(个人测试的) 用long处理前端数据,再用 char 作收尾工作. 这是对比处理了.流程就有以下:
判断地址的有效性->定好搜所范围->进行对比->输出结果.

StartAdd 开始地址
EndAdd 结束地址
Data 查找的数据
DataSize 数据大小
void *FindMemory(DWORD StartAdd,DWORD EndAdd,void *Data,DWORD DataSize)

MEMORY_BASIC_INFORMATION minfo;
DWORD rt;
while(StartAdd<EndAdd)

::VirtualQuery((void*)StartAdd,&minfo,sizeof(MEMORY_BASIC_INFORMATION));
if(minfo.AllocationProtect)
if(minfo.State==MEM_COMMIT||minfo.State==MEM_FREE)

char *s=(char*)StartAdd,*e=s+minfo.RegionSize;
for(;s<e&&s+DataSize<=e;s++)
if(memcmp(s,Data,DataSize)==0)
return s;

StartAdd=(DWORD)minfo.BaseAddress+minfo.RegionSize;

return 0;
参考技术A 那就要看你要搜索什么数据了,若是数字,一般是4字节。内存中可能是这样的:
00110011
那你就每4字节搜一次:
0011 0110 1100 1001 0011
其他的如字符串等就麻烦了。
望采纳。
参考技术B 那就要看你要搜索什么数据了,若是数字,一般是4字节。内存中可能是这样的:
00110011
那你就每4字节搜一次:
0011 0110 1100 1001 0011
其他的如字符串等就麻烦了。
望采纳。追问

可是我不知道其他程序的内存其实位置啊 难道从位置0开始搜索? 如果是搜索4字节 那之后呢 ,内存的位置就变成了0X00000004?在这个位置继续在搜索4个字节?

看到你可以导出百度地图搜索出来的数据,是如何实现的?谢谢!

参考技术A找一门合适的语言如VB,C#,调用API,就可以了。建立几个下拉框:省份、地级市、区县。这样就可以选择性地导出你需要的数据了。.name,.telephone,.address,导出到EXCEL就可以了。 参考技术B选择省份城市,输入关键词,比如... 查看详情

编程中访问对象

...接访问地址,可实现对数据的操作。    C语言中通过定义变量实现,变量名在C语言中可以认为是地址的别名。  2.间接访问:存储在内存中的数据不能直接访问操作,只能通过存储其地址的“变量”实... 查看详情

c语言如何实现结构体的深度复制

求助大神  使用memcpy即可,比如你另外建立一个结构体sortbook[1000]用来保存排序结果,将book中的第i个元素赋值到sortbook的第j个元素中memcpy(&sortbook[j],&book[i],sizeof(structbook));用这个函数需要#include<string.h>  函数原型  void... 查看详情

c语言数据的存储

前言之前写过一篇关于​​C语言内存管理​​的文章,对在C语言中使用内存中需要注意的一些问题和解决办法做了一些总结。实际上,内存终归是要存储数据的,这次对C语言中的数据存储做一些讨论。本文结构:C语言数据类... 查看详情

c语言编程程序的内存如何布局(代码片段)

在c语言中,每个变量和函数有两个属性:数据类型和数据的存储类别。C语言中局部变量和全局变量变量的存储类别(static,extern,auto,register)1.从变量的作用域划分变量(即从空间)角度来分1.全局变量2.局部变量2.从... 查看详情

c语言实现通讯录管理系统(结构体+枚举+动态内存开辟+文件操作+线性表存放数据)(代码片段)

本篇文章将用C语言代码实现一个通讯录管理系统,本片文章博主将会运用到架构提,枚举,动态内>存开辟和文件操作等。这里存放数据的结构是线性表。博主码云gitee链接:https://gitee.com/byte-binxin(需要源... 查看详情

[数据结构进阶-c++]二叉搜索树bstree

...经了解过了。在之前,​​数据结构初阶​​​是使用C语言实现的,我们进入进阶数据结构之后,将使用C++语言来实现。本篇文章我们将学习了解二叉搜索树-​​二叉树​​的进阶。1.二叉搜索树1.1二叉搜索树的概念二叉搜索... 查看详情

c语言中如何实现模块化?

参考技术AC语言中用函数来实现程序模块。模块化程序设计是将一个大的任务分解成若干个小任务,再将小任务分解成更小的任务,直到每一个任务都只完成一个独立功能。这样的每个任务都叫做模块,C语言中模块是用函数来实... 查看详情

c语言学习内存操作函数之------->memcpymemmove详解与手动实现(代码片段)

内存操作函数一、memcpy二、memmoveC语言中有时需要对内存空间进行操作,下面详解三个常用的内存操作函数函数memcpymemmove一、memcpy1.memcpy函数简介memcpy——————————参数(void*destination,constvoid*source,size_tnum)返回值void*作... 查看详情

深入理解c

目的搞清楚一此比较特殊的C代码对应的汇编语言是什么。在实际机器中的表现形式是什么样的。方法通过查看编译器生成的汇编代码调试时查看反汇编代码常用操作将常量装入REG将内存里数据装入REG将REG里数据装入内存练习将... 查看详情

数据结构初阶:动态顺序表的功能实现(用c语言实现,附图分析)(代码片段)

文章目录一、动态版本顺序表二、动态顺序表的实现思路三、动态顺序表内存布局图四、初始化顺序表和内存释放五、顺序表接口实现:1.尾部插入数据2.头部插入数据3.尾部删除数据4.头部删除数据5.显示数据6.查找数据7.在... 查看详情

godance搜索引擎搜索引擎集群模块实现笔记(代码片段)

文章目录前言正文分布式一致如何去做?超时RPC如何去做?分包代码规范问题日志同步问题如何去抽象操作不同类型的日志(日志增加)如何实现Raft的日志一致性如何设计内存中的状态日志的数据结构节点删除策... 查看详情

c语言如何实现-数组排序,二分查找

给定已经排好序的n个元素,现在要在这n个元素中找出一特定元素x。顺序搜索的方法是逐个比较,直至找出元素。二分搜索则利用了元素间的次序关系,可大大提高效率。二分法的基本思想是将n个元素分成个数大致相同的两半... 查看详情

c++内存管理(代码片段)

...C++的内存分布作为引入,介绍C++不同于C语言的内存管理方式(newdelete对比mallocfree),最后为了加深读者的理解,会介绍new和delete的底层实现原理。文章目录1.C/C++中程序内存分布1.1内存分布图1.2小... 查看详情

用c语言如何获取内存地址?

需要实现在windows下读取内存,用c语言书写。想请教各位高手该如何获取内存地址?对读写内存这整个过程都不太了解。请帮忙,谢谢!这里说的读取内存是指写程序直接读取电脑的内存,在哪台电脑上读取的就是它的内存我是... 查看详情

c_cppc语言中的二叉搜索树实现(代码片段)

查看详情

c语言函数指针,敲黑白,讲重点,如何定义函数指针?

...量中,然后,通过指针变量访问函数名指向的函数。在C语言中,提供了函数指针变量,可以存放函数名表示的地址。函数指针变量的定义格式如下:返回数据类型(*函数指针变量名)(形参列表)对比函数的定义如下:返回数据类型... 查看详情

设c语言中,一个int型数据在内存中占2个字节,则int型数据的取值范围为如何计算的?

在C语言中,一个整形的变量是两个字节,那么就是16位,那么它的取值范围就是65536。,-32768~+32768参考技术Aint类型是有符号的,如果它在内存中占2个字节,则取值范围是:-2^15~2^15-1,即-32768~32767。 参考技术B这个跟语言关系不... 查看详情