BLOG main image
분류 전체보기 (137)
궁시렁 (39)
컴쟁이의 연구실 (65)
리버싱 (17)
배워보자 (3)
좋은 곳 (9)
seyool님의 언팩미#1 들여다보기.
jz in reverse engineering
MS API 드래프트 제 1버전 공개
낚시광준초리의 Blog 세상(IT-Fo..
[Kernel] KeServiceDescriptorTa..
我好电脑,我是一名的程序设计员..
SSDT에 대한 고찰
::거듭나기::
불필요한 관심
^0^range.Net - 신은 불공평하다..
138,103 Visitors up to today!
Today 3 hit, Yesterday 28 hit
daisy rss
^0^range.net
2008/07/28 15:44

Base Relocation Demystified(기준재배치의 신비를 벗겨버리자)


typedef struct _IMAGE_FIXUP_ENTRY {
	WORD offset:12;
	WORD type:4;
} IMAGE_FIXUP_ENTRY, *PIMAGE_FIXUP_ENTRY;

DWORD
FindKiServiceTable(HMODULE hModule, DWORD dwKeSDTOffset)
{
	PIMAGE_NT_HEADERS NtHeaders = NULL;
	PIMAGE_BASE_RELOCATION ImageBaseReloc = NULL;
	PIMAGE_FIXUP_ENTRY ImageFixup = NULL;
	DWORD RelocTableSize = 0;
	DWORD i;
	DWORD dwVirtualAddress;
	DWORD dwRva;
	DWORD dwKiServiceTable = 0;

	NtHeaders = RtlImageNtHeader( hModule );

	ImageBaseReloc = (PIMAGE_BASE_RELOCATION)RtlImageDirectoryEntryToData( (PVOID)hModule,
													TRUE,
													IMAGE_DIRECTORY_ENTRY_BASERELOC,
													&RelocTableSize );
	if ( NULL == ImageBaseReloc ) {
		return 0;
	}

	do {

		ImageFixup = (PIMAGE_FIXUP_ENTRY)((DWORD)ImageBaseReloc + sizeof(IMAGE_BASE_RELOCATION));

		for ( i = 0;
			i < ( ImageBaseReloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION) ) >> 1;
			i++, ImageFixup++ ) {

				if ( ImageFixup->type == IMAGE_REL_BASED_HIGHLOW ) {
					dwVirtualAddress = ImageBaseReloc->VirtualAddress + ImageFixup->offset;
					dwRva = *(PDWORD)((DWORD)hModule+dwVirtualAddress) - (DWORD)NtHeaders->OptionalHeader.ImageBase;

					if ( dwRva == dwKeSDTOffset ) {
						if (*(PWORD)((DWORD)hModule + dwVirtualAddress-2) == 0x05c7) {
							dwKiServiceTable = *(PDWORD)((DWORD)hModule +
								dwVirtualAddress+4) - NtHeaders->OptionalHeader.ImageBase;
							return dwKiServiceTable;
						}
					}
				}
		}

		*(PDWORD)&ImageBaseReloc += ImageBaseReloc->SizeOfBlock;
	} while ( ImageBaseReloc->VirtualAddress );

	return 0;
}




크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback Address :: http://0range.net/trackback/249 관련글 쓰기
Tracked from ::거듭나기:: | 2008/07/29 14:26 | DEL
며칠전 부터 SSDT에 대해서 유심히 살펴보았고, 변경된 SSDT를 Restore해주는 녀석의 코드를 살펴본 결과를 정리해보고자 한다. sunwangme라는 사람이 만든 sdtreset 이라는 녀석은 메모리에 있는 SSDT를 디스크내에 ntoskrnl.exe 안의 export된 SSDT와 비교해서 바뀐 부분을 복구시키는 간단한 POC이다. 그런데 한가지 문제는 내가 사용하는 PC에는 현재 KAV(카스퍼스키 백신)이 깔려 있기...
BlogIcon jiman | 2008/07/29 14:27 | PERMALINK | EDIT/DEL | REPLY
트랙백 걸어유~ ㅎㅎ
BlogIcon seyool | 2008/07/30 09:14 | PERMALINK | EDIT/DEL
Trackback 고마워요 ^______^
중국사람이 맹근 소스인데, 깔끔해서 퍼왔어요.
재미난거 맹글어서 또 올릴게요.. 기대해도 좋습니다 +_+
BlogIcon jiman | 2008/07/30 14:18 | PERMALINK | EDIT/DEL | REPLY
와우~ 기대됩니다. ㅎㅎ
Name
Password
Homepage
Secret