簡體   English   中英

從另一個進程的內存中找不到匹配的字節數組

[英]Can't find an array of bytes match from another process' memory

我目前正在嘗試驗證我以此為參考編寫的代碼是否有效。 我設法使其運行而不會崩潰,但是一旦我開始檢查代碼是否確實按照我的意願執行了操作,便遇到了問題。

雖然我認為代碼遍歷了我嘗試搜索的進程的所有內存區域,但可能不是這樣嗎?

老實說,我不確定問題出在哪里,我是在錯誤地在內存緩沖區中搜索字節數組,還是我實際上在讀取錯誤的內存?


當檢查我的代碼是否從進程中找到一個字節數組匹配時,我使用了作弊引擎進行了事先掃描,然后將結果與程序返回的結果進行了比較。 我使用了一個事先知道的字節數組,該字節數組在我正在掃描的程序中將至少存在一次。

現在比較我從作弊引擎獲得的結果: 成績

我從程序中得到的結果為0。 這似乎不太正確。


我使用以下標志打開要從中讀取內存的進程:

PROCESS_VM_READ | PROCESS_QUERY_INFORMATION

以及我調用模式匹配函數的方式:

testy.patternMatch("000000000000000001000000000000001CC80600");

至於我當前的代碼:

我正在調用的函數(m_localprocess是我之前獲得的進程的打開句柄)

void process_wrapper::patternMatch(std::string pattern)
{
    MEMORY_BASIC_INFORMATION sys_info;

    std::vector<char> pattern_conv(pattern.begin(), pattern.end());


    for (unsigned char * pointer = NULL;
        VirtualQueryEx(m_localprocess, pointer, &sys_info, sizeof(sys_info)) == sizeof(sys_info);
        pointer += sys_info.RegionSize) {

        std::vector<char> mem_buffer;

        if (sys_info.State == MEM_COMMIT && (sys_info.Type == MEM_MAPPED || sys_info.Type == MEM_PRIVATE)) {

            SIZE_T bytes_read;
            mem_buffer.resize(sys_info.RegionSize);

            ReadProcessMemory(m_localprocess, pointer, &mem_buffer[0], sys_info.RegionSize, &bytes_read);
            if (GetLastError() != 0) {
                std::cout << "Error: " << GetLastError();
                SetLastError(0);
            }

            mem_buffer.resize(bytes_read);


            std::cout << "\nSize: "<< mem_buffer.size() << "\n";
            if (mem_buffer.size() != 0) {
                find_all(mem_buffer.begin(), mem_buffer.end(), pattern_conv.begin(), pattern_conv.end(), pointer);
            }
        }

    }

    std::cout << "Results: " << results.size() << "\n";
    for (void* x : results) {
        std::cout << x << "\n";
    }

}

此函數調用find_all函數,如下所示:

void find_all(std::vector<char>::iterator beg, std::vector<char>::iterator end,
    std::vector<char>::iterator beg_pattern, std::vector<char>::iterator end_pattern, 
    const unsigned char * baseAddr) {

    std::vector<char>::iterator walk = beg;

    while (walk != end) {
        walk = std::search(walk, end, beg_pattern, end_pattern);

        if (walk != end) {
            std::cout << (void*)(baseAddr + (walk - beg)) << "\n";
            results.emplace_back((void*)(baseAddr + (walk - beg)));
            ++walk;
        }
    }
}

我們歡迎任何其他有關實現我正在嘗試實現的方式的建議。

感謝喬納森(Jonathan)留下的評論,我實際上是在比較ASCII值而不是實際的十六進制值。

該代碼現在可以工作: 工作的

我對代碼所做的更改(從此處獲取 ):

void process_wrapper::patternMatch(std::string patternOrig)
{
    MEMORY_BASIC_INFORMATION sys_info;

    int len = patternOrig.length();
    std::string pattern;
    for (int i = 0; i < len; i += 2)
    {
        std::string byte = patternOrig.substr(i, 2);
        char chr = (char)(int)strtol(byte.c_str(), NULL, 16);
        pattern.push_back(chr);
    }
    //...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM