2010-07-01 11 views
0

J'ai injecté ma DLL dans une application cible où j'ai également connecté quelques fonctions WINAPI . L'un d'eux est DrawTextExW. J'essaie de remplacer toutes les lettres 'l' par '!' avant il l'imprime. Ma solution fonctionne correctement pendant quelques secondes, mais l'application cible se bloque. Je ne comprends vraiment pas pourquoi.Un crash dans une application cible injectée/accrochée

est ici la fonction:

Edition - Solution de travail:

int WINAPI DetouredDrawTextExW(__in HDC hdc, 
           __inout LPWSTR lpchText, 
           __in int cchText, 
           __inout LPRECT lprc, 
           __in UINT dwDTFormat, 
           __in LPDRAWTEXTPARAMS lpDTParams) 
{ 
    std::wstring s_wc(lpchText, cchText); 

    std::replace(s_wc.begin(), s_wc.end(), L'l', L'!'); 

    return ::DrawTextExW(hdc, const_cast<wchar_t *>(s_wc.c_str()), 
     s_wc.length(), lprc, dwDTFormat, lpDTParams); 
}

Ainsi, quelqu'un peut pointer vers moi ce que je fais mal?

Répondre

1

Je vois que vous ignorez cchText, pourriez-vous recevoir une chaîne non-NULL-terminated avec une valeur positive pour cchText, ayant pour résultat la lecture après la fin de la chaîne dans la mémoire non valide? Cette erreur se présenterait comme une exception Win32 dans le constructeur de s_wc, cependant.

En outre, vous ne vérifiez pas DT_MODIFYSTRING dans le paramètre dwDTFormat. Si cet indicateur est présent, alors :: DrawTextExW() pourrait remplacer la mémoire invalide. Cela se présenterait comme une exception Win32 dans :: DrawTextExW() ou peut-être une exception C++ dans le destructeur s_wc.

modifier

est ici décompilé, non testé le code que je crois obéisse le contrat de

int WINAPI DetouredDrawTextExW(__in HDC hdc, 
           __inout LPWSTR lpchText, 
           __in int cchText, 
           __inout LPRECT lprc, 
           __in UINT dwDTFormat, 
           __in LPDRAWTEXTPARAMS lpDTParams) 
{ 
    std::vector<wchar_t> v_wc; 
    int strSize = cchText == -1 ? wcslen(lpchText) : cchText; 
    v_wc.resize(strSize + 4); 
    std::copy(lpchText, lpchText + strSize, &v_wc.front()); 
    std::replace(v_wc.begin(), v_wc.end() - 4, L'l', L'!'); 

    int result = ::DrawTextExW(hdc, &v_wc.front(), 
     strSize, lprc, dwDTFormat, lpDTParams); 
    if (dwDTFormat & DT_MODIFYSTRING) 
    { 
     std::copy(&v_wc.front(), &v_wc.front() + v_wc.size(), lpchText); 
    } 
} 
+0

Merci pour la réponse, mais vous étiez en fin de compte dès le début. J'ai ignoré cchText. La chaîne, selon les spécifications, n'a pas besoin d'être terminée par un caractère nul. Par conséquent, std :: wstring (lpchText, cchText) a fait l'affaire. – nhaa123