kernel32获取的两种方法

//

#include "stdafx.h"

# include <Windows.h>

//代码来自看雪论坛

int main1()
{
	DWORD dwPEB; 
	DWORD dwLDR; 
	DWORD dwInitList; 
	DWORD dwDllBase;//当前地址 
	PIMAGE_DOS_HEADER pImageDosHeader;//指向DOS头的指针
	PIMAGE_NT_HEADERS pImageNtHeaders;//指向NT头的指针
	DWORD dwVirtualAddress;//导出表偏移地址
	PIMAGE_EXPORT_DIRECTORY pImageExportDirectory;//指向导出表的指针 
	PTCHAR lpName;//指向dll名字的指针
	TCHAR szKernel32[] = TEXT("KERNEL32.dll"); 
	TCHAR szBuffer[256]; __asm { mov eax, FS:[0x30]//获取PEB所在地址
		mov dwPEB, eax } dwLDR = *(PDWORD)(dwPEB + 0xc);//获取PEB_LDR_DATA 结构指针 
	dwInitList = *(PDWORD)(dwLDR + 0x1c);
	
	for (; dwDllBase = *(PDWORD)(dwInitList + 8);
	dwInitList = *(PDWORD)dwInitList) 
	{ pImageDosHeader = (PIMAGE_DOS_HEADER)dwDllBase; 
	pImageNtHeaders = (PIMAGE_NT_HEADERS)(dwDllBase + pImageDosHeader->e_lfanew);
	dwVirtualAddress = pImageNtHeaders->OptionalHeader.DataDirectory[0].VirtualAddress;
	
	pImageExportDirectory = (PIMAGE_EXPORT_DIRECTORY)(dwDllBase + dwVirtualAddress);

	lpName = (PTCHAR)(dwDllBase + pImageExportDirectory->Name);

	if (strlen(lpName) == 0xc && !strcmp(lpName, szKernel32))

    wsprintf(szBuffer, TEXT("kernel32.dll的基地址为%0x"), dwDllBase);
	MessageBox(NULL, szBuffer, NULL, MB_OK); 
} 


return 0;}

  

posted @ 2021-09-10 22:03  admrty  阅读(185)  评论(0)    收藏  举报