获取进程基址

有很多种方法可以获得进程空间的基址:

方法一:在x86上,可以直接用汇编语言来获得:


HINSTANCE ins = NULL;
__asm
	{
		mov eax, fs:[0x30];
		mov eax, DWORD PTR [eax+8];
		mov ins, eax;
	}

return bRet;


ins就是当前进程的基址。

然而在x64上,由于该死的vs不再支持直接编写汇编语言,所以,不能通过上面的方法获得进程基址。当然,可以在编译选项中添加x64的汇编语言或者下载Intel开发包,就可以使vs能够支持在x64下编写汇编。

方法二:

直接通过WinAPI获得:

HMODULE hModule = GetModuleHandle(NULL); 

方法三:

通过读取PEB模块来获取基址:

LPCVOID getLoadAddress( DWORD dwProcessId )
{
	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, 0, dwProcessId);

	HMODULE hModule = LoadLibrary(TEXT("Ntdll.dll "));
	if (NULL == hModule)
		return NULL;

	PROCESS_BASIC_INFORMATION pbi = {0};
	NtQueryInformationProcessPtr NtQueryInformationProcess = (NtQueryInformationProcessPtr)GetProcAddress(hModule, "NtQueryInformationProcess");
	LONG status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL);
	if (NULL != hModule)
		FreeLibrary(hModule);

	if (NULL != hProcess)
		CloseHandle(hProcess);

	return pbi.PebBaseAddress->Reserved3[1];
}

该方法在x86和x64下,都适用。可根据进程id获得相应进程基地址。

【扩展1】了解PEB结构。既然可以获得PEB结构,那就意味着可以知道该结构中的所有数据,若能够掌握该数据,可以更加全面的了解进程环境块。

【扩展2】区分进程地址空间的装载地址和进程地址空间的基地址。装载地址的内容就是基地址,基地址的内容就是PE头信息。

你可能感兴趣的:(winapi,x86,asm)