Форум: "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.052 c