Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: CL | DM;

Вниз

CreateRemoteThread???   Найти похожие ветки 

 
volser   (2005-01-20 19:21) [0]

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

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

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


 
Kerk ©   (2005-01-20 19:40) [1]

Где-то тут Казанова пробегал.. :)))


 
VMcL ©   (2005-01-20 20:20) [2]

>>volser  (20.01.05 19:21)

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

Переписать её в ВАП целевого пространства.


 
VMcL ©   (2005-01-20 20:22) [3]

>Переписать её в ВАП целевого пространства.

Читать: "Переписать её в ВАП целевого процесса."


 
volser   (2005-01-20 20:24) [4]

VMcl
А как это сделать?


 
Piter ©   (2005-01-20 20:25) [5]

VMcL ©   (20.01.05 20:22) [3]

А как можно определить "длину" функции?


 
kaZaNoVa ©   (2005-01-20 20:41) [6]

Kerk ©   (20.01.05 19:40) [1]
я вернулся))
//моя тема ...  ну как же без меня и нет тем более ответа по сабжу ..

program loader;
uses
 Windows,Tlhelp32;

function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
 if LookupPrivilegeValue(nil, PChar("SeDebugPrivilege"), tkp.Privileges[0].Luid) then
 begin
   tkp.PrivilegeCount := 1;
   tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
 end;
end;
end;

function Start(ProcessID: Cardinal; DllFileName: string): Boolean;
var
hProcess, hTh: THandle;
BytesWritten, ThreadID, DllNameLen: Cardinal;
LoadLibraryProc, MemPtr: Pointer;
ExitCode: DWord;
begin
Result := false;

SetDebugPriv();

hProcess := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,true, ProcessID);

if hProcess <> 0 then
begin
 DllNameLen := Length(DllFileName) + 1;
 
 MemPtr := VirtualAllocEx(hProcess, nil, DllNameLen, MEM_COMMIT, PAGE_READWRITE);

 if MemPtr <> nil then
 begin
   if WriteProcessMemory(hProcess, MemPtr, PChar(DllFileName), DllNameLen, BytesWritten) then
   begin
     LoadLibraryProc := GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

     hTh := CreateRemoteThread(hProcess, nil, 0, LoadLibraryProc, MemPtr, 0, ThreadID);

     if hTh <> 0 then
     begin
       if (WaitForSingleObject(hTh, INFINITE) = WAIT_OBJECT_0) and
         GetExitCodeThread(hTh, ExitCode) then
         Result := ExitCode <> 0;

       CloseHandle(hTh);
     end;
   end;

   VirtualFreeEx(hProcess, MemPtr, 0, MEM_RELEASE);
 end;

 CloseHandle(hProcess);
end;

end;

function UpperCase(const S: string): string;
var I : Integer;
begin
 Result := S;
 for I := 1 to Length( S ) do
   if Result[ I ] in [ "a".."z" ] then
      Dec( Result[ I ], 32 );
end;
               

var
ProcessID: Cardinal;
DllName,ppp: string;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ProcessID:=0;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);

ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
 begin
ppp:=FProcessEntry32.szExeFile;
if (pos("EXPLORER.EXE",UpperCase(ppp))>0) then  ProcessID:=FProcessEntry32.th32ProcessID;
ContinueLoop := Process32Next(FSnapshotHandle,  FProcessEntry32);
 end;
CloseHandle(FSnapshotHandle);

DllName:="A:\Sys.dll";

if ProcessID <> 0 then Start(ProcessID, DllName);

end.


 
DeadMeat ©   (2005-01-20 20:44) [7]

А где библиотека? Которая самовыгружается... ;0)
Как же без нее?...

---
...Death Is Only The Begining...


 
kaZaNoVa ©   (2005-01-20 20:50) [8]

DeadMeat ©   (20.01.05 20:44) [7]
LOL

забыл


library Sys;

uses
Windows,Messages;

Var
 pi: TProcessInformation;
 si: TStartupInfo;
 id,ThreadID:cardinal;

function thread:integer; stdcall;
begin
thread:=0;
CreateThread(nil,0,GetProcAddress(GetModuleHandle("kernel32"),"FreeLibrary"),pointer(hInstance),0,id);
end;

