#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;
}
Перехват функции MessageBoxA
Мне нужно решить следующую задачу: при вызове некоторым приложением функции MessageBoxA сообщение не должно выводиться, а должен пищать динамик системника. Я нашел кое-какую документацию по перехвату Win-API функций ( http://rsdn.ru/article/baseserv/IntercetionAPI.xml ). Сделал всё, как написано, но при первом вызове перехваченной функции происходит ошибка при работе с памятью и приложение закрывается :(...
Код DLL для перехвата следующий:
Код:
Оригинальную функцию мне вызывать не нужно, поэтому оригинальные байты не сохраняю. Да думаю причина и не в этом...
Внедрение кода в чужой процесс проходит успешно: происходит вызов InterceptMsg, а WriteProcessMemory пишет все 6 байт. Да и приложение работает до первого вызова перехваченной функции, так что проблема, наверное, где-то именно на этапе вызова MessageBoxA, а не при установке перехвата... Но может я и ошибаюсь... :(
Подскажите, кто что знает...
Ошибка была в функции инициализации 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;
}
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;
}
if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
InterceptSend();
}
return 1;
}
всё заработало!
... а я 3 дня промучился ... :)