2013-06-10 2 views
0

Я пытаюсь сделать крючок API с помощью Detour, чтобы извлечь текст из сторонней программы. Тем не менее, я получаю только мусор, множество цифр и отсутствие вывода текста.Почему API-подключение ExtTextOut и DrawText на C++ выводит только мусор?

Как именно эти функции называются? Они призваны рисовать другие вещи, кроме текста? Если есть некоторые дополнительные инструменты, используемые сторонней программой, чтобы избежать перехвата этих вызовов, есть ли какой-то базовый пример, который я могу попытаться удостовериться, что мой метод действительно правильно возвращает текст? Другими словами, есть ли какая-нибудь программа в окнах, которая использует эти методы для рисования текста на экране?

Мой код можно увидеть ниже:

BOOL (__stdcall *Real_ExtTextOut)(HDC hdc,int x, int y, UINT options, const RECT* lprc,LPCWSTR text,UINT cbCount, const INT* lpSpacingValues) = ExtTextOut; 
BOOL (__stdcall *Real_DrawText)(HDC hdc, LPCWSTR text, int nCount, LPRECT lpRect, UINT uOptions) = DrawText; 

int WINAPI Mine_DrawText(HDC hdc, LPCWSTR text, int nCount, LPRECT lpRect, UINT uOptions) 
{ 
     ofstream myFile; 
    myFile.open ("C:\\temp\\textHooking\\textHook\\example.txt", ios::app); 
    for(int i = 0; i < nCount; ++i) 
     myFile << text[i]; 
    myFile << endl; 
    int rv = Real_DrawText(hdc, text, nCount, lpRect, uOptions); 

    return rv; 
} 

BOOL WINAPI Mine_ExtTextOut(HDC hdc, int X, int Y, UINT options, RECT* lprc, LPCWSTR text, UINT cbCount, INT* lpSpacingValues) 
{ 
    ofstream myFile; 
    myFile.open ("C:\\temp\\textHooking\\textHook\\example2.txt", ios::app); 
    for(int i = 0; i < cbCount; ++i) 
     myFile << text[i]; 
    myFile << endl; 
    BOOL rv = Real_ExtTextOut(hdc, X, Y, options, lprc, text, cbCount, lpSpacingValues); 

    return rv; 
} 

// Install the DrawText detour whenever this DLL is loaded into any process 
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){ 
    switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
      DetourTransactionBegin(); 
      DetourUpdateThread(GetCurrentThread()); 
      DetourAttach(&(PVOID&)Real_ExtTextOut, Mine_ExtTextOut); 
      DetourAttach(&(PVOID&)Real_DrawText, Mine_DrawText); 
      DetourTransactionCommit(); 
    case DLL_THREAD_ATTACH: 
    case DLL_THREAD_DETACH: 
    case DLL_PROCESS_DETACH: 
     break; 
    } 

    return TRUE; 
} 
+1

Мусор в файле или на экране? Содержимое файла, безусловно, будет грязным, оно не обрабатывает Unicode должным образом. –

+0

Я имею в виду файл. Любые предложения, как справиться с этим? – Euklides

+0

Ну, я бы написал «C++ write utf-8 file». Первая пара хитов выглядит довольно неплохо. –

ответ

2

Вы выписывая UTF-16 кодов символов в виде целых чисел. Следовательно, файл, полный чисел. Это, наверное, проще просто блитирования текстового буфера прямо в файл:

ofstream myFile; 
myFile.open("C:\\temp\\textHooking\\textHook\\example.txt", ios::app); 
myFile.write(reinterpret_cast<const char*>text, nCount*sizeof(*text)); 
myFile << endl; 

Вы можете поместить в UTF-16LE BOM в начале файла, чтобы помочь текстовому редактору работать кодировку, которая используется ,

 Смежные вопросы

  • Нет связанных вопросов^_^