PVOID SymGetProcAddressKernel(LPCWSTR szApiName)
{
PSYSTEM_MODULE_INFORMATION SystemInfo;
BOOL bFind =FALSE;
DWORD dwBufferSize;
WCHAR *wszKernels[]={
L
"ntoskrnl"
,
//
- 单处理器,不支持PAE
L
"ntkrnlpa"
,
//
- 单处理器,支持PAE
L
"ntkrnlmp"
,
//
- 多处理器,不支持PAE
L
"ntkrpamp"
//
- 多处理器,支持PAE
};
DWORD i;
BYTE memory[0x2000];
ZeroMemory(memory, sizeof(memory));
SYMBOL_INFOW * info = (SYMBOL_INFOW *)memory;
HMODULE hDll;
WCHAR wcsPdb[MAX_PATH]={0};
WCHAR wcsExe[MAX_PATH]={0};
PCHAR Ptr,Last;
PWCHAR PathPtr;
WCHAR path[MAX_PATH] = { 0 };
WCHAR wcsImageName[MAX_PATH] = {0};
NtQuerySystemInformation((SYSTEMINFOCLASS)11,0,0,&dwBufferSize);
SystemInfo = (PSYSTEM_MODULE_INFORMATION)malloc(dwBufferSize);
NtQuerySystemInformation((SYSTEMINFOCLASS)11,SystemInfo,dwBufferSize,0);
Ptr = (PCHAR)SystemInfo->aSM[0].ImageName + strlen(SystemInfo->aSM[0].ImageName)-1;
Last = Ptr;
while
(*Ptr){
if
(*Ptr ==
'\\'
){
Last = Ptr+1;
break
;
}
Ptr --;
}
MultiByteToWideChar(CP_ACP,
0,
Last,
-1,
wcsImageName,
sizeof(wcsImageName));
for
(i=0;i<4;i++){
if
(!wcsnicmp(wszKernels[i],wcsImageName,wcslen(wszKernels[i]))){
bFind =TRUE;
break
;
}
}
DWORD ret=0;
if
(bFind){
wcscpy(wcsPdb,L
"ntkrpamp.pdb"
);
wcscpy(wcsExe,wszKernels[i]);
wcscat(wcsExe,L
".exe"
);
GetModuleFileNameW(0, path, _countof(path));
PathPtr= path+wcslen(path);
while
(*PathPtr!=
'\\'
)
PathPtr--;
*PathPtr =L
'\0'
;
if
(!SymInitializeW(GetCurrentProcess(),path, TRUE)){
return
NULL;
}
hDll = LoadLibraryExW(wcsImageName,NULL,DONT_RESOLVE_DLL_REFERENCES);
printf
(
"%s:基地址%x\n"
,(DWORD)SystemInfo->aSM[0].ImageName,(PCHAR)SystemInfo->aSM[0].Base);
SymLoadModuleExW(GetCurrentProcess(),NULL,wszKernels[i],0,(DWORD)hDll,0,0,0);
info->SizeOfStruct = sizeof(SYMBOL_INFOW);
info->MaxNameLen = MAX_SYM_NAME;
SymFromNameW(GetCurrentProcess(),szApiName,info);
ret =(DWORD)info->Address - (DWORD)hDll+(DWORD)SystemInfo->aSM[0].Base;
FreeLibrary(hDll);
SymCleanup(GetCurrentProcess());
}
return
(PVOID)ret;
}