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?


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

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


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

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


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


> kaZaNoVa ©

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

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

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

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


kaZaNoVa   (2005-01-20 20:53:00) [144]

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.


kaZaNoVa   (2005-01-20 20:50:00) [145]

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.


DeadMeat   (2005-01-20 20:44:00) [146]

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

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


kaZaNoVa   (2005-01-20 20:41:00) [147]

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.


Piter   (2005-01-20 20:25:00) [148]

VMcL ©   (20.01.05 20:22) [3]

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


volser   (2005-01-20 20:24:00) [149]

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


VMcL   (2005-01-20 20:22:00) [150]

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

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


VMcL   (2005-01-20 20:20:00) [151]

>> volser  (20.01.05 19:21)

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

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


Kerk   (2005-01-20 19:40:00) [152]

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


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

Наверх

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