Показать сообщение отдельно

  #1539  
Старый 10.09.2008, 15:59
ntldr
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
Провел на форуме:
2364957

Репутация: 479
По умолчанию

пробую перехватить MessageBoxA. Код библиотеки:

Код:
#include <stdafx.h>

struct jmp_far {
	BYTE op_push;
	DWORD arg;
	BYTE op_ret;
};

BYTE buf[6];
DWORD adrmesbox;
DWORD written;
jmp_far jump;

BOOL WINAPI intMesbox(HWND hwnd, char *text, char *hdr, UINT utype)
{
	WriteProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)&buf, 6, &written);
	char *str = "перехвачено111";
	((BOOL (__stdcall*)(HWND, char*, char*, UINT))adrmesbox)(hwnd, 
             str, hdr, utype);
	WriteProcessMemory(GetCurrentProcess(), (void*)adrmesbox,(void*)&jump, 6,&written);
	return 1;
}

void intercept(void) {
	adrmesbox = (DWORD)GetProcAddress(GetModuleHandleA("user32.dll"),"MessageBoxA");
	if(adrmesbox == 0)
		{
    MessageBoxA(NULL, "MessageBoxA не найден", "ошибка", 0);
    return;
		}
	jump.op_push = 0x68;
	jump.arg = (DWORD)&intMesbox;
	jump.op_push = 0xC3;
	ReadProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)buf, 6, &written);
	WriteProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)&jump, 6, &written);
}

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

void main(void) {

}
После того как я вставляю эту dll в процесс, запускаю MessageBoxA. Ничего не происходит, а должен появиться бокс с сообдением "перехвачено".
Visual Studio 2008
сама статья - http://www.rsdn.ru/article/baseserv/IntercetionAPI.xml
 
Ответить с цитированием