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

Вниз

Прошу прощения, что повторяюсь... HideProcess   Найти похожие ветки 

 
tima705 ©   (2007-10-03 18:45) [0]

Прошу прощения, что повторяюсь, но, наверное, я не один такой... В киберпросторах "гуляет" статья про скрытие приложения с вкладки Процессы в ХР. Пример рабочий, но после  завершения приложения
возникает ошибка [что-то по адресу такому-то обратилось по адресу такому-то и поэтому память не может быть read]. Объясните мне пожалуйста, из-за чего ошибка и как ее устранить.. Заранее благодарен.

Код программы:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormShow(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

//function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall; external "lib.dll";
function HideProcess(pid: dWord;HideOnlyFromTaskManager: boolean): boolean; stdcall;
external "lib.dll" name "HideProcess";
{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
{вызов функции - прячем текущий процесс (нашу программу)}
ShowWindow(Application.Handle, SW_HIDE);
HideProcess(GetCurrentProcessId, false);
end;

end.


 
tima705 ©   (2007-10-03 18:46) [1]

и код библиотеки:

library lib;

uses
Windows,
SysUtils,
ImageHlp,
TlHelp32;

type SYSTEM_INFORMATION_CLASS = (
SystemBasicInformation,
SystemProcessorInformation,
SystemPerformanceInformation,
SystemTimeOfDayInformation,
SystemNotImplemented1,
SystemProcessesAndThreadsInformation,
SystemCallCounts,
SystemConfigurationInformation,
SystemProcessorTimes,
SystemGlobalFlag,
SystemNotImplemented2,
SystemModuleInformation,
SystemLockInformation,
SystemNotImplemented3,
SystemNotImplemented4,
SystemNotImplemented5,
SystemHandleInformation,
SystemObjectInformation,
SystemPagefileInformation,
SystemInstructionEmulationCounts,
SystemInvalidInfoClass1,
SystemCacheInformation,
SystemPoolTagInformation,
SystemProcessorStatistics,
SystemDpcInformation,
SystemNotImplemented6,
SystemLoadImage,
SystemUnloadImage,
SystemTimeAdjustment,
SystemNotImplemented7,
SystemNotImplemented8,
SystemNotImplemented9,
SystemCrashDumpInformation,
SystemExceptionInformation,
SystemCrashDumpStateInformation,
SystemKernelDebuggerInformation,
SystemContextSwitchInformation,
SystemRegistryQuotaInformation,
SystemLoadAndCallImage,
SystemPrioritySeparation,
SystemNotImplemented10,
SystemNotImplemented11,
SystemInvalidInfoClass2,
SystemInvalidInfoClass3,
SystemTimeZoneInformation,
SystemLookasideInformation,
SystemSetTimeSlipEvent,
SystemCreateSession,
SystemDeleteSession,
SystemInvalidInfoClass4,
SystemRangeStartInformation,
SystemVerifierInformation,
SystemAddVerifier,
SystemSessionProcessesInformation
);

_IMAGE_IMPORT_DESCRIPTOR = packed record
case Integer of
0:(
Characteristics: DWORD);
1:(
OriginalFirstThunk:DWORD;
TimeDateStamp:DWORD;
ForwarderChain: DWORD;
Name: DWORD;
FirstThunk: DWORD);
end;
IMAGE_IMPORT_DESCRIPTOR=_IMAGE_IMPORT_DESCRIPTOR;
PIMAGE_IMPORT_DESCRIPTOR=^IMAGE_IMPORT_DESCRIPTOR;

PFARPROC=^FARPROC;

procedure ReplaceIATEntryInOneMod(pszCallerModName: Pchar; pfnCurrent:

FarProc; pfnNew: FARPROC; hmodCaller: hModule);
var ulSize: ULONG;
pImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
pszModName: PChar;
pThunk: PDWORD; ppfn:PFARPROC;
ffound: LongBool;
written: DWORD;
begin
pImportDesc:= ImageDirectoryEntryToData(Pointer(hmodCaller),

TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
if pImportDesc = nil then exit;
while pImportDesc.Name <> 0 do begin
pszModName := PChar(hmodCaller + pImportDesc.Name);
if (lstrcmpiA(pszModName, pszCallerModName) = 0) then break;
Inc(pImportDesc);
end;

if (pImportDesc.Name = 0) then exit;
pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk);
while pThunk^ <> 0 do begin
ppfn := PFARPROC(pThunk);
fFound := (ppfn^ = pfnCurrent);
if (fFound) then begin
VirtualProtectEx(GetCurrentProcess,ppfn,4,PAGE_EXECUTE_READWRITE,writt

en);
WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew),

Written);
exit;
end;
Inc(pThunk);
end;
end;

var addr_NtQuerySystemInformation: Pointer;
mypid: DWORD;
fname: PCHAR;
mapaddr: PDWORD;
hideOnlyTaskMan: PBOOL;

function myNtQuerySystemInfo(SystemInformationClass:

SYSTEM_INFORMATION_CLASS; SystemInformation: Pointer;
SystemInformationLength:ULONG; ReturnLength:PULONG):LongInt; stdcall;
label onceagain, getnextpidstruct, quit, fillzero;
asm
push ReturnLength
push SystemInformationLength
push SystemInformation
push dword ptr SystemInformationClass
call dword ptr [addr_NtQuerySystemInformation]
or eax,eax
jl quit
cmp SystemInformationClass, SystemProcessesAndThreadsInformation
jne quit

onceagain:
mov esi, SystemInformation

getnextpidstruct:
mov ebx, esi
cmp dword ptr [esi],0
je quit
add esi, [esi]
mov ecx, [esi+44h]
cmp ecx, mypid
jne getnextpidstruct
mov edx, [esi]
test edx, edx
je fillzero
add [ebx], edx
jmp onceagain

fillzero:
and [ebx], edx
jmp onceagain

quit:
mov Result, eax
end;

procedure InterceptFunctions;
var hSnapShot: THandle;
me32: MODULEENTRY32;
begin
addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle("ntdll.d

ll"),"NtQuerySystemInformation");
hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProces

sId);
if hSnapshot=INVALID_HANDLE_VALUE then exit;
try
ZeroMemory(@me32,sizeof(MODULEENTRY32));
me32.dwSize:=sizeof(MODULEENTRY32);
Module32First(hSnapShot,me32);
repeat
ReplaceIATEntryInOneMod("ntdll.dll",addr_NtQuerySystemInformation,@MyN

tQuerySystemInfo,me32.hModule);
until not Module32Next(hSnapShot,me32);
finally
CloseHandle(hSnapShot);
end;
end;

procedure UninterceptFunctions;
var hSnapShot: THandle;
me32: MODULEENTRY32;
begin
addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle("ntdll.d

ll"),"NtQuerySystemInformation");
hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProces

sId);
if hSnapshot=INVALID_HANDLE_VALUE then exit;
try
ZeroMemory(@me32,sizeof(MODULEENTRY32));
me32.dwSize:=sizeof(MODULEENTRY32);
Module32First(hSnapShot,me32);
repeat
ReplaceIATEntryInOneMod("ntdll.dll",@MyNtQuerySystemInfo,addr_NtQueryS

ystemInformation,me32.hModule);
until not Module32Next(hSnapShot,me32);
finally
CloseHandle(hSnapShot);
end;
end;

var HookHandle: THandle;

function CbtProc(code: integer; wparam: integer; lparam:

integer):Integer; stdcall;
begin
Result:=0;
end;

procedure InstallHook; stdcall;
begin
HookHandle:=SetWindowsHookEx(WH_CBT, @CbtProc, HInstance, 0);
end;

var hFirstMapHandle:THandle;

function HideProcess(pid:DWORD; HideOnlyFromTaskManager:BOOL):BOOL;

stdcall;
var addrMap: PDWORD;
ptr2: PBOOL;
begin
mypid:=0;
result:=false;
hFirstMapHandle:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,8,"N

tHideFileMapping");
if hFirstMapHandle=0 then exit;
addrMap:=MapViewOfFile(hFirstMapHandle,FILE_MAP_WRITE,0,0,8);
if addrMap=nil then begin
CloseHandle(hFirstMapHandle);
exit;
end;
addrMap^:=pid;
ptr2:=PBOOL(DWORD(addrMap)+4);
ptr2^:=HideOnlyFromTaskManager;
UnmapViewOfFile(addrMap);
InstallHook;
result:=true;
end;

exports HideProcess;

var
hmap: THandle;

procedure LibraryProc(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
if mypid > 0 then UninterceptFunctions()
else CloseHandle(hFirstMapHandle);
end;

begin
hmap:=OpenFileMapping(FILE_MAP_READ,false,"NtHideFileMapping");
if hmap=0 then exit;
try
mapaddr:=MapViewOfFile(hmap,FILE_MAP_READ,0,0,0);
if mapaddr=nil then exit;
mypid:=mapaddr^;
hideOnlyTaskMan:=PBOOL(DWORD(mapaddr)+4);
if hideOnlyTaskMan^ then begin
fname:=allocMem(MAX_PATH+1);
GetModuleFileName(GetModuleHandle(nil),fname,MAX_PATH+1);
if not (ExtractFileName(fname)="taskmgr.exe") then exit;
end;
InterceptFunctions;
finally
UnmapViewOfFile(mapaddr);
CloseHandle(Hmap);
DLLProc:=@LibraryProc;
end;
end.


 
tima705 ©   (2007-10-03 18:49) [2]

В проект после   Application.Initialize;
добавил

SetWindowLong(Application.Handle,GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW);


 
Сергей М. ©   (2007-10-04 11:33) [3]

Плохой пример.

Для полноценного перехвата API-вызова недостаточно модификации только IAT, необходимо модифицировать еще и EAT.

Но это уже другая песня)


 
SLoW.AlfaMoon.Com   (2007-10-04 11:34) [4]

Многабукв, все не смотрел. У меня похожий код без ошибок отрабатывал, правда палился антивирями, т.к. все же это архаизм.


 
tima705 ©   (2007-10-04 18:39) [5]


> Для полноценного перехвата API-вызова недостаточно модификации
> только IAT, необходимо модифицировать еще и EAT.


Если можно, "по-русски"... Я начинающий, и мало чего тут понимаю.. но хочется)...

А на счет примера - все работает прекрасно, еслиб не ошибка...
Разрешите напомнить, вопрос - из-за чего возникает ошибка (после чего слетает explorer...) и как ее устранить..)


 
Сергей М. ©   (2007-10-05 09:57) [6]


> Если можно, "по-русски"


"По-русски" рассказ о EAT и IAT потянет на увесистую книгу.

Почитай самостоятельно о структуре PE-модулей и работе системного загрузчика.

Вкратце же ситуация выглядит так - если не выполнять модификацию EAT, то целевой процесс, вызвавший ф-цию GetProcAddress c целью получения адреса интересующей ф-ции (в дан.случае NtQuerySystemInformation) для ее последующего вызова, получит оригинальный ее адрес, а не тот который ты ожидаешь (в дан.случае MyNtQuerySystemInfo). Соответственно идея с "обманом" терпит полное фиаско.



Страницы: 1 вся ветка

Текущий архив: 2008.06.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
15-1209822144
Slider007
2008-05-03 17:42
2008.06.15
С днем рождения ! 3 мая 2008 суббота


6-1188995111
ЗабылИмя
2007-09-05 16:25
2008.06.15
Как через сеть включить удалённый компьютер?


2-1211283647
Сергей
2008-05-20 15:40
2008.06.15
Код


15-1210141116
TUser
2008-05-07 10:18
2008.06.15
Светофоры и не только


2-1211548327
StiTch
2008-05-23 17:12
2008.06.15
jpeg