Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
ВнизБыла такая ветка: Найти похожие ветки
← →
Riply © (2006-12-06 15:03) [0]"Любителям "скырть процесс" под NT посвящается..." Игорь Шевченко © (02.02.05 10:21)
Здравствуйте !
Вот кусочек из нее (ветки):procedure MakeRealQS(const SysCallData: TSysCallData);
var
OldProtection: DWORD;
FuncPtr: Pointer;
begin
FuncPtr := VirtualAlloc(nil, $1000, MEM_COMMIT, PAGE_READWRITE);
Win32Check(Assigned(FuncPtr));
Move(SysCallData, FuncPtr^, SizeOf(SysCallData));
Win32Check(VirtualProtect(FuncPtr, SizeOf(SysCallData), PAGE_EXECUTE,
OldProtection));
@FRealQuerySystemInformation := FuncPtr;
end;
function IsNtDllCodeHooked (const FileName: string; ProcOffset: ULONG): Boolean;
var
Image: THSPeImage;
SysCall: TSysCallData;
SysCall2: TSysCallData;
QSPtr: Pointer;
begin
Image := THSPEImage.Create (FileName);
try
Move(Image.RVAData[ProcOffset]^, SysCall, SizeOf(SysCall));
finally
Image.Free;
end;
QSPtr := GetProcAddress(GetModuleHandle("ntdll.dll"),
"NtQuerySystemInformation");
Move(QSPtr^, SysCall2, SizeOf(SysCall2));
Result := not CompareMem(@SysCall, @SysCall2, SizeOf(SysCall));
if Result then MakeRealQS (SysCall);
end;
function IsNtDllHooked: Boolean;
const
SDllPath = "%SystemRoot%\system32\ntdll.dll";
var
DllPath: ZString;
HFile, HMap: THandle;
Map: Pointer;
Headers: PImageNtHeaders;
QSysInfo: Pointer;
begin
Result := false;
Win32Check(ExpandEnvironmentStringsA(SDllPath, DllPath, SizeOf(DllPath)) <> 0);
HFile := CreateFileA(DllPath, GENERIC_READ, FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, INVALID_HANDLE_VALUE);
Win32Check(HFile <> INVALID_HANDLE_VALUE);
try
HMap := CreateFileMappingA(HFile, nil, PAGE_READONLY, 0, 0, nil);
Win32Check(HMap <> 0);
try
Map := MapViewOfFile(HMap, FILE_MAP_READ, 0, 0, 0);
Win32Check(Assigned(Map));
try
Headers := RtlImageNtHeader(HMODULE(Map));
if Assigned(Headers) then
Result := Headers.OptionalHeader.ImageBase <> GetModuleHandle("ntdll.dll");
if not Result then // ???
begin
QSysInfo := GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation");
if Assigned(QSysInfo) then
begin
Result:= (Cardinal(QSysInfo) <= Headers.OptionalHeader.ImageBase)
or (Cardinal(QSysInfo) > Headers.OptionalHeader.ImageBase + Headers.OptionalHeader.SizeOfCode);
if not Result then // ???
Result := IsNtDllCodeHooked(DllPath, ULONG(QSysInfo) - Headers.OptionalHeader.ImageBase);
end else
Result := true;
end;
finally
UnmapViewOfFile(Map);
end;
finally
CloseHandle(HMap);
end;
finally
CloseHandle(HFile);
end;
end;
У меня возник вопрос:
Если мы в IsNtDllHooked доходим до строчки:
Result := IsNtDllCodeHooked(DllPath, ULONG(QSysInfo) - Headers.OptionalHeader.ImageBase), то
в случае различия "кода" у нас создается MakeRealQS(SysCall) и можно получить "не Hooked" ProcessList.
А как его получить ("не Hooked" ProcessList), если мы выходим из IsNtDllHooked на строчках,
помеченных "// ???". Т.е. как получить парамтр ProcOffset для
Move(Image.RVAData[ProcOffset]^, SysCall, SizeOf(SysCall)) ?
← →
Игорь Шевченко © (2006-12-06 15:17) [1]
> А как его получить ("не Hooked" ProcessList), если мы выходим
> из IsNtDllHooked на строчках,
> помеченных "// ???". Т.е. как получить парамтр ProcOffset
> для
> Move(Image.RVAData[ProcOffset]^, SysCall, SizeOf(SysCall))
> ?
ntdll.dll всегда грузится по одному и тому же адресу, а именно, Headers.OptionalHeader.ImageBase.
Адрес можно получить вот так:
QSysInfo := GetProcAddress(Headers.OptionalHeader.ImageBase, "NtQuerySystemInformation");
← →
Riply © (2006-12-06 17:52) [2]>[1] Игорь Шевченко © (06.12.06 15:17)
>Адрес можно получить вот так:
>QSysInfo := GetProcAddress(Headers.OptionalHeader.ImageBase, "NtQuerySystemInformation");
Спасибо ! Все работает. Но мне не удается понять некоторые моменты:
Почему, в IsNtDllCodeHooked, SysCall создается таким "хитрым" образом (еще раз "мапиться" файл),
хотя, казалось бы, можно проще (исходя из "Адрес можно получить вот так"):
pTmp:= GetProcAddress(Headers.OptionalHeader.ImageBase, "NtQuerySystemInformation");
Move(pTmp^, SysCall, SizeOf(SysCall)); ?
И почему ProcOffset для Move(Image.RVAData[ProcOffset]^, SysCall, SizeOf(SysCall))
расчитывается так:
ULONG(QSysInfo) - Headers.OptionalHeader.ImageBase, а не ULONG(pTmp) - Headers.OptionalHeader.ImageBase
т.е. берется адрес, возможно "хукнутой" процедуры, а не "настоящей" ?
← →
Shuhard © (2006-12-06 21:58) [3]С предыдущим, вроде, разобралась(святая наивность), и снова совсем запуталась :(
Result := Headers.OptionalHeader.ImageBase <> GetModuleHandle(_NtDll);
if not Result then
begin
QSysInfo := GetProcAddress(GetModuleHandle(_NtDll), _NtQuerySysInfo);
if Assigned(QSysInfo) then
begin
Result:= (Cardinal(QSysInfo) <= Headers.OptionalHeader.ImageBase)
or (Cardinal(QSysInfo) > Headers.OptionalHeader.ImageBase + Headers.OptionalHeader.SizeOfCode);
Допустим дошли мы до сюда... и получили Result = True. Т.е. не попали в нужный диапазон.
Как быть дальше ?
Ведь GetProcAddress(Headers.OptionalHeader.ImageBase, _NtQuerySysInfo) нам вернет
адрес "хакнутой" процедуры т.к. Headers.OptionalHeader.ImageBase = GetModuleHandle(_NtDll)
← →
Игорь Шевченко © (2006-12-06 22:31) [4]
> Почему, в IsNtDllCodeHooked, SysCall создается таким "хитрым"
> образом (еще раз "мапиться" файл),
> хотя, казалось бы, можно проще (исходя из "Адрес можно получить
> вот так"):
> pTmp:= GetProcAddress(Headers.OptionalHeader.ImageBase,
> "NtQuerySystemInformation");
Минуточку. Цель кода определить, что Ntdll подменена и прокукарекать в случае Result = true
← →
Игорь Шевченко © (2006-12-06 22:37) [5]
> А как его получить ("не Hooked" ProcessList), если мы выходим
> из IsNtDllHooked на строчках,
> помеченных "// ???". Т.е. как получить парамтр ProcOffset
> для
> Move(Image.RVAData[ProcOffset]^, SysCall, SizeOf(SysCall))
> ?
Найти смещение в файле, анализируя таблицу экспорта.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.046 c