begin
si.cb := SizeOf(si);

CreateProcess(nil, "cmd.exe", nil, nil, FALSE, 0, nil, nil, si, pi);

sleep(1);

CreateThread(nil,0,@Thread,nil,0,ThreadID);
end.


 
kaZaNoVa ©   (2005-01-20 20:53) [9]

VMcL ©   (20.01.05 20:20) [2]

> Переписать её в ВАП целевого пространства.

я давал и такой пример, "Поток без длл ..."
в кратце:

program loader;
{$IMAGEBASE $70000000}
uses
 Windows,Messages,Tlhelp32;

Var
hProcess, hTh: THandle;
MemPtr: Pointer;
PID,ExitCode,Size,BytesWritten,ThreadID: Cardinal;

ProcessID: Cardinal;
ppp: string;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;

function SysErrorMessage(ErrorCode: Integer): string;
var
 Buffer: array[0..255] of Char;
var
 Len: Integer;
begin
 Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or
   FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer,
   SizeOf(Buffer), nil);
 while (Len > 0) and (Buffer[Len - 1] in [ #0..#32, "."]) do Dec(Len);
 SetString(Result, Buffer, Len);
end;

function UpperCase(const S: string): string;
var I : Integer;
begin
 Result := S;
 for I := 1 to Length( S ) do
   if Result[ I ] in [ "a".."z" ] then
      Dec( Result[ I ], 32 );
end;

function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
 if LookupPrivilegeValue(nil, PChar("SeDebugPrivilege"), tkp.Privileges[0].Luid) then
 begin
   tkp.PrivilegeCount := 1;
   tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
 end;
end;
end;

function ThreadF1(dwEntryPoint: Pointer): longword; stdcall;
Var t:Tpoint;
begin
LoadLibrary("kernel32.dll");
LoadLibrary("user32.dll");
while true do   begin
GetCursorPos(t);
if (t.X<2) and (t.Y<2) then break;
sleep(150);
Windows.Beep(175,100);
end;
Result:=0;
end;

function Main1(dwEntryPoint: Pointer): longword; stdcall;
begin
CreateThread(nil,0,@ThreadF1,dwEntryPoint,0,ThreadID);
Result:=0;
end;

Procedure Podgotovka;
Begin
ProcessID:=0;

SetDebugPriv;

FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);

ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
 begin
ppp:=FProcessEntry32.szExeFile;
if (pos("EXPLORER.EXE",UpperCase(ppp))>0) then  //WINLOGON
ProcessID:=FProcessEntry32.th32ProcessID;
ContinueLoop := Process32Next(FSnapshotHandle,  FProcessEntry32);
 end;
CloseHandle(FSnapshotHandle);
End;

begin
Podgotovka;
//GetWindowThreadProcessId(FindWindow("Progman", nil), @PID);
PID:=ProcessID;
if PID = 0 then Exit;

MemPtr:= Pointer(GetModuleHandle(nil));

Size := PImageOptionalHeader(Pointer(integer(MemPtr) + PImageDosHeader(MemPtr)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;

hProcess := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,true,PID);

if hProcess = 0 then Exit;

BytesWritten:=0;
VirtualFreeEx(hProcess,MemPtr, 0, MEM_RELEASE);
 MemPtr := VirtualAllocEx(hProcess,MemPtr, Size , MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE );

 if MemPtr <> nil then
 begin
   if WriteProcessMemory(hProcess, MemPtr,MemPtr, Size, BytesWritten) then
   begin
   hTh := CreateRemoteThread(hProcess, nil, 0,@Main1,MemPtr, 0, ThreadID);
     if hTh <> 0 then
     begin
       if (WaitForSingleObject(hTh,INFINITE) = WAIT_OBJECT_0) and
         GetExitCodeThread(hTh, ExitCode) then CloseHandle(hTh);
     end;
   end ;
 //  VirtualFreeEx(hProcess, MemPtr, 0, MEM_RELEASE);  //?
 end;
 CloseHandle(hProcess);
end.


 
volser   (2005-01-20 21:32) [10]


> kaZaNoVa ©

Много текста, но ничего не понятно.
Можешь принципиально объяснить, что мне нужно сделать.

У меня есть
1) hProcess
2) function MyProc(dwEntryPoint: Pointer): longword; stdcall;

