读取虚拟内存时C++缓冲区溢出

Buffer Overflow in C++ while reading virtual memory

本文关键字:缓冲区 溢出 C++ 虚拟内存 读取      更新时间:2023-10-16

我有一个程序,它正在读取处理虚拟内存和一些数据的一些寄存器,然后对其进行修改。

在这里,我将 eax 寄存器的内容传递给我的函数(这似乎工作正常,但我认为它可能会演示涉及哪些类型的数据)

    case EXCEPTION_SINGLE_STEP:   // EXCEPTION_SINGLE_STEP = 0x80000004
                    bl_flag = TRUE;
                    memset((void *)&context, 0, 0x2CC);
                    context.ContextFlags = 0x10017;
                    thread = OpenThread(0x1FFFFF, 0, debug_event.dwThreadId);
                    GetThreadContext(thread, &context);
                    context.Eip = context.Eip + 1;
//                  sub_FD4BF0((HANDLE)(*((DWORD *)(lpThreadParameter))), context.Eax);
                    StringToHtml((HANDLE)(dwArray[0]), context.Eax);
                    SetThreadContext(thread, &context);
                    CloseHandle(thread);
                    break;

void StringToHtml(HANDLE hProcess, DWORD address)
{
    WCHAR buff[0x100];
    WCHAR html[0x100];
    DWORD oldProt = 0, real = 0;
    int len = 0;
    VirtualProtectEx(hProcess, (LPVOID)address, 0x200, PAGE_READWRITE, &oldProt);
    ReadProcessMemory(hProcess, (LPCVOID)address, (LPVOID)buff, 0x200, &real);
    len = wcslen(buff);
    int k = 0, j = 0;
    wprintf(L"Found out chat string : "%s" n", buff);
    for (int pp = 0; pp < 0x100; pp++)
        html[pp] = NULL;   
    while(j < len)
    {
        if (buff[j] == L'&')
        {
            if (wcsncmp((const WCHAR *)(buff + j + 1), L"lt;", 3) == 0)
            {
                //html[k] = L'<';
                html[k] = L'<font color="#00FF10">';
                k++;
                j = j + 4;
                continue;
            }

我知道这是一个不完整的功能片段。但是,问题到达了我的 for 循环。

for (int pp = 0; pp < 0x100; pp++)

如果我输入超过 256 个字符(我起初认为这就足够了),那么它就会崩溃。当我尝试使用 pp

我如何将聊天中输入的字符串的总大小读取到循环中并使其迭代整个事情。或者至少捕获此错误?

您是否根据

for 循环的最大值更改了 html 和缓冲区的大小?也许这已经是解决方案。