Не работает перехват MessageBox

Тема в разделе "WASM.WIN32", создана пользователем ksu_ant, 13 ноя 2010.

  1. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Здравствуйте!
    Не получается перехватить MessageBox (перевожу на C пример AdvBox Ms-Rem). Помогите, пожалуйста, разобраться, что не так.
    В случае вызова функции - текст сообщения должен записаться в файл, но файл постоянно пуст :dntknw:
    Это первый мой перехват в режиме пользователя (до этого в ядре работал). Заранее благодарен.
    Код (Text):
    1. #include "stdafx.h"
    2. #include "windows.h"
    3.  
    4. typedef struct _OldCode {
    5.     DWORD   One;
    6.     DWORD   Two;
    7. } OldCode;
    8.  
    9. typedef struct _far_jmp {
    10.     BYTE    PuhsOp;
    11.     DWORD   PushArg;
    12.     BYTE RetOp;
    13. } far_jmp;
    14.  
    15. typedef VOID (*MYPROCA)(HWND, LPCSTR, LPCSTR, UINT,WORD);
    16. typedef VOID (*MYPROCW)(HWND, LPCWSTR, LPCWSTR, UINT,WORD);
    17. HINSTANCE hDLL;
    18.  
    19.  
    20. OldCode OldMba, OldMbw;
    21. MYPROCA  MbaAdr;
    22. MYPROCW MbwAdr;
    23. far_jmp JmpMba, JmpMbw;
    24. BOOL WINAPI TrueMessageBoxExA(HWND hwnd, LPCSTR text, LPCSTR hdr, UINT utype,WORD wLanguageId)
    25. {
    26.   DWORD written;
    27.  
    28.   CHAR stdPath[30] = "C:\\tmp.txt";
    29.   DWORD d;
    30.   HANDLE hOut = CreateFile(stdPath, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    31.   WriteFile(hOut, &text, sizeof(text), &d, NULL );
    32.   WriteFile(hOut, &hdr, sizeof(hdr), &d, NULL );
    33.   CloseHandle(hOut);
    34.  
    35.   WriteProcessMemory(INVALID_HANDLE_VALUE, (void*)MbaAdr,
    36.                      (void*)&OldMba, sizeof(OldCode), &written);
    37.   MessageBoxExA(hwnd, text, hdr, utype, wLanguageId);
    38.  
    39.   WriteProcessMemory(INVALID_HANDLE_VALUE, (void*)MbaAdr,
    40.                      (void*)&JmpMba, 6,&written);
    41.   return true;
    42. }
    43.  
    44. BOOL WINAPI TrueMessageBoxExW(HWND hwnd, LPCWSTR text, LPCWSTR hdr, UINT utype,WORD wLanguageId)
    45. {
    46.   DWORD written;
    47.  
    48.   CHAR stdPath[30] = "C:\\tmp.txt";
    49.   DWORD d;
    50.   HANDLE hOut = CreateFile(stdPath, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    51.   WriteFile(hOut, &text, sizeof(text), &d, NULL );
    52.   WriteFile(hOut, &hdr, sizeof(hdr), &d, NULL );
    53.   CloseHandle(hOut);
    54.  
    55.   WriteProcessMemory(INVALID_HANDLE_VALUE, (void*)MbwAdr,
    56.                      (void*)&OldMbw, sizeof(OldCode), &written);
    57.   MessageBoxExW(hwnd, text, hdr, utype, wLanguageId);
    58.  
    59.   WriteProcessMemory(INVALID_HANDLE_VALUE, (void*)MbwAdr,
    60.                      (void*)&JmpMbw, 6,&written);
    61.   return true;
    62. }
    63.  
    64. BOOL WINAPI NewMessageBoxExA(HWND hwnd, LPCSTR text, LPCSTR hdr, UINT utype,WORD wLanguageId)
    65. {
    66.     TrueMessageBoxExA(hwnd, text, hdr, utype, wLanguageId);
    67.     return TRUE;
    68. }
    69.  
    70. BOOL WINAPI NewMessageBoxExW(HWND hwnd, LPCWSTR text, LPCWSTR hdr, UINT utype,WORD wLanguageId)
    71. {
    72.     TrueMessageBoxExW(hwnd, text, hdr, utype, wLanguageId);
    73.     return TRUE;
    74. }
    75.  
    76. LRESULT CALLBACK MessageProc(int code, WPARAM wParam, LPARAM lParam)
    77. {
    78.     CallNextHookEx(0, code, wParam, lParam);
    79.     return 0;
    80. }
    81.  
    82. DWORD WINAPI SetGlobalHookProc(LPVOID lpParam)
    83. {
    84.     SetWindowsHookEx(WH_GETMESSAGE, &MessageProc, hDLL, 0);
    85.     Sleep(INFINITE);
    86.     return 0;
    87. }
    88.  
    89. DWORD SetGlobalHook()
    90. {
    91.     HANDLE hMutex;
    92.     DWORD TrId;
    93.     hMutex = CreateMutex(NULL, false, "AdvareHook");
    94.     if (GetLastError() == 0)
    95.     {
    96.         CreateThread(NULL, 0, &SetGlobalHookProc, 0, 0, &TrId);
    97.     }
    98.     else
    99.     {
    100.             CloseHandle(hMutex);
    101.     }
    102.     return 0;
    103. }
    104.  
    105. DWORD SetHook()
    106. {
    107.     HINSTANCE hUser32;
    108.     ULONG Bytes;
    109.     hUser32 = GetModuleHandle("user32.dll");
    110.     MbaAdr  = (MYPROCA) GetProcAddress(hUser32, "MessageBoxExA");
    111.     MbwAdr  = (MYPROCW) GetProcAddress(hUser32, "MessageBoxExW");
    112.     ReadProcessMemory(INVALID_HANDLE_VALUE, &MbaAdr, &OldMba, sizeof(OldCode), &Bytes);
    113.     ReadProcessMemory(INVALID_HANDLE_VALUE, &MbwAdr, &OldMbw, sizeof(OldCode), &Bytes);
    114.     JmpMba.PuhsOp  = 0x68;
    115.     JmpMba.PushArg = (DWORD) &NewMessageBoxExA;
    116.     JmpMba.RetOp   = 0xC3;
    117.     JmpMbw.PuhsOp  = 0x68;
    118.     JmpMbw.PushArg = (DWORD) &NewMessageBoxExW;
    119.     JmpMbw.RetOp   = 0xC3;
    120.     WriteProcessMemory(INVALID_HANDLE_VALUE, &MbaAdr, &JmpMba, sizeof(far_jmp), &Bytes);
    121.     WriteProcessMemory(INVALID_HANDLE_VALUE, &MbwAdr, &JmpMbw, sizeof(far_jmp), &Bytes);
    122.     return 0;
    123. }
    124.  
    125.  
    126. DWORD UnHook()
    127. {
    128.     ULONG Bytes;
    129.     WriteProcessMemory(INVALID_HANDLE_VALUE, (void*)MbaAdr, (void*)&OldMba, sizeof(OldCode), &Bytes);
    130.     WriteProcessMemory(INVALID_HANDLE_VALUE, (void*)MbwAdr, (void*)&OldMbw, sizeof(OldCode), &Bytes);
    131.     return 0;
    132. }
    133.  
    134. BOOL APIENTRY DllMain( HINSTANCE hModule,
    135.                        DWORD  ul_reason_for_call,
    136.                        LPVOID lpReserved
    137.                      )
    138. {
    139.     switch (ul_reason_for_call)
    140.     {
    141.         case DLL_PROCESS_ATTACH:
    142.                           hDLL = hModule;
    143.                           SetGlobalHook();
    144.                           SetHook();
    145.         case DLL_THREAD_ATTACH:
    146.         case DLL_THREAD_DETACH:
    147.         case DLL_PROCESS_DETACH:
    148.             UnHook();
    149.             break;
    150.     }
    151.     return TRUE;
    152. }
     
  2. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    ksu_ant
    Зря, вы рема упомянули... сейчас явиться клерк и будет орать, что он, вы и ваша родня до седьмого колена гуано....
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Да гуано. Создан топик для таких вопросов http://wasm.ru/forum/viewtopic.php?id=38110. Копипаст в любой форме зло, более того мне чисто неохота разбирать гуанокод ТС.
     
  4. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Clerk
    Вас никто сюда не звал. Не хотите помочь - не нужно грубить. Я явно указал, что в юзер-моде никогда не делал перехватов и сейчас учу данный вопрос.
    Так что кто гуано - не Вам, любезный, судить.
    P.S.: Свои топики рекламировать таким образом - Ваша маркетинговая находка?
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ksu_ant
    Я и не думал вам грубить нисколько, напротив это вы грубите. То что вы не заюзали поиск с таким вопросом величайшая наглость. А про ядро вы наверно шутите. Учитесь формулировать вопросы.
     
  6. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Clerk
    Поиск юзал.
    На C я не нашел нормально работающего кода, поэтому решил попробовать перевести с Delphi (только этот пример работал именно так, как мне было нужно), но, к сожалению, хуки не устанавливаются... С целью определить причину этого, я обратился на данный форум, где Вы начали бросаться грубыми словами в адрес человека, которого совсем не знаете.
    В kernel mode я работаю довольно давно и все, что мне бывает необходимо, я пытаюсь решать сам.
    Насчет копипаста: во-первых- я явно указал авторство, во-вторых, не думаю, что существует программист, который за всю жизнь ни разу не воспользовался готовым алгоритмом, а если он об этом заявляет об этом, то, скорее всего, лукавит.
    Предлагаю вернуть топик в конструктивное русло и, если нет желания помочь разобраться в проблеме, не мешать делать этого тем, кто знает в чем проблема и хочет подсказать решение.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ksu_ant
    Судя по вашим ответам вы тут недавно зарегались и есчо ничего не знаете. И не нужно в меня гуан кидать. Ваша проблема в незнании машинных команд и в не желании юзать отладчик. Вы считаете что ваше решение тру и идеально, реально это грубая ошибка, в частности тупое решение в лоб которое нарушает целостность системных модулей, тоесть идёт наперекос защите.
     
  8. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Clerk
    Дата регистрации, насколько я понимаю, есть в профиле.
    Никто в Вас ничего не кидал.
    Я НЕ считал, что мое решение идеально - это Ваши догадки, если Вы видите явные проблемы и Вас заботит этот топик - гораздо продуктивнее было бы подсказать ошибку.
    Если Вам это не интересно, прошу прекратить бесполезную дискуссию.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ksu_ant
    Как бы мне это не нравилось, но я опишу.

    o Многозадачность. Необходим енум всех тредов и проверка вхождения их Ip в модифицируемый код, в частности в весь изменяемый диапазон и он должен быть выравнен на адрес последней инструкции. Для этого необходим LDE.
    o Динамическое формирование кода. Выполняется копирование линейного кода(без ветвлений) в буфер или с поправкой их. Для оригинального пролога это не нужно, но проверка необходима.
    o Атомарная модификация кода, иначе вызов из другого треда завершится крахом.
    Это основные нюансы. Ваш скрипт мне лень разбирать.

    Кстате я не вижу пролога в вашем хэндлере, вобще код отвратительный.
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Пройдитесь отладчиком. Не совсем понимаю как это должно работать. Почему там к примеру везде INVALID_HANDLE_VALUE? И зачем Ms-Rem везде юзал WinAPI, тоже не совсем понятно.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Booster
    Это от подного незнания системы. Просто числовое значение именованных констант совпадает NtCurrentProcess = INVALID_HANDLE_VALUE = THREAD_BASE_PRIORITY_IDLE = INFINITE.. не имеющих между собой смысла.
     
  12. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Booster
    INVALID_HANDLE_VALUE меня тоже удивил, т.к. везде в похожих кодах используется GetCurrentProcess, но я подумал (возможно ошибаюсь), что так сделано для внедрения во все процессы.
    Delphi вариант работает, код взят отсюда: http://www.wasm.ru/pub/21/files/adwarebox.rar.
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Clerk
    Я не хакер, а программист, поэтому не юзаю андок. Я бы просто вызвал GetCurrentProcess.
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Booster
    Это документированно, вы ведь знаете как ждать на обьекте без указания таймаута - вы передаёте константу INFINITE = -1, значение которой совпадает с псевдохэндлом текущего процесса и кодом ошибки и есчо с сотнями тыщами констант имеющих тоже значение.
     
  15. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Booster
    Да, сейчас в Delphi варианте исправил на GetCurrentProcess - также работает (нормально). Видимо, действительно совпадают значения...
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Clerk
    При чём здесь INFINITE? Покажи где написано, что можно вместо GetCurrentProcess юзать -1. А использовать левые названия констант это конечно стиль тру хакеров.
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Booster
    Почему же нельзя, значение константы одинаково. Своего рода обфускация. И я не говорил что это верно, но в скомпилированном коде будет всё тоже -1. Так что имена только для скрипта.)
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Clerk
    Автор кода хотел обфусцировать? У программистов правда это называет говнокодом, ну да ладно. ^)
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Booster
    Вы забываете что этот код копипаст без понимания сути его работы. Незачем спорить по этому поводу.
     
  20. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    > Покажи где написано, что можно вместо GetCurrentProcess юзать -1
    в msdn наверно?
    http://msdn.microsoft.com/en-us/library/ms683179(VS.85).aspx