Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CreateRemoteThread???


Страницы:   1 2 3 4 5 6 7 8

volser ©   (2005-01-20 19:21:00) 

Мне нужно запустить поток в чужом процесе.

Как работать с функцией
CreateRemoteThread(hProcess,nil, 0,  @myProc, nil, 0,ThreadID)

myProc - доступна только в моем адресном пространстве. Как сделать так что бы она была доступна и в hProcess?


Kerk   (2005-01-21 10:38:00) [121]

http://kerk.frandt.com/files/inject.zip


kaZaNoVa   (2005-01-21 10:31:00) [122]

Kerk ©   (21.01.05 5:59) [30]
мы всё-же Мастера Delphi а на Асма )))
но всё-же твой пример в принципе круче))


Kerk   (2005-01-21 05:59:00) [123]

GuAV ©   (21.01.05 0:50) [27]
Криво. Лучше с dll.

С DLL не лучше. Лучше так. Просто товарищ Казанова никак не хочет изучать асм. :) Демку этого дела я ему давал. И 9х она тоже работает. :)


GuAV   (2005-01-21 01:36:00) [124]

Сделал тест:
project1:
procedure TForm1.FormCreate(Sender: TObject);
var hExe: THandle; P: procedure; I:Integer absolute P;
begin
 hExe := LoadLibrary('project2.exe');
 I:=4566872; // из project2 - TForm1.Button1Click
 Dec(I, $00400000);
 Inc(I, hExe);
 P;
 FreeLibrary(hExe);
end;

project2:
procedure ShowText;
begin
 MessageBox(0, 'If you see this, I''ve relocated successfully', nil, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var P: procedure; I:Integer absolute P;
begin
 P:=@ShowText;
 MessageBox(0, PChar(IntToStr(I)), nil, 0); // вернул 4566872
end;


Работает. Тест более приближенный к реальности сделать не могу, т.к. в 9х нет CreateRemoteThread, а также т.к. в лом.


kaZaNoVa   (2005-01-21 00:58:00) [125]

GuAV ©   (21.01.05 0:50) [27]
классная идея, но думаю с релоками в exe напряг будет ...


GuAV   (2005-01-21 00:50:00) [126]

Криво. Лучше с dll.
Ксати если для exe сделать LoadLibrary, то будет ли работоспособен образ в случае перемещения ?

Я к тому что если да, можно CreateRemoteThread(hProcess, nil, 0, LoadLibraryProc, MemPtr, 0, ThreadID); для ехе, затем запустить процедуру из ехе
CreateRemoteThread(hProcess, nil, 0, MyProcAddress, MemPtr, 0, ThreadID); где  MyProcAddress = @MyProc - OriginalImageBase + hExe, где hExe это ExitCode первого CreateRemoteThread.


kaZaNoVa   (2005-01-21 00:28:00) [127]

volser   (21.01.05 0:24) [25]
я не проверял, пока ошибок не было)))


volser   (2005-01-21 00:24:00) [128]


> kaZaNoVa ©

А можно это как то проверять: занят или нет?


kaZaNoVa   (2005-01-21 00:12:00) [129]

GuAV ©   (20.01.05 23:36) [23]
тогда непридведенная очень нехорошая ситуация ..
новероятность такого оченьмала


GuAV   (2005-01-20 23:36:00) [130]

kaZaNoVa ©   (20.01.05 23:14) [22]
А если $70 000 000 уже занят ?


kaZaNoVa   (2005-01-20 23:14:00) [131]

GuAV ©   (20.01.05 23:08) [21]
мой пример в [9] хоть и корявый, но рабочий))
- он полностью прогу копирует в целевой процесс


GuAV   (2005-01-20 23:08:00) [132]

volser   (20.01.05 22:54) [18]

Если локальные функции помещены в целевое АП, то для них нужно находить новый адрес и ставить его в месте вызова (т.е. то же что делает ОС при relocation).

Вызвать внешние функции можно без обращения к таблице импорта, зарание получив их адрес в АП целевого процесса. Некоторые системные dll всегда загружаются по тем же адресам, поэтому для их функций адрес в целевом и своём процессе совпадают. так и для loadlibrary.


kaZaNoVa   (2005-01-20 23:05:00) [133]

volser   (20.01.05 23:03) [19]
пример работает?
//если что-то будет "пищать", просьба не пинать)))

строчку if (pos(' EXPLORER.EXE',UpperCase(ppp))>0) then  видел? - там и ответ)


volser   (2005-01-20 23:03:00) [134]


> kaZaNoVa ©

И в каком процессе запускается поток в [9]?


volser   (2005-01-20 22:54:00) [135]

Я сделал
 
MemPtr := VirtualAllocEx(hProcess,nil, TESTSIZE , MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE );

 WriteProcessMemory(hProcess, MemPtr,@MyProc, TESTSIZE, BytesWritten);


где TESTSIZE гарантированые размеры функции.
если функцию пустая, то все работает нормально, а если обращатся к свои локальным процедурам или вызывать какие нибудь функции, то вылетает AV.
Как сделать возможным вызывать какие либо функции, хотя бы loadlibrary и т.д.?


GuAV   (2005-01-20 22:52:00) [136]

volser   (20.01.05 22:50) [16]

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


volser   (2005-01-20 22:50:00) [137]

А где гарантия что они идут подряд


GuAV   (2005-01-20 22:45:00) [138]


> > как узнать size процедуры?

Вычесть её адрес из адреса следующей процедуры, это будет size процедуры + size of align.


kaZaNoVa   (2005-01-20 22:02:00) [139]

volser   (20.01.05 21:32) [10]

> Как мне MyProc запустить в hProcess.

нечто-подобное - смотри [9]


kaZaNoVa   (2005-01-20 22:01:00) [140]

volser   (20.01.05 21:32) [10]
мой первый пример внедряет ДЛЛ


> Как мне MyProc запустить в hProcess.

это оченьнепросто

volser   (20.01.05 21:33) [11]

> Что делает function SetDebugPriv?

даёт тебе отладочные права


> как узнать size процедуры?

спроси что-нить полегче ...


Страницы:   1 2 3 4 5 6 7 8

Наверх

Титульная страница Поиск, карта сайта Написать письмо