在内存中查找和替换模式

时间:2018-12-15 01:23:41

标签: c++ memory

在一天的大部分时间里,我一直在为此苦苦挣扎,以各种方式重写并引用文档甚至其他人的代码,但是无论我做什么,我似乎都无法使我的代码正常工作。

我的进程中的一个线程正在尝试搜索另一个线程的内存。我正在尝试在特定模块中修复某些问题,但是我不确定如何缩小搜索范围,是否值得缩小搜索范围,所以现在它只是搜索整个过程,甚至可能是搜索整个过程?谁知道?

每当我锁定调试器时,我都可以找到这组字节就好了(相当于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;
}

1 个答案:

答案 0 :(得分:0)

问题出在pattern(和replace)的定义中。它定义为int,而应为char。正如特德·林格莫(Ted Lyngmo)所说,“有时候答案会以正确的眼光盯着你。”