그래서 저는 Windows에서 함수 후킹을하고 놀고 있었고 모든 것이 예상대로 잘 작동했습니다. 내 LoadLibrary 포인터가 jmp 명령과 내 후크 함수에 대한 오프셋으로 가리키는 값을 재정 의하여 LoadLibrary를 호출 할 때마다 내 코드를 실행할 수 있습니다. 메모리의 바이트를 무시하려면 분명히 특정 메모리에 대한 보호 플래그를 변경해야합니다. 이 작품은 잘 작동하지만 예기치 않은 결과가 있습니다. 이VirtualProtect 크기
VirtualProtect((LPVOID)originPointer, sizeof(char) * 5, PAGE_EXECUTE_READWRITE, &oldProtect);
내가 분명히
그러나이
01 실패이
VirtualProtect((LPVOID)originPointer, 0, PAGE_EXECUTE_READWRITE, &oldProtect);
작동 할 것으로 예상 무엇
HMODULE APIENTRY hLoadLibrary(LPCWSTR lpFileName) {
MessageBox(NULL, "NOT LOADING A LIBRA1RY!", "YO", MB_OK);
return NULL;
};
BOOL APIENTRY DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
DWORD* hookPointer = (DWORD*)&hLoadLibrary;
DWORD* originPointer = (DWORD*)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW");
DWORD offset = (DWORD)hookPointer - (DWORD)originPointer - 5;
DWORD oldProtect;
VirtualProtect((LPVOID)originPointer, sizeof(char) * 5, PAGE_EXECUTE_READWRITE, &oldProtect);
char* p = (char*)originPointer;
*p = '\xE9';
p++;
DWORD* q = (DWORD*)p;
*q = offset;
VirtualProtect((LPVOID)originPointer, sizeof(char) * 5, oldProtect, &oldProtect);
return TRUE;
}
VirtualProtect((LPVOID)originPointer, 1, PAGE_EXECUTE_READWRITE, &oldProtect);
보호 기능을 1 바이트 만 변경하더라도 작동하는 것으로 나타났습니다.
누군가가이 원리를 설명 할 수 있습니까?
5 바이트 보호 변경 작업이 성공할 것으로 예상 하나 1 바이트 오류가 발생합니까? 왜? 5 바이트로 작동하면 1 바이트로 작동합니다. 설명서를 참조하십시오 : https://msdn.microsoft.com/en-us/library/windows/desktop/aa366898(v=vs.85).aspx – Ivan
'VirtualProtect'의 결과를 검사하여 실패 여부를 확인하지 마십시오 실패 이유를 확인하기 위해'GetLastError'를 호출하지 마십시오. – VTT