2017-10-04 11 views
-3

나는 윈도우 후킹 및 Win32 실행 파일의 내부 (https://en.wikipedia.org/wiki/Hooking#Windows)에 대해 읽고 있어요 및 코드 블록을 보았다 항상 혼란 스럽네요.) 그러나 이것이 작동하는 방식은 iid이라는 IMAGE_IMPORT_DESCRIPTOR 포인터를 만드는 것입니다. iidIMAGE_IMPORT_DESCRIPTOR을 가리키며 pImgImportDesc이라는 개체와 같게 설정됩니다. 따라서 pImgImportDescName 속성을보고 있으며 설정되지 않은 경우 다음 속성으로 이동하겠습니까? 근본적으로, 그것은 마지막 하나를 찾고 있습니까?IMAGE_DOS_HEADER 후킹

도서 또는 비디오에 대한 권장 사항으로 이와 같은 낮은 수준의 정보를 더 많이 볼 수 있습니까? 코드를 읽으면 나 혼란 스럽다.

+0

그것은 다음에 갈 것이다 ** 세트를. 그래서 그것들은 모두 다 통과합니다. – rkapl

+1

코드가 PE 헤더를 구문 분석하고 있습니다. 어느 곳에서나 후크가 없으며 어떤 스트레칭으로도 낮은 레벨이 아닙니다. 기본 C 구문에 대해 묻는 것은 스택 오버플로를 사용하기위한 것이 아닙니다. – IInspectable

+0

입력 해 주셔서 감사합니다.하지만이 레벨이 낮지 않은 이유는 무엇입니까?나는 당신이 어셈블리와 비교하지 않는다면 PE 헤더를 꽤 낮은 레벨로 다루지 않는다는 것을 의미한다. (진정으로 묻고 있는데, 이것에 익숙하지 않다.) 미안 어떤 종류의 프로그래밍에서 내 배경의 대부분은 높은 수준의 자바/웹 개발, 나는 단지 이런 걸 다루는 교수형을 얻으려고했다. 나는 어떤 것들에 대한 기본적인 설명/문법을 다루는 여기에 많은 질문을 보았다. – JimmySmithJR

답변

5
PIMAGE_DOS_HEADER pImgDosHeaders = (PIMAGE_DOS_HEADER)module; 
  • 프로세스는 OS가 선택한 특정 메모리 주소에로드됩니다. 프로세스의 HMODULE 인스턴스 핸들은로드 주소와 같습니다. 그래서 이것은로드 주소의 시작 부분에 프로세스의 IMAGE_DOS_HEADER 구조체에 대한 포인터를 얻고 있습니다.

PIMAGE_NT_HEADERS pImgNTHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)pImgDosHeaders + pImgDosHeaders->e_lfanew); 
  • e_lfanew 필드
  • 는 프로세스의 IMAGE_NT_HEADERS 구조체 오프셋된다. 이 을 포인터로 입력하고 e_lfanew 바이트만큼 값을 증가시킨 다음 결과를 IMAGE_NT_HEADERS*으로 입력 캐스트합니다.

위와

PIMAGE_IMPORT_DESCRIPTOR pImgImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((LPBYTE)pImgDosHeaders + pImgNTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); 
  • 똑같은
  • . DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress은 프로세스의 Imports 테이블의 첫 번째 IMAGE_IMPORT_DESCRIPTOR 구조체에 대한 오프셋입니다. pImgDosHeaders이 해당 바이트만큼 증가되고 IMAGE_IMPORT_DESCRIPTOR*으로 입력 캐스트됩니다.

for (IMAGE_IMPORT_DESCRIPTOR *iid = pImgImportDesc; iid->Name != NULL; iid++) 
  • 이 전체 수입량 테이블 통해 반복된다. iid은 테이블의 첫 번째 설명자를 가리키며 루프는 Name이 할당되지 않은 설명자를 찾을 때까지 테이블을 통해 계속 진행되며 테이블의 끝을 나타냅니다.

은 자세한 내용은이 MSDN 문서를 읽기 :이 ** 경우

Peering Inside the PE: A Tour of the Win32 Portable Executable File Format