2017-01-27 4 views
0

J'ai un programme en cours de traitement qui traite la mémoire virtuelle et certains registres pour certaines données, puis y apporte des modifications. C'est la première fois que je fais une application de débogage si vide avec moi.Buffer Overflow en C++ lors de la lecture de la mémoire virtuelle

Ici je passe le contenu du registre eax à ma fonction (cela semble fonctionner très bien, mais je pensais que ce pourrait montrer quels types de données sont impliqués)

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

Je suis conscient que c'est incomplet extrait de fonction. Cependant le problème arrive à ma boucle for ici.

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

Si j'entre plus de 256 caractères (j'ai d'abord pensé que cela suffirait), il se bloque. J'ai clairement manqué quelque chose d'évident que j'ai essayé de faire pp < len que je pensais utiliserait la taille de la mémoire tampon, mais je reçois toujours le même plantage.

Comment puis-je lire la taille totale de la chaîne entrée dans le chat dans la boucle et la faire itérer sur la chose entière. Ou à tout le moins attraper cette erreur?

Répondre

0

Avez-vous changé la taille du html et du tampon en fonction du maximum de votre boucle for? Peut-être que c'est déjà la solution.

+0

Merde. Je l'ai oublié. Vous voulez dire: WCHAR buff [len]; WCHAR html [len] ;? –

+0

Vous ne pouvez pas utiliser WCHAR buff [len]; à ce moment-là, parce que len est assigné plus tard. Il suffit de rendre le tampon assez grand, d'obtenir la longueur et d'ajuster la taille du code HTML en conséquence. – Aeonos

+0

Cela a corrigé le crash, merci, je mets le buff et html et la boucle à 0x1f3d qui devrait facilement être suffisant mais il semble maintenant tronquer à 256 caractères seulement? Comme si elle ne continuait pas à écrire au-delà de la taille 0x100 auparavant. –