C++ C+中的缓冲区溢出+;在读取虚拟内存时

C++ C+中的缓冲区溢出+;在读取虚拟内存时,c++,debugging,virtual-memory,C++,Debugging,Virtual Memory,我有一个程序,它正在读取虚拟内存和一些数据寄存器,然后对其进行修改 在这里,我将eax寄存器的内容传递给我的函数(这似乎工作得很好,但我认为它可能会演示所涉及的数据类型) case EXCEPTION\u SINGLE\u STEP://EXCEPTION\u SINGLE\u STEP=0x8000004 bl_标志=真; memset((void*)和上下文,0,0x2CC); context.ContextFlags=0x10017; thread=OpenThread(0x1ffff,0

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

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

case EXCEPTION\u SINGLE\u STEP://EXCEPTION\u SINGLE\u STEP=0x8000004
bl_标志=真;
memset((void*)和上下文,0,0x2CC);
context.ContextFlags=0x10017;
thread=OpenThread(0x1ffff,0,debug_event.dwThreadId);
GetThreadContext(线程和上下文);
context.Eip=context.Eip+1;
//sub_FD4BF0((句柄)(*((DWORD*)(lpThreadParameter))),context.Eax;
StringToHtml((句柄)(dwArray[0]),context.Eax);
SetThreadContext(线程和上下文);
闭柄(螺纹);
打破
void StringToHtml(句柄hProcess,DWORD地址)
{
WCHAR buff[0x100];
WCHAR-html[0x100];
DWORD oldProt=0,real=0;
int len=0;
VirtualProtectEx(hProcess,(LPVOID)地址,0x200,页\读写,&oldProt);
ReadProcessMemory(hProcess,(LPCVOID)地址,(LPVOID)buff、0x200和real);
len=wcslen(浅黄色);
int k=0,j=0;
wprintf(L“找到的聊天字符串:\%s\”\n,buff);
用于(int-pp=0;pp<0x100;pp++)
html[pp]=NULL;
而(j//html[k]=L'您是否根据for循环的最大值更改了html和缓冲区的大小?可能这已经是解决方案了。

废话。我忘了。您的意思是:WCHAR buff[len];WCHAR html[len];?您不能使用WCHAR buff[len];在这一点上,因为len是稍后分配的。只需使缓冲区足够大,获取长度,然后相应地调整html的大小。这已经修复了崩溃,谢谢,我将buff和html以及循环设置为0x1f3d,这应该很容易,但现在它似乎只截断为256个字符?好像它没有继续写入过去一样它以前的0x100大小。我对它进行了排序。它正在截断,因为我必须扩展它在ReadProcessMemory:D中读取的内存区域。当我停下来思考为什么会发生这种情况时,这是显而易见的。感谢您指出我的愚蠢:)
    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 (int pp = 0; pp < 0x100; pp++)