Форум: "WinAPI";
Текущий архив: 2003.02.13;
Скачать: [xml.tar.bz2];
ВнизСкрытие процесса Найти похожие ветки
← →
kalishenko stas (2002-12-29 17:44) [0]Взял здесь в кладовке исходники программы, которая по утверждению автора прикрепляет свою DLL-ку к другому процессу (точнее размещает в чужом адресном пространстве). Используется на сколько я понял тот самый метод, который описывал здесь на форуме paul_shmakov. Но у меня эта прога почему-то не работает, а именно в функции InjectHook при резервировании вирт. памяти не выдает базового адреса, т.е. выдает nil. На этом все и стопорится. Если кому не тяжело просмотрите код:
{$APPTYPE CONSOLE}
program HookLoader;
uses
Windows,
SysUtils,
Messages,
QDialogs;
function AdjustDbgPriv: Boolean;
var
TokenH: DWORD;
TP: TTokenPrivileges;
begin
Result := False;
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenH) then
begin
if LookupPrivilegeValue(nil, PChar("SeDebugPrivilege"), TP.Privileges[0].Luid) then
begin
TP.PrivilegeCount := 1;
TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Result :=
AdjustTokenPrivileges(TokenH, False, TP, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
end;
end;
end;
function InjectHook(ProcessID: DWORD; HookDLL: string; AdjPriv: Boolean = True): Boolean;
var
PrcH, TrdH, TrdID: DWORD;
WB: DWORD;
LoadLibraryA, BufPtr: Pointer;
ExitCode: DWORD;
error: DWORD;
begin
Result := False;
if AdjPriv then AdjustDbgPriv; // needs admin privs. for system processes only
PrcH := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,
True, ProcessID);
if (PrcH <> 0) then
begin
BufPtr := VirtualAllocEx(PrcH, nil, length(HookDLL), MEM_COMMIT, PAGE_READWRITE);
if (BufPtr <> nil) then
begin
if WriteProcessMemory(PrcH, BufPtr, PChar(HookDLL), Length(HookDLL), WB) then
begin
LoadLibraryA := GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
TrdH := CreateRemoteThread(PrcH, nil, 0, LoadLibraryA, BufPtr, 0, TrdID);
if (TrdH <> 0) then
begin
if (WaitForSingleObject(TrdH, INFINITE) = WAIT_OBJECT_0) and
GetExitCodeThread(TrdH, ExitCode) then
Result := (ExitCode <> 0);
ShowMessage("Все путем");
CloseHandle(TrdH);
end
else ShowMessage("Не удается запустить CreateRemoteThread");
end
else ShowMessage("Не удается запустить WriteProcessMemory");
VirtualFreeEx(PrcH, BufPtr, 0, MEM_RELEASE);
end
else begin
ShowMessage("Не удается запустить VirtualAllocEx");
end;
CloseHandle(PrcH);
end
else ShowMessage("Не удается открыть процесс");
end;
function StartProcess(FileName, CmdLine: string; Suspended: Boolean; var PrcH, TrdH: DWORD): DWORD;
// returns process ID
var
CF: DWORD;
CD: string;
PI: TProcessInformation;
SI: TStartupInfo;
begin
PrcH := 0;
TrdH := 0;
Result := 0;
if Suspended then CF := CREATE_SUSPENDED else CF := 0;
if (FileName = "") then exit;
if (Length(FileName) > 1) and (FileName[1] = "\") and (FileName[2] = "\") then
FileName := ExpandUNCFileName(FileName)
else
FileName := ExpandFileName(FileName);
CD := ExtractFileDir(FileName);
CF := CF or CREATE_DEFAULT_ERROR_MODE or DETACHED_PROCESS;
SI.cb := SizeOf(SI);
SI.lpReserved := nil;
SI.lpDesktop := nil;
SI.lpTitle := nil;
SI.dwFlags := 0;
if CreateProcess(PChar(FileName), PChar(CmdLine), nil, nil, False, CF, nil, PChar(CD), SI, PI) then
begin
TrdH := PI.hThread;
PrcH := PI.hProcess;
Result := PI.dwProcessId;
end
else Result:=1;
end;
var
PrcH, PrcID, TrdH: DWORD;
begin
//MessageBox(0, Pchar(ExtractFilePath(ParamStr(0)) + "keyhook.dll"),Nil, 0);
{ if (ParamCount = 0) then
begin
WriteLn("HookLoader filename");
sleep(2000);
// Halt(1);
end;}
PrcID := StartProcess(ParamStr(0), "", True, PrcH, TrdH);
MessageBox(0, Pchar("ID процесса "+inttostr(PrcID)+" !"),Nil, 0);
sleep(2000);
if (PrcID = 0) then
begin
WriteLn("can""t spawn new process!");
sleep(2000);
Halt(1);
end;
//if not InjectHook(PrcID, ExtractFilePath(ParamStr(0)) + "timehooker.dll") then
if not InjectHook(PrcID, ExtractFilePath(ParamStr(0)) + "keyhook.dll") then
begin
WriteLn("Не могу загрузить библиотеку keyhook.dll!");
sleep(2000);
ResumeThread(TrdH);
TerminateProcess(PrcH, 0);
CloseHandle(TrdH);
CloseHandle(PrcH);
Halt(1);
end
else MessageBox(0, Pchar("Все нормально!"),Nil, 0);
CloseHandle(PrcH);
ResumeThread(TrdH);
CloseHandle(TrdH);
end.
← →
Polevi (2002-12-29 18:33) [1]VirtualAllocEx, CreateRemoteThread не работают под Win9x
← →
kalishenko stas (2002-12-29 18:49) [2]О как... А если заменить их на VirtualAlloc и CreateThread (хотя сомневаюсь, что сработает)? Или еще какие-нибудь аналоги есть?
← →
Polevi (2002-12-29 19:48) [3]правильно сомневаешься
используй хук - см. Дж.Рихтер Windows для профессионалов
← →
kalishenko stas (2002-12-29 20:21) [4]Так все дело как раз в том, что DLL-ка и устанавливает хук на клаву, и в идеале этот хук работает в чужом адр. пространстве.
>>см. Дж.Рихтер Windows для профессионалов
А что смотреть-то?
← →
Polevi (2002-12-29 22:29) [5]глава про внедрение DLL
← →
kalishenko stas (2002-12-30 12:01) [6]Тогда такой вопрос, если я хочу поставить глобальный хук, указав в SetWindowsHookEx в качестве потока, для которого предназначена ловушка (например поток процесса kernel32), мой процесс будет виден? Если нет, то как получить идентификатор чужого потока (опять-таки того же kernel32)?
← →
Cobalt (2002-12-30 14:56) [7]
> получить идентификатор чужого потока
Перебором процессов (см. TLHelp32.pas)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.02.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c