Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-38365
Бук
2003-02-03 07:55
2003.02.13
try... except


8-38390
bg8
2002-10-22 21:57
2003.02.13
Анализ звука в реальном времени


3-38080
nik4543
2003-01-27 13:44
2003.02.13
Excel


1-38290
Natalia
2003-02-05 19:27
2003.02.13
скроллер мышки


3-38073
ij
2003-01-26 21:46
2003.02.13
связь нескольких БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский