Windows의 x 64 플랫폼은 PEB 표를 획득, 그리고 kernel32.dll에서 기본 주소, 기능을 얻을 그것을 얻기 위해

면책 조항 :이 문서는 블로거 원본입니다은 허용 블로거없이 복제 할 수 없다. https://blog.csdn.net/Giser_D/article/details/90718842

참조 : https://www.cnblogs.com/aliflycoris/p/5185097.html

그리고 다른 블로거 

 

몇 마디의 남자는이 입력했다 :

 

기준 블로거 : 첫 번째는 방법 64 비트 임베디드 플랫폼에서의 어셈블리 코드를 이해하게, PEB의 기본 주소를 얻는 것입니다 https://blog.csdn.net/Giser_D/article/details/90670974을

어셈블리 코드 :

.CODE
  GetPeb PROC
    mov rax,gs:[60h]
  ret
  GetPeb ENDP
 END

외부 참조 헤더 파일 :

extern "C" PVOID64 _cdecl GetPeb();

다음의 Kernal32 기본 주소를 얻을 :

HMODULE getKernel32Address()
{
	PVOID64 Peb = GetPeb();
	PVOID64 LDR_DATA_Addr = *(PVOID64**)((BYTE*)Peb+0x018);  //0x018是LDR相对于PEB偏移   存放着LDR的基地址
	UNICODE_STRING* FullName; 
	HMODULE hKernel32 = NULL;
	LIST_ENTRY* pNode = NULL;
	pNode =(LIST_ENTRY*)(*(PVOID64**)((BYTE*)LDR_DATA_Addr+0x30));  //偏移到InInitializationOrderModuleList
	while(true)
	{
		FullName = (UNICODE_STRING*)((BYTE*)pNode+0x38);//BaseDllName基于InInitialzationOrderModuList的偏移
		if(*(FullName->Buffer+12)=='\0')
		{
			hKernel32 = (HMODULE)(*((ULONG64*)((BYTE*)pNode+0x10)));//DllBase
			break;
		}
		pNode = pNode->Flink;
	}
	return hKernel32;
}

 

그러면 어드레스, 함수에 대응하는 주소를 획득하는 상기의 방법에 의해 수득 된 함수의 이름은 :

PVOID GetAddressFromExportTable(PVOID pBaseAddress, PCHAR pszFunctionName)
{
	PVOID get_address;
	ULONG ulFunctionIndex = 0;
	// Dos Header
	PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBaseAddress;
	// NT Header
	PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((PUCHAR)pDosHeader + pDosHeader->e_lfanew);
	// Export Table
	PIMAGE_EXPORT_DIRECTORY pExportTable = (PIMAGE_EXPORT_DIRECTORY)((PUCHAR)pDosHeader + pNtHeaders->OptionalHeader.DataDirectory[0].VirtualAddress);
	// 有名称的导出函数个数
	ULONG ulNumberOfNames = pExportTable->NumberOfNames;
	// 导出函数名称地址表
	PULONG lpNameArray = (PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfNames);
	PCHAR lpName = NULL;
	// 开始遍历导出表
	for (ULONG i = 0; i < ulNumberOfNames; i++)
	{
		lpName = (PCHAR)((PUCHAR)pDosHeader + lpNameArray[i]);
		// 判断是否查找的函数
		if (0 == _strnicmp(pszFunctionName, lpName, strlen(pszFunctionName)))
		{
			// 获取导出函数地址
			USHORT uHint = *(USHORT *)((PUCHAR)pDosHeader + pExportTable->AddressOfNameOrdinals + 2 * i);
			ULONG ulFuncAddr = *(PULONG)((PUCHAR)pDosHeader + pExportTable->AddressOfFunctions + 4 * uHint);
			get_address = (PVOID)((PUCHAR)pDosHeader + ulFuncAddr);
			break;
		}
	}
	return get_address;
}

좋아, 나는 조심스럽게 말을하지, 도움을 원하지만 직접 사용할 수 있습니다. 64 비트 플랫폼의 경우, 기억!

으로 ExitThread 주소 GetAddressFromExportTable의 Kernel32.dll에서 함수가 오류의 실제 마진을 얻을 수있다, 특정 원인이 알려져 있지 않다가, 권장하지 않습니다!

 

추천

출처blog.csdn.net/Giser_D/article/details/90718842