|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
CreateRemoteThread и несколько параметров
Хочу запустить в чужом процессе функцию с несколькими параметрами, но не представляю, как можно сделать больше одного.
Заранее спасибо. Gravitas |
#2
|
||||
|
||||
Передавать указатель на структуру (record)?
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#3
|
||||
|
||||
Уже так и сделал, спасибо
Gravitas |
#4
|
||||
|
||||
Не хочу создавать новый топик ради одного ответа, а проблема как раз по теме:
Кто может поделиться кодом для запуска треда в чужом процессе? На данный момент известен только PID. Как ни пытался - не получается, гугл молчит (или я его неправильно спрашиваю). Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#5
|
||||
|
||||
Когда-то давно нашел в инете. Суть примерно ясна.
Код:
function EnableDebugPrivilege():Boolean; var hToken: dword; SeDebugNameValue: Int64; tkp: TOKEN_PRIVILEGES; ReturnLength: dword; begin Result:=false; //Добавляем привилегию SeDebugPrivilege //Получаем токен нашего процесса OpenProcessToken(INVALID_HANDLE_VALUE, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken); //Получаем LUID привилегии if not LookupPrivilegeValue(nil, 'SeDebugPrivilege', SeDebugNameValue) then begin CloseHandle(hToken); exit; end; tkp.PrivilegeCount := 1; tkp.Privileges[0].Luid := SeDebugNameValue; tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; //Добавляем привилегию к процессу AdjustTokenPrivileges(hToken, false, tkp, SizeOf(TOKEN_PRIVILEGES), tkp, ReturnLength); if GetLastError() <> ERROR_SUCCESS then exit; Result:=true; end; Function InjectDll(hwd: hWnd; ModulePath: PAnsiChar): boolean; var Memory:pointer; Code: dword; BytesWritten: dword; ThreadId: dword; hThread: dword; hKernel32: dword; prcID: cardinal; prc: THandle; Inject: packed record PushCommand:byte; PushArgument:DWORD; CallCommand:WORD; CallAddr:DWORD; PushExitThread:byte; ExitThreadArg:dword; CallExitThread:word; CallExitThreadAddr:DWord; AddrLoadLibrary:pointer; AddrExitThread:pointer; LibraryName:array[0..MAX_PATH] of char; end; begin Result := false; if GetWindowThreadProcessID(Hwd, prcID) = 0 then begin MessageBox(0,'Не удалось получить ID процесса',0,0); exit; end; prc := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_WRITE or PROCESS_VM_OPERATION, false, prcID); if prc = 0 then begin MessageBox(0,'Не удалось открыть процесс',0,0); exit; end; Memory := VirtualAllocEx(Prc, nil, sizeof(Inject), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if Memory = nil then begin MessageBox(0,'Ошибка выделения памяти',0,0); exit; end; Code := dword(Memory); //инициализация внедряемого кода: Inject.PushCommand := $68; inject.PushArgument := code + $1E; inject.CallCommand := $15FF; inject.CallAddr := code + $16; inject.PushExitThread := $68; inject.ExitThreadArg := 0; inject.CallExitThread := $15FF; inject.CallExitThreadAddr := code + $1A; hKernel32 := GetModuleHandle('kernel32.dll'); inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA'); inject.AddrExitThread := GetProcAddress(hKernel32, 'ExitThread'); lstrcpyA(@inject.LibraryName, ModulePath); //записать машинный код по зарезервированному адресу if not WriteProcessMemory(Prc, Memory, @inject, sizeof(inject), BytesWritten) then begin MessageBox(0,'Ошибка при записи',0,0); exit; end; //выполнить машинный код hThread := CreateRemoteThread(prc, nil, 0, Memory, nil, 0, ThreadId); if hThread = 0 then begin MessageBox(0,'Ошибка при запуске потока',0,0); exit; end; CloseHandle(hThread); Result := True; end; ... // usage: if not EnableDebugPrivilege then begin MessageBox(0,'Не получены привилегии дебаг',0,0); exit; end; if not InjectDll(Handle,'SPAddDll.dll') then begin MessageBox(0,'Не удалось внедрить DLL',0,0); exit; end; З.Ы. Только что выполнил этот код, посмотрел в отладчике другого процесса - код потока выполняется. З.З.Ы. Это не вирус, это я хотел в одну прогу добавить несколько фич. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 25.11.2011 в 18:47. |