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