Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.11.2011, 16:16
Аватар для Gravitas
Gravitas Gravitas вне форума
Новичок
 
Регистрация: 12.06.2011
Сообщения: 61
Версия Delphi: 7
Репутация: 38
По умолчанию CreateRemoteThread и несколько параметров

Хочу запустить в чужом процессе функцию с несколькими параметрами, но не представляю, как можно сделать больше одного.
Заранее спасибо.
__________________
Gravitas
Ответить с цитированием
  #2  
Старый 10.11.2011, 17:57
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Передавать указатель на структуру (record)?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #3  
Старый 10.11.2011, 18:14
Аватар для Gravitas
Gravitas Gravitas вне форума
Новичок
 
Регистрация: 12.06.2011
Сообщения: 61
Версия Delphi: 7
Репутация: 38
По умолчанию

Уже так и сделал, спасибо
__________________
Gravitas
Ответить с цитированием
  #4  
Старый 25.11.2011, 17:45
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Не хочу создавать новый топик ради одного ответа, а проблема как раз по теме:
Кто может поделиться кодом для запуска треда в чужом процессе? На данный момент известен только PID. Как ни пытался - не получается, гугл молчит (или я его неправильно спрашиваю).
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #5  
Старый 25.11.2011, 18:20
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Когда-то давно нашел в инете. Суть примерно ясна.
Код:
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;
Че-то в этом духе. Если есть PID, то можно начать с OpenProcess.
З.Ы. Только что выполнил этот код, посмотрел в отладчике другого процесса - код потока выполняется.
З.З.Ы. Это не вирус, это я хотел в одну прогу добавить несколько фич.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 25.11.2011 в 18:47.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter