Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Траблы с CreateRemoteThread


Автор: Gershkovich 19.2.2007, 11:46
Всем привет!

Пытаюсь создать Remote thread как написано во всех примерах
(в качестве жертвы выбрал Notepad):

Код


procedure CallBack;
begin
  // Do nothing
end;

procedure TMainWin.CreateThread(ph : THandle);
var sa : TSecurityAttributes;
    tid : dword;
    th : THandle;
    g_module : HModule;
begin

  FillChar(sa, SizeOf(sa), 0);
  sa.nLength:= SizeOf(sa);
  sa.lpSecurityDescriptor:= nil;
  sa.bInheritHandle:= true;


  // g_module:= GetModuleHandle(PChar('C:\WINDOWS\system32\cmd.exe'));
  g_module:= GetModuleHandle(nil);
  // g_module:= GetModuleHandle('C:\WINDOWS\NOTEPAD.EXE');

  if g_module = 0 then begin
    ShowMessage('GetModuleHandle = ' + SysErrorMessage(GetLastError));
    Exit;
  end;

  //GetCurrentProcess
  th:= CreateRemoteThread(
    ph, // handle to process to create thread in
    @sa, // pointer to thread security attributes
    0, // initial thread stack size, in bytes
    @CallBack, // pointer to thread function
    ptr(g_module), // pointer to argument for new thread
    0, // creation flags (not suspended)
    tid); // pointer to returned thread identifier

  if th = 0 then begin
    ShowMessage('CreateRemoteThread = ' + SysErrorMessage(GetLastError));
  end else begin
    ShowMessage(IntToStr(th) + ' = ' + IntToStr(tid));
  end;
end;



Но происходит ошибка с выпаденим стандартного виндового окна 
где сообщается что в программе произошла ошибка и предлагается
отправить отчот об ней в Микрософт.

Что я неправльно делаю ?

Notepad загружаю так :

Код

procedure TMainWin.ShellExecute_AndWait(FileName: string);
var exInfo : TShellExecuteInfo;
begin
  FillChar(exInfo, SizeOf(exInfo), 0);

  with exInfo do begin
    cbSize:= SizeOf(exInfo);
    fMask:= SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd:= GetActiveWindow();
    lpVerb:= 'open';
    lpFile:= PChar(FileName);
    nShow:= SW_SHOWNORMAL;
  end;

  if ShellExecuteEx(@exInfo) then begin
    ProcessHandle:= exInfo.HProcess;
  end else begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;

  while WaitForSingleObject(ExInfo.hProcess, 50) <>  WAIT_OBJECT_0 do begin
    Application.ProcessMessages;
  end;
  
  CloseHandle(ProcessHandle);
end;


ну и передаю ProcessHandle в метод CreateThread

Заранее спасибо.




Автор: Yanis 19.2.2007, 12:10
Цитата(Gershkovich @  19.2.2007,  12:46 Найти цитируемый пост)
ну и передаю ProcessHandle в метод CreateThread

т.е. после закрытия описателя, ты передаёшь его значение в CreateThreadsmile 

Автор: Gershkovich 19.2.2007, 12:21
Нет !

Пока нотпад запущен процедура крутится в этом цикле

Код

while WaitForSingleObject(ExInfo.hProcess, 50) <>  WAIT_OBJECT_0 do begin
    Application.ProcessMessages;
  end;


т.е. ProcessHandle валидный

(в противном случае поток не создается с ошибкой "Неверный дескриптор")

Автор: Yanis 19.2.2007, 12:42
Я так и не увидел вызова CreateThread. Выкладый всё полностью!

Автор: dumb 19.2.2007, 12:53
Gershkovich,
сначала ты должен выделить кусок памяти в адресном пространстве подопытного процесса, скопировать туда функцию потока и только потом создавать поток, указав адрес функции в выделенном куске. смотри примеры внимательней.

обрати внимание также на саму функцию потока - там не должно быть ничего, что может не иметь силы в другом процессе. даже вызовы функций WinAPI надо "рихтовать", поэтому "дешевле" всего в функции потока просто подгрузить dll, в которой уже можно делать все спокойно(относительно smile )

Автор: MetalFan 19.2.2007, 12:54
этот должно падать ;)
ибо указатель на Callback не валиден в чужом процессе. да и нет там такой процедуры.
p.s. почитай на wasm.ru статейки. например http://www.wasm.ru/article.php?article=apihook_1

Автор: Gershkovich 19.2.2007, 13:09
За статью спасибо.
Попытаюсь достичь просветления.

Насколько я понял, падало от того что процесс-жертва не имел прав на
область памяти с кодом CallBack ?
В этом все дело ?
И поэтому приходиться  копировать код в другую область памяти ?

Автор: dumb 19.2.2007, 13:40
Цитата(Gershkovich @  19.2.2007,  13:09 Найти цитируемый пост)
падало от того что процесс-жертва не имел прав на область памяти с кодом CallBack ?

у тебя есть две деревянные линейки. на одной из них на отметке 4см раскаленной иголкой ты прожег дырку. на второй линейке будет дырка на отметке 4см? рассматриваем вариант, когда линейки далеко друг от друга smile

адресные пространства процессов изолированы друг от друга, как эти линейки. поэтому тебе и сказали, что адрес твоей Callback в другом адресном пространстве просто не имеет смысла.

Автор: Gershkovich 19.2.2007, 13:47
Все понял!
Спасибо!

Ключевой для понимания момент был
Цитата(dumb @  19.2.2007,  13:40 Найти цитируемый пост)
адресные пространства процессов изолированы друг от друга


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)