2014-07-27 4 views
0

제가 갖고있는 프로그램에서 MessageBox 디스플레이를 변경하려고합니다. DLL을 삽입하고 내 MessageBox 대신 일반 DLL을 표시하는 MessageBox 함수에서 내 DLL로 점프를 수행하여이 작업을 수행하려고합니다.DLL에서 메모리에 쓸 때 오류가 발생했습니다.

나는뿐만 아니라 MessageBox '메모리의 주소와 내 MessageBox의 주소를 가져옵니다 다음 코드를 작성했습니다, 나는 점프를 미리 형성하기 위해 옵 코드를 계산하기 위해 노력하고있어하지만 불행히도 나는 "액세스 위반이 나타날 하나 MessageBoxA 또는 012로 확인되는 매크로는 사실에 MessageBox

MessageBox로 User32.dll 같이

DWORD oldProtect; 

PVOID MessageBoxaddr = GetProcAddress(
    GetModuleHandle("User32.dll"), "MessageBoxA"); 
PVOID MessageBoxHookAddr = &HookedMessageBox; 
DWORD relJmp = (DWORD)MessageBoxaddr- ((DWORD)MessageBoxHookAddr + 5); 

VirtualProtect(MessageBoxaddr, 
    sizeof(BYTE)* 5, PAGE_EXECUTE_READWRITE, &oldProtect); 

// These line preform the little Debian method and are the cause for the error 

((PBYTE)MessageBoxaddr)[0] = 0xe9; 
((PBYTE)MessageBoxaddr)[1] = relJmp^0x000000ff; 
((PBYTE)MessageBoxaddr)[2] = (relJmp^0x0000ff00) >> 8; 
((PBYTE)MessageBoxaddr)[3] = (relJmp^0x00ff0000) >> 16; 
((PBYTE)MessageBoxaddr)[4] = (relJmp^0xff000000)>>24; 

VirtualProtect(MessageBoxaddr, 
    sizeof(BYTE)* 5, PAGE_EXECUTE_READ, &oldProtect); 

return 0; 
+0

나는'^'대신에'&'를 의미하는 것으로 생각합니다. 그럼 다시 작은 데비안 방법 –

답변

1

는 그런 기능이 없다 : "나는 DLL을 주입 할 때마다 오류, 여기에 코드입니다은 전 처리기 플래그 UNICODE이 설정되었는지 여부에 따라 달라집니다.

그래서 당신은 NULL, VirtualProtectNULL 포인터 페이지 액세스를 변경하려고합니다 반환됩니다 MessageBoxA 또는 MessageBoxW하지만 GetProcAddress(.., "MessageBox") 대상으로 할 수 있습니다 및 액세스 위반을 얻고있는 이유입니다.

또한 자신의 코드를 롤링하는 대신 Microsoft Detours 라이브러리를 사용하여이 작업을 수행 할 수 있습니다.

+0

덕분에 전문가가 아니야!, "MessageBoxA"함수 매개 변수를 변경했지만 여전히 오류가 발생합니다. 아, 그리고 나는 한 곳에서 Microsoft Detours 라이브러리를 사용하려고했지만 x86 버전의 프로세스에서만 작동합니다 (정식 버전을 구입하지 않은 경우). x64 프로세스에서 후크를 preform해야합니다. –

+0

DLL 또는 우회로가 MessageBoxA를 호출하려고 시도한 후에? –

+0

DLL이 삽입되고 프로세스가 충돌 한 코드를 실행하면 프로세스가 충돌하지 않는 것으로 보이는 작은 debian 메서드의 선을 제거했을 때 오류가 발생했다는 것을 알았습니다 –

관련 문제