创建暂停进程后寻找基本地址

问题描述 投票:1回答:1

我想学习如何进行工艺掏补(为了学习)。我已经创建了一个 32位进程 在暂停状态下,我需要该进程的基本地址,以便以后从内存中解映射并替换成其他东西。

根据我的研究,我可以从进程的PEB中得到它,其中包括该地址,而且根据我的理解,PEB总是位于ebx寄存器中,而入口点位于eax寄存器中。

然而当我得到主线程的上下文时(它保存着寄存器的内容),它都是零,这对我来说毫无意义,但它没有失败。

第二个问题.当我读取进程内存时,我得到 错误299(12B) 据我所知,当我试图从32位读取64位的内存时,就会出现这种情况(但请记住,我运行的是32位进程)。

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>

void end_program(LPPROCESS_INFORMATION pinfo, LPSTARTUPINFO stinfo)
{
    TerminateProcess(pinfo->hProcess, 1);
    CloseHandle(pinfo->hProcess);
    CloseHandle(pinfo->hThread);
    CloseHandle(stinfo->hStdError);
    CloseHandle(stinfo->hStdInput);
    CloseHandle(stinfo->hStdOutput);
    system("pause");
}

void main()
{
    // Create process suspended
    PROCESS_INFORMATION process_info;
    STARTUPINFO start_info;
    ZeroMemory(&process_info, sizeof(process_info));
    ZeroMemory(&start_info, sizeof(start_info));
    TCHAR path[100] = TEXT("C:\\Windows\\SysWOW64\\svchost.exe");
    if (!CreateProcess(NULL, path, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &start_info, &process_info))
    {
        printf("Failed creating process: error 0x%p", GetLastError());
        return;
    }
    printf("PID: %i Handle: 0x%p\r\n", process_info.dwProcessId, process_info.hProcess);

    // Get context of thread
    CONTEXT context;
    ZeroMemory(&context, sizeof(context));
    if (!GetThreadContext(process_info.hThread, &context))
    {
        printf("Failed getting context: error 0x%p\r\n", GetLastError());
        end_program(&process_info, &start_info);
        return;
    }
    printf("Context recieved!\r\n");

    // Get base address
    PVOID base_address;
    ZeroMemory(&base_address, sizeof(base_address));
    if (!ReadProcessMemory(process_info.hProcess, (BYTE)(context.Ebx + 8), &base_address, sizeof(PVOID), NULL))
    {
        printf("Error reading file: error 0x%p\r\n", GetLastError());
        end_program(&process_info, &start_info);
        return;
    }

    // Bugs that haven't been uncovered yet goes here




    // End of program
    end_program(&process_info, &start_info);
}

注1:研究说偏移量为8字节的PEB是基本地址。

注2:尝试快照所有进程,但同样的错误,也尝试了enumprocessmodules,同样的错误发生。

注3:我在网上找到的所有资料都是用来查找正在运行的进程的基地址的,我试了一下,成功了,但是由于在暂停的进程中还没有加载模块(因为没有进程的名字,所以在taskmanager中显示的,可能是错误的),所以对我来说没有用。

注4:我对C语言的编码也很陌生,如果有什么地方看起来很奇怪,请原谅。

如果你有其他的方法来获取基本地址,我很乐意听到。对不起,如果代码有点乱,或者我不清楚。

忘了补充:我的系统是Windows 10 64bit的。

编辑:修正了这个问题。需要做context.ContextFlags=CONTEXT_INTEGER.允许我读。

c winapi memory createprocess base-address
1个回答
0
投票

你千万不要设置context.ContextFlags,必须在调用GetThreadContext()之前将其设置为CONTEXT_INTEGER。

下面是一个示例代码。

#if defined(_WIN64)
    WOW64_CONTEXT context;
    memset(&context, 0, sizeof(WOW64_CONTEXT));
    context.ContextFlags = CONTEXT_INTEGER;
    Wow64GetThreadContext(pi.hThread, &context);
#else   
    CONTEXT context;
    memset(&context, 0, sizeof(CONTEXT));
    context.ContextFlags = CONTEXT_INTEGER;
    GetThreadContext(pi.hThread, &context);
#endif

取自于hasherezade的优秀作品---------------------------。跑步 实施

© www.soinside.com 2019 - 2024. All rights reserved.