Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.035 c
4-1107427381
Zilog
2005-02-03 13:43
2005.03.20
Delphi + USB= ?


3-1108471937
Mishenka
2005-02-15 15:52
2005.03.20
Сортировка набора данных


1-1109985318
rosl
2005-03-05 04:15
2005.03.20
hint


4-1107873140
Fessio
2005-02-08 17:32
2005.03.20
Как узнать имя компьютера и его описание в WINXP?


14-1109161737
Sleepwalker
2005-02-23 15:28
2005.03.20
Загрузка WinXP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский