2000的核心是:ntoskrnl.exe
xp核心是: ntkrnlpa.exe
//我猜,其实找到的第一个模块就是所谓的核心模块
难怪这两天找内核函数的地址老是找错。
网上抄来抄去的文章比较多,一般有点过时,不能直接用起来的,但是很好的参考。
发个改过的找核心基地址的函数,容易懂些。
function ZwQuerySystemInformation(SystemInformationClass:SYSTEM_INFORMATION_CLASS; SystemInformation: Pointer; Length: DWORD; var ReturnLength: DWord): DWORD;stdcall;external 'NTDLL.DLL'; //按DELPHI的习惯定义,网上能找到的定义不是太好
procedure Test;
var
Buf: array of Byte;
cbRet: WORD;
ModuleInformation: PSYSTEM_MODULE_INFORMATION;
Count: PDWORD;
I: Integer;
begin
if not EnabledDebugPrivilege(true) then Exit; //提到Debug权限,不然要出错的
ZwQuerySystemInformation(SystemModuleInformation, nil, 0, cbRet); //测试需要的BUF大小,看到用循环的头疼
SetLength(buf, cbRet);
if ZwQuerySystemInformation(SystemModuleInformation, @Buf[0], cbRet, cbRet) <> STATUS_SUCCESS then
Exit;
Count := PDWORD(@Buf[0]); //猜中了,是所有系统模块的个数
ModuleInformation := PSYSTEM_MODULE_INFORMATION(@Buf[4]);
for I := 1 to Count^ do
begin
if Pos('ntkrnlpa.exe', ModuleInformation.ImageName) >= 1 then
begin
ShowMessage('KernelBase: ' + IntToHex(DWORD(ModuleInformation.Base), 8));
//如前面所说,第一个就是系统核心,还可以顺便把2000和XP区分开来
break;
end;
Inc(ModuleInformation);
end;
end;
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!