Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.24;
Скачать: CL | DM;

Вниз

Была такая ветка:   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.053 c
2-1165248524
Master_
2006-12-04 19:08
2006.12.24
Всетаки что лучше TTable или TQuery ?


2-1165090318
sat
2006-12-02 23:11
2006.12.24
списки


2-1165501263
kivadim
2006-12-07 17:21
2006.12.24
как сделать события типа: OnChildFormCreate и OnChildFormDestroy?


15-1165155231
crunk
2006-12-03 17:13
2006.12.24
пересылка


6-1154014049
Gbp
2006-07-27 19:27
2006.12.24
Вопросы по TWebBrowser