2017-12-07 40 views
0

그래서 저는 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 바이트 만 변경하더라도 작동하는 것으로 나타났습니다.

누군가가이 원리를 설명 할 수 있습니까?

+0

5 바이트 보호 변경 작업이 성공할 것으로 예상 하나 1 바이트 오류가 발생합니까? 왜? 5 바이트로 작동하면 1 바이트로 작동합니다. 설명서를 참조하십시오 : https://msdn.microsoft.com/en-us/library/windows/desktop/aa366898(v=vs.85).aspx – Ivan

+0

'VirtualProtect'의 결과를 검사하여 실패 여부를 확인하지 마십시오 실패 이유를 확인하기 위해'GetLastError'를 호출하지 마십시오. – VTT

답변

2

페이지 보호 속성은 반드시 페이지 크기와 동일한 세밀도를 가져야합니다. 4096 바이트. 전달할 주소가 페이지 끝 부분에 위치하는 경우에는 불필요한 크기에 대해 거짓말해서는 안됩니다.

+0

답변 해 주셔서 감사합니다. 방금 msdn을 다시 확인한 결과, "액세스 보호 속성이 변경되는 영역의 크기 (바이트)"다음에 읽지 못하게 된 것 같습니다. 그래서 내가 지정한 크기가 다음 페이지를 포함한다면 보호 속성이 두 페이지 모두에 설정 될 것입니다. – jHN

+0

예, 필연적입니다. API는 페이지 크기와 유효한 보호 속성에 대한 가정을 강력하게 피할 수 있으며 프로세서 구현 세부 사항입니다. –

+0

from wikipedia * 사용 가능한 페이지 크기는 명령어 세트 아키텍처, 프로세서 유형 및 작동 (주소 지정) 모드에 따라 다릅니다. 운영 체제는 아키텍처에서 지원하는 크기 중 하나 이상의 크기를 선택합니다. * 따라서 지원되는 페이지 크기 중 하나를 선택하는 것은 OS에 달려 있습니다. –