Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перехват функции MessageBoxA

6.7K
17 октября 2007 года
Kessler
42 / / 02.08.2005
Здравствуйте!
Мне нужно решить следующую задачу: при вызове некоторым приложением функции MessageBoxA сообщение не должно выводиться, а должен пищать динамик системника. Я нашел кое-какую документацию по перехвату Win-API функций ( http://rsdn.ru/article/baseserv/IntercetionAPI.xml ). Сделал всё, как написано, но при первом вызове перехваченной функции происходит ошибка при работе с памятью и приложение закрывается :(...
Код DLL для перехвата следующий:
Код:
#include <windows.h>

#pragma pack(push, 1)
struct TJmpFar
{
  BYTE InstrPush;  // Код инструкции push
  DWORD Arg;       // Аргумент push
  BYTE InstrRet;   // Код инструкции ret
};
#pragma pack(pop)

BYTE oldMsg[6];
TJmpFar jumpMsg;
DWORD addrMsg;

void InterceptMsg(void);
int __stdcall IntMsg(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
        InterceptMsg();
    }

    return 0;
}

void InterceptMsg(void) {
    DWORD Read = 0;
    addrMsg = (DWORD)GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");
    if (!addrMsg) {
        MessageBox(0, "Процесс не использует функцию!", "Ошибка", MB_OK);
        return;
    }

    jumpMsg.InstrPush = 0x68;
    jumpMsg.Arg = (DWORD)&IntMsg;
    jumpMsg.InstrRet = 0xC3;

    WriteProcessMemory(GetCurrentProcess(), (void*)addrMsg, (void*)&jumpMsg, 6, &Read);
}

int __stdcall IntMsg(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) {
    Beep(1000, 1000);
    return 0;
}


Оригинальную функцию мне вызывать не нужно, поэтому оригинальные байты не сохраняю. Да думаю причина и не в этом...
Внедрение кода в чужой процесс проходит успешно: происходит вызов InterceptMsg, а WriteProcessMemory пишет все 6 байт. Да и приложение работает до первого вызова перехваченной функции, так что проблема, наверное, где-то именно на этапе вызова MessageBoxA, а не при установке перехвата... Но может я и ошибаюсь... :(
Подскажите, кто что знает...
6.7K
18 октября 2007 года
Kessler
42 / / 02.08.2005
Всё получилось! Проблема решена! :)
Ошибка была в функции инициализации DLL. Она возвращала 0 (что сообщало об ошибке) и тут же выгружалась из памяти. После исправления
 
Код:
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
        InterceptSend();
    }

    return 0;
}

на
 
Код:
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
        InterceptSend();
    }

    return 1;
}

всё заработало!

... а я 3 дня промучился ... :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог