如何在另一个进程的内存中搜索字符串
How can I search for a string in the memory of another process?
目前我正在使用这个函数,这是我通过阅读互联网上几个松散相关的问题拼凑而成的。我遇到的问题是我第一次运行它时它返回了一个错误,但不幸的是我无法重现它。现在当我运行它时,它每次都只返回 0。
DWORD GetAddressOfString(char *input)
{
unsigned char *p = NULL;
MEMORY_BASIC_INFORMATION info;
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, _processID);
for (p = NULL; VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info); p += info.RegionSize)
{
if (info.State == MEM_COMMIT && (info.Type == MEM_MAPPED || info.Type == MEM_PRIVATE))
{
char *buffer = new char[info.RegionSize];
SIZE_T bytesRead;
ReadProcessMemory(process, p, &buffer, info.RegionSize, &bytesRead);
for (int i = 0; i <= (info.RegionSize - sizeof(input)); i++)
{
if (memcmp(input, &buffer[i], sizeof(input)) == 0)
{
return i;
}
}
}
}
}
这是一个快速而肮脏的版本,可以搜索数据本身。 如果您打开记事本++,键入"SomeDataToFind",将 pid 替换为正确的值并运行它,它也应该找到数据。 它可能会给你一些开始和修饰以满足你的需求的东西。
您的代码搜索了错误的长度,返回了错误的偏移量,像筛子一样泄漏了内存,并且并不总是返回未定义行为的值。
#include <Windows.h>
#include <iostream>
#include <string>
#include <vector>
char* GetAddressOfData(DWORD pid, const char *data, size_t len)
{
HANDLE process = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, pid);
if(process)
{
SYSTEM_INFO si;
GetSystemInfo(&si);
MEMORY_BASIC_INFORMATION info;
std::vector<char> chunk;
char* p = 0;
while(p < si.lpMaximumApplicationAddress)
{
if(VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info))
{
p = (char*)info.BaseAddress;
chunk.resize(info.RegionSize);
SIZE_T bytesRead;
if(ReadProcessMemory(process, p, &chunk[0], info.RegionSize, &bytesRead))
{
for(size_t i = 0; i < (bytesRead - len); ++i)
{
if(memcmp(data, &chunk[i], len) == 0)
{
return (char*)p + i;
}
}
}
p += info.RegionSize;
}
}
}
return 0;
}
int main()
{
const char someData[] = "SomeDataToFind";
std::cout << "Local data address: " << (void*)someData << "n";
//Pass whatever process id you like here instead.
DWORD pid = GetCurrentProcessId();
char* ret = GetAddressOfData(pid, someData, sizeof(someData));
if(ret)
{
std::cout << "Found: " << (void*)ret << "n";
}
else
{
std::cout << "Not foundn";
}
return 0;
}
相关文章:
- 我可以做些什么来提高内存搜索速度?
- 在VS2017中搜索内存
- 图上的深度优先搜索算法中的内存泄漏
- 搜索为什么不分配内存
- 内存连续性和搜索树
- 在另一个进程的内存中搜索字符串的每个匹配项
- 在内存中搜索字符串会导致崩溃
- 如何在另一个进程的内存中搜索字符串
- 我可以将可搜索字符设备“/dev/mem_8”映射到内存并使用x86_64指令访问它吗?
- 二进制搜索树(如何在插入时检查内存是否不足)
- 在内存块中搜索2个连续字符
- 为什么我在这里泄漏内存(深度优先搜索)c ++
- 在C++中使用带有二进制搜索的new动态内存分配
- 在大内存映射文件中搜索
- 如何在程序的内存中搜索图像/png/jpeg/任何其他类型并显示它
- 我如何在另一个进程的内存中通过正则表达式搜索字符串
- 如何在一个文件上执行二进制搜索,而不是在c++中一次将它全部读入内存
- 内存泄漏二叉搜索树
- 在大内存中搜索字符串.DMP文件
- 搜索进程内存