在一天的大部分时间里,我一直在为此苦苦挣扎,以各种方式重写并引用文档甚至其他人的代码,但是无论我做什么,我似乎都无法使我的代码正常工作。
我的进程中的一个线程正在尝试搜索另一个线程的内存。我正在尝试在特定模块中修复某些问题,但是我不确定如何缩小搜索范围,是否值得缩小搜索范围,所以现在它只是搜索整个过程,甚至可能是搜索整个过程?谁知道?
每当我锁定调试器时,我都可以找到这组字节就好了(相当于mov rsi, rax; test dil, 1; jz short loc_...
),但是对于我来说,我似乎一辈子都无法找到它。
我发现我确实很少找到它,这绝对意味着出于某种原因,我的搜索似乎正在访问...很好,无关紧要的内容,并且可能纯粹是偶然发现的。我一天吸收了如此多的名称和概念,我认为它只是摆在我头上。怎么了?
Addon.cpp
#include <iostream>
#include "Addon.h"
#include <sstream>
#include <vector>
int pattern[] = { 0x48, 0x8B, 0xF0, 0x40, 0xF6, 0xC7, 0x01, 0x74, 0x3E };
int replace[] = { 0x48, 0x8B, 0xF0, 0x40, 0xF6, 0xC7, 0x00, 0x75, 0x3E };
DWORD WINAPI background(LPVOID lpParam)
{
HANDLE h = GetCurrentProcess();
while (true) //for now
{
MEMORY_BASIC_INFORMATION mbi;
unsigned char* p = NULL;
for (p = NULL; VirtualQueryEx(h, p, &mbi, sizeof(mbi)) == sizeof(mbi); p += mbi.RegionSize)
{
std::vector<char> buffer;
if (mbi.State == MEM_COMMIT && mbi.Type == MEM_MAPPED || mbi.Type == MEM_PRIVATE)
{
SIZE_T bytes_read;
buffer.resize(mbi.RegionSize);
ReadProcessMemory(h, p, &buffer[0], mbi.RegionSize, &bytes_read);
buffer.resize(bytes_read);
}
std::vector<char> new_tail(buffer.end() - 9, buffer.end());
for (char t : old_tail)
buffer.push_back(t);
old_tail = new_tail;
if (std::search(buffer.begin(), buffer.end(), std::begin(pattern), std::end(pattern) != buffer.end())
{
MessageBoxA(NULL, "Found", "Found", NULL);
}
}
}
return 0;
}
根据要求添加了其他文件。
Addon.h
#pragma once
#include <iostream>
#include "windows.h"
#ifdef ADDON_EXPORTS
#define ADDON_API __declspec(dllexport)
#else
#define ADDON_API __declspec(dllimport)
#endif
DWORD WINAPI background(LPVOID lpParam);
dllmain.cpp
#include "windows.h"
#include <string>
#include <tchar.h>
#include "Addon.h"
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
DWORD thread;
CreateThread(NULL, 0, background, 0, 0, &thread);
if (thread == NULL)
{
MessageBoxA(NULL, "Failed to start crash fix", "Error", MB_ICONERROR);
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
答案 0 :(得分:0)
问题出在pattern
(和replace
)的定义中。它定义为int,而应为char。正如特德·林格莫(Ted Lyngmo)所说,“有时候答案会以正确的眼光盯着你。”