나는 가져 오기 테이블에서 정보를 추출하는 python 스크립트를 작성하려고합니다. 필자는 각 dll에서 가져온 함수 이름을 가져올 수있었습니다. 그러나 나는 힌트에 어떻게 접근 할 수 있을지 확신하지 못한다. 제안 사항이 있으십니까?PE 파일의 IMAGE_IMPORT_BY_NAME 구조에서 힌트를 얻을 수있는 방법은 무엇입니까?
1
A
답변
1
이미 이름을 열거하고 있으므로 32 비트 모듈의 IMAGE_THUNK_DATA 구조체 (또는 PE32 +의 경우 IMAGE_THUNK_DATA64)에 대한 포인터가 있다고 가정합니다. 그곳에. 다르게 지정하지 않았으므로 32 비트 모듈을 다루고 있다고 가정합니다.
IMAGE_THUNK_DATA 배열은 DWORD 배열이며 각 DWORD는 가져온 함수를 나타냅니다. 서수 대신 이름으로 함수를 가져 오려면 DWORD에 최상위 비트가 설정되지 않았는지 확인해야합니다 (예 : 0x80000000).
1> 상위 비트가 설정된 경우 0xFFFF와 ANDed 된 DWORD 값 (낮은 WORD를 사용하는 것)은 서수 ("힌트"값이기도 함)입니다. 따라서 함수는 서수로 가져오고 사용할 수있는 이름이 없습니다.
2> 상위 비트가 설정되지 않은 경우 전체 DWORD는 IMAGE_IMPORT_BY_NAME 구조에 대한 RVA (메모리 이미지에 대한 포인터, 기준 없음)입니다. 파일 이미지에서 읽는다면 RVA를 파일 오프셋으로 변환해야합니다. 또한 이미이 작업을 수행 중이라고 가정합니다. 그렇지 않으면 가져온 함수 이름이없는 것입니다. WINNT.H에서 다음과 같이 IMAGE_IMPORT_BY_NAME 구조는 정의된다
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
참고 : 물론 이름에 지정된 바이트는 이름 만 한 문자보다 클 수로 가져온 함수 이름의 문자 배열의 시작을 표시 .
첫 번째 단어는 힌트입니다. 이미 이름이 있으면 건너 뛰면됩니다. 문제가 있음을 보여줄 수있는 코드 스 니펫을 사용합니까?
Perfect. 내 문제가 해결되었습니다! 나는 이름을 알기 위해 2 바이트를 건너 뛸 필요가 있지만 그 두 바이트가 실제로 힌트라는 것을 알지 못한다는 것을 깨달았다. 감사! – Likak