2017-01-27 2 views
0

Ich habe ein Programm, das Prozesse virtuellen Speicher und einige Register für einige Daten liest, und dann Änderungen daran vornehmen. Dies ist das erste Mal, dass ich eine Debugging-App so einfach mit mir mache.Pufferüberlauf in C++ beim Lesen des virtuellen Speichers

Hier gebe ich den Inhalt des EAX-Registers zu meiner Funktion (das scheint gut zu funktionieren, aber ich dachte, es könnte zeigen, welche Arten von Daten beteiligt werden)

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; 
      } 

Ich bin mir bewusst, das eine unvollständig Funktionsschnipsel Allerdings kommt das Problem hier zu meiner for-Schleife.

Wenn ich mehr als 256 Zeichen eingeben (ich dachte zuerst, das wäre genug), stürzt es ab. Ich habe offensichtlich etwas offensichtlich übersehen, wie ich versuchte, pp < len, die ich dachte, würde die Puffergröße verwenden, aber ich bekomme immer noch den gleichen Absturz.

Wie kann ich die Gesamtgröße der Zeichenfolge im Chat in die Schleife eingelesen und es über die ganze Sache iterieren. Oder zumindest diesen Fehler finden?

Antwort

0

Haben Sie die Größe von HTML und Puffer entsprechend dem Maximum Ihrer for-Schleife geändert? Vielleicht ist das schon die Lösung.

+0

Mist. Ich habe es vergessen. Du meinst so: WCHAR buff [len]; WCHAR html [len] ;? –

+0

Sie können WCHAR buff [len] nicht verwenden; an diesem Punkt, weil len später zugewiesen wird. Einfach den Puffer groß genug machen, die Länge erhalten und dann die Größe von html entsprechend anpassen. – Aeonos

+0

Das hat den Absturz behoben, danke, ich setze Buff und HTML und die Schleife auf 0x1f3d, was leicht genug sein sollte, aber es scheint nur auf 256 Zeichen abgeschnitten zu sein? Als ob es nicht weiter schreibt als 0x100. –

Verwandte Themen