![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateRemoteThread???
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 процедуры?
спроси что-нить полегче ...