Как мне MyProc запустить в hProcess.
Когда я делаю просто
CreateRemoteThread(hProcess,nil, 0,  @myProc, nil, 0,ThreadID)
то вылетает Access Violation.

Параметры функции мне не нужны.


 
volser   (2005-01-20 21:33) [11]

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


 
volser   (2005-01-20 21:58) [12]

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


 
kaZaNoVa ©   (2005-01-20 22:01) [13]

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


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

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

volser   (20.01.05 21:33) [11]

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

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


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

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


 
kaZaNoVa ©   (2005-01-20 22:02) [14]

volser   (20.01.05 21:32) [10]

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

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


 
GuAV ©   (2005-01-20 22:45) [15]


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

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


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

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


 
GuAV ©   (2005-01-20 22:52) [17]

volser   (20.01.05 22:50) [16]

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


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

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

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


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


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


> kaZaNoVa ©

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


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

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

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


 
GuAV ©   (2005-01-20 23:08) [21]

volser   (20.01.05 22:54) [18]

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

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


 
kaZaNoVa ©   (2005-01-20 23:14) [22]

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


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

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


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

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


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


> kaZaNoVa ©

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


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

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


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

Криво. Лучше с 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:58) [28]

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


 
GuAV ©   (2005-01-21 01:36) [29]

Сделал тест:
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, а также т.к. в лом.


 
Kerk ©   (2005-01-21 05:59) [30]

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

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


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

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


 
Kerk ©   (2005-01-21 10:38) [32]

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


 
Kerk ©   (2005-01-21 10:43) [33]

Забыл сказать. Запускаем, жмем кнопку "Пуск" и наслаждаемся. Просто влом было другую АПИ перехватывать..


 
Игорь Шевченко ©   (2005-01-21 11:42) [34]


>  I:=4566872; // из project2 - TForm1.Button1Click
>  Dec(I, $00400000);
>  Inc(I, hExe);


Давить вообще-то надо за такой код. Пожизненно :)


 
Fay ©   (2005-01-21 11:53) [35]

2 kaZaNoVa ©   (21.01.05 00:12) [24]
>> новероятность такого очень мала
Законы Мерфи говорят об обратном


 
Piter ©   (2005-01-21 12:32) [36]

volser   (21.01.05 0:24) [25]
А можно это как то проверять: занят или нет?


а зачем? Ты правильно делаешь - выделяешь пространство в адресном пространстве другого процесса - это гарантированный способ.

Вообще, попроси kaZaNoVa выложить его собственную ветку по этому вопросу, там ему умные люди много чего умного насоветовали


 
kaZaNoVa ©   (2005-01-21 13:02) [37]

Piter ©   (21.01.05 12:32) [36]
спасибо что напомнил, ветка уже ушла в архив, выложил у себя
http://sys.h14.ru/potok.html


 
volser   (2005-01-21 13:36) [38]

какой самый простой и надежный метод запустить функцию с длл в процессе експлорера?
[6] - является таковым?


 
Kerk ©   (2005-01-21 13:38) [39]

volser   (21.01.05 13:36) [38]

а самому варианты посмотреть? подумать?


 
kaZaNoVa ©   (2005-01-21 13:44) [40]

volser   (21.01.05 13:36) [38]

Var
PID: Cardinal;
//-----------------------
GetWindowThreadProcessId(FindWindow("Progman", nil), @PID);



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.054 c
3-1108635749
Vasek
2005-02-17 13:22
2005.03.20
Остановка запуск FireBird сервера


4-1107707452
Локли
2005-02-06 19:30
2005.03.20
Уровень звука


14-1109232179
Cosinus
2005-02-24 11:02
2005.03.20
Проблеммы с VPN соединением...


3-1108588340
hexware
2005-02-17 00:12
2005.03.20
Не знаю, как сделать в Access фильтр по данным через запрос...


4-1107338164
Tango
2005-02-02 12:56
2005.03.20
управление tabcontrol в чужом приложении