Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Траблы с CreateRemoteThread, Access violation 
:(
    Опции темы
Gershkovich
Дата 19.2.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 8.2.2006

Репутация: нет
Всего: 2



Всем привет!

Пытаюсь создать 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

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




PM MAIL   Вверх
Yanis
Дата 19.2.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



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

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


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Gershkovich
Дата 19.2.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 8.2.2006

Репутация: нет
Всего: 2



Нет !

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

Код

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


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

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

PM MAIL   Вверх
Yanis
Дата 19.2.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Я так и не увидел вызова CreateThread. Выкладый всё полностью!

Это сообщение отредактировал(а) Yanis - 19.2.2007, 12:44


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
dumb
Дата 19.2.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



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

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

PM MAIL   Вверх
MetalFan
Дата 19.2.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



этот должно падать ;)
ибо указатель на Callback не валиден в чужом процессе. да и нет там такой процедуры.
p.s. почитай на wasm.ru статейки. например ватэта

Это сообщение отредактировал(а) MetalFan - 19.2.2007, 12:57


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Gershkovich
Дата 19.2.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 8.2.2006

Репутация: нет
Всего: 2



За статью спасибо.
Попытаюсь достичь просветления.

Насколько я понял, падало от того что процесс-жертва не имел прав на
область памяти с кодом CallBack ?
В этом все дело ?
И поэтому приходиться  копировать код в другую область памяти ?
PM MAIL   Вверх
dumb
Дата 19.2.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



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

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

адресные пространства процессов изолированы друг от друга, как эти линейки. поэтому тебе и сказали, что адрес твоей Callback в другом адресном пространстве просто не имеет смысла.
PM MAIL   Вверх
Gershkovich
Дата 19.2.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 8.2.2006

Репутация: нет
Всего: 2



Все понял!
Спасибо!

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


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0938 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.