PDA

View Full Version : Inject به explorer.exe



دنیای دلفی
یک شنبه 06 مرداد 1387, 13:53 عصر
سلام
با كد پايين به notepad.exe اينجكت مي كنيم چگونه مي توان كاري كرد كه به explorer اينجكت بشه . ممنون اگر راهنمايي كنيد .


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$IMAGEBASE $13140000}
{$R *.dfm}
function Main(dwEntryPoint: Pointer): longword; stdcall;
begin
{now we are in notepad}
LoadLibrary('kernel32.dll');
LoadLibrary('user32.dll');
MessageBox(0, 'Hello, now I am in the memory of another process!', 'Hijacked Process', 0);
MessageBox(0, 'Now we can do anything we want. :)', 'Hijacked Process', 0);
MessageBox(0, 'You can even delete the original exe and these message boxes will still be here.', 'Hijacked Process', 0);
MessageBox(0, 'See?', 'Hijacked Process', 0);
MessageBox(0, 'Told you.', 'Hijacked Process', 0);
MessageBox(0, 'Ok, bye.', 'Hijacked Process', 0);
MessageBox(0, 'Hails to Barnamenevis.org fellas ', 'Hijacked Process', 0);
MessageBox(0, 'I''ll close notepad for you ;)', 'Hijacked Process', 0);
ExitProcess(0);
Result := 0;
end;
//Injection
procedure Inject(ProcessHandle: longword; EntryPoint: pointer);
var
Module, NewModule: Pointer;
Size, BytesWritten, TID: longword;
begin
Module := Pointer(GetModuleHandle(nil));
Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);
CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID);
end;

var
ProcessHandle, PID: longword;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
procedure TForm1.Button1Click(Sender: TObject);
begin
{lets make a new process}
CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
{give it some time to wake up}
Sleep(500);
{and hijack it!}
GetWindowThreadProcessId(FindWindow('Notepad', nil), @PID);
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
Inject(ProcessHandle, @Main);
CloseHandle(ProcessHandle);
{we have a copy of ourself running in notepad so we can exit}
end;

end.

HadiDelphi
یک شنبه 06 مرداد 1387, 19:04 عصر
GetWindowThreadProcessId(FindWindow('Notepad', nil), @PID);
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
Inject(ProcessHandle, @Main);

خوب معلومه دیگه به جای ntopad , handle باید explorer , handle رو به تابع Inject ارسال کنی

دنیای دلفی
یک شنبه 06 مرداد 1387, 22:34 عصر
خوب هندل explorer چي هست من وقتي مي نويسم به جاي notepad --> explorer را فقط يك پنجره باز مي شود و فرامين مربوط به تابع Main اجرا نمي شوند

مهران موسوی
یک شنبه 06 مرداد 1387, 23:57 عصر
دوست عزيز من يك سال پيش روي اين مباحث كار ميكردم .

يادش بخير بحث كرك مي و از اين جور چيزا .... خيلي هم تحقيق كردم روش ...

فقط ميتونم بگم كه اين روش براي كاري كه شما مد نظر داري مناسب نيست چون اين كار در برابر چشمان تيز بين انتي ويروسهاي امروزي يك شوخي خنده داره محسوب ميشه ... ( كه اين اصلا براي كاربر خوشايند نيست كه برنامش كه امنيتي هست ويروس شناخته بشه )

قبلا NOD32 من قديمي بود گير نميداد ولي الان كه نسخه ي اخرش رو گرفتم اصلا نميزاره به پروسس هاي سيستمي چپ نگاه كنم .

در ضمن explorer گزينه ي مناسبي براي تزريق كد نيست ... بگرد يك پروسس كم رنگ تر روي براي اين كار انتخاب كن .

HadiDelphi
دوشنبه 07 مرداد 1387, 07:36 صبح
function FindProcess(ExeNames: PChar): DWord; stdcall;
function DeleteExe(sProcessNames: string): string;
var i: DWord;
j: DWord;
begin
SetLength(Result,Length(sProcessNames));
result := '';
j := 0;
for i := 1 to length(sProcessNames) do
begin
if (Copy(sProcessNames,i,6) = ('.EXE'#13#10)) then
j := 4;
if (j > 0) then
Dec(j) else
Result := Result+sProcessNames[i];
end;
end;
var
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
ContinueLoop : Boolean;
sExeSearch : String;
sExeProcess : String;
i : integer;
begin
Result := 0;
sExeSearch := DeleteExe(uppercase(#13#10+exenames+#13#10));
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while ContinueLoop do
begin
sExeProcess := uppercase(uallUtil.extractfilename(FProcessEntry32 .szExeFile));
i := pos(sExeProcess,sExeSearch);
if (i > 0) and
(sExeSearch[i-1] = #10) and
(sExeSearch[i+length(sExeProcess)] = #13) then
result := FProcessEntry32.th32ProcessID;
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

ProcessHandle := OpenProces(Process_All_Access, false,findprocess('Explorer.exe'));

تابع های زیر رو از برنامه پاک کن بعد تابع FindProcess رو (که بالا نوشتم) به برنامه ات اضافه کن و تابع OpenProcess رو هم به شکل بالا بازنویسی کن



{lets make a new process}
CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
{give it some time to wake up}
Sleep(500);
{and hijack it!}
GetWindowThreadProcessId(FindWindow('Notepad', nil), @PID);

HadiDelphi
دوشنبه 07 مرداد 1387, 07:44 صبح
دوست عزيز من يك سال پيش روي اين مباحث كار ميكردم .

يادش بخير بحث كرك مي و از اين جور چيزا .... خيلي هم تحقيق كردم روش ...

فقط ميتونم بگم كه اين روش براي كاري كه شما مد نظر داري مناسب نيست چون اين كار در برابر چشمان تيز بين انتي ويروسهاي امروزي يك شوخي خنده داره محسوب ميشه ... ( كه اين اصلا براي كاربر خوشايند نيست كه برنامش كه امنيتي هست ويروس شناخته بشه )

قبلا NOD32 من قديمي بود گير نميداد ولي الان كه نسخه ي اخرش رو گرفتم اصلا نميزاره به پروسس هاي سيستمي چپ نگاه كنم .

در ضمن explorer گزينه ي مناسبي براي تزريق كد نيست ... بگرد يك پروسس كم رنگ تر روي براي اين كار انتخاب كن .

نه آقا مهران من از این روش استفاده کردم هچکدوم از آنتی ویروس های که نصب کرده بودم بهش گیر ندادن . (نه ZoneAlarm و نه Nod32 ver 3 )
البته جناب دنیای دلفی به نظر من هم بهتر به جای تزریق کرد به Explorer.exe یه پروسه خودتون درست کنید و به اون کد هاتون رو تزریق کنید

دنیای دلفی
دوشنبه 07 مرداد 1387, 14:22 عصر
روي عبارت Uallutil خطا مي گيره و قتي هم اين كلمه را حذف مي كنم خطا رفع مي شود ولي برنامه را كه اجرا مي كنم . هيچ اتفاقي نمي افتد و پيامها ظاهر نمي شوند

دنیای دلفی
دوشنبه 07 مرداد 1387, 15:21 عصر
مجموعه uallCollection را دانلود كردم حل شد

دوستان اگر خواستند استفاده كنند اينجوي تبديل كنند حله :


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Tlhelp32;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$IMAGEBASE $13140000}
{$R *.dfm}
function Main(dwEntryPoint: Pointer): longword; stdcall;
begin
{now we are in notepad}
LoadLibrary('kernel32.dll');
LoadLibrary('user32.dll');
MessageBox(0, 'Hello, now I am in the memory of another process!', 'Hijacked Process', 0);
MessageBox(0, 'Now we can do anything we want. :)', 'Hijacked Process', 0);
MessageBox(0, 'You can even delete the original exe and these message boxes will still be here.', 'Hijacked Process', 0);
MessageBox(0, 'See?', 'Hijacked Process', 0);
MessageBox(0, 'Told you.', 'Hijacked Process', 0);
MessageBox(0, 'Ok, bye.', 'Hijacked Process', 0);
MessageBox(0, 'Hails to Barnamenevis.org fellas ', 'Hijacked Process', 0);
MessageBox(0, 'I''ll close notepad for you ;)', 'Hijacked Process', 0);
// ExitProcess(0);
Result := 0;
end;
//Injection

function FindProcess(ExeNames: PChar): DWord; stdcall;

function ExtractFileName(sFile: String): String;
var
i: Integer;
j: Integer;
begin
j := 0;
for i := 1 to length(sFile) do
if (sFile[i] = '\') then j := i;
sFile := Copy(sFile,j+1,length(sFile));
j := 0;
for i := 1 to length(sFile) do
if (sFile[i] = '.') then j := i;
if j = 0 then j := length(sFile)+1;
Result := Copy(sFile,1,j-1);
end;
function DeleteExe(sProcessNames: string): string;
var i: DWord;
j: DWord;
begin
SetLength(Result,Length(sProcessNames));
result := '';
j := 0;
for i := 1 to length(sProcessNames) do
begin
if (Copy(sProcessNames,i,6) = ('.EXE'#13#10)) then
j := 4;
if (j > 0) then
Dec(j) else
Result := Result+sProcessNames[i];
end;
end;
var
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
ContinueLoop : Boolean;
sExeSearch : String;
sExeProcess : String;
i : integer;
begin
Result := 0;
sExeSearch := DeleteExe(uppercase(#13#10+exenames+#13#10));
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while ContinueLoop do
begin
sExeProcess := uppercase(extractfilename(FProcessEntry32.szExeFil e));
i := pos(sExeProcess,sExeSearch);
if (i > 0) and
(sExeSearch[i-1] = #10) and
(sExeSearch[i+length(sExeProcess)] = #13) then
result := FProcessEntry32.th32ProcessID;
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;


procedure Inject(ProcessHandle: longword; EntryPoint: pointer);
var
Module, NewModule: Pointer;
Size, BytesWritten, TID: longword;
begin
Module := Pointer(GetModuleHandle(nil));
Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);
CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID);
end;

var
ProcessHandle, PID: longword;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
procedure TForm1.Button1Click(Sender: TObject);
begin
{lets make a new process}
// CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
// {give it some time to wake up}
// Sleep(500);
// {and hijack it!}
// GetWindowThreadProcessId(FindWindow('TBMon', nil), @PID);
// ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
ProcessHandle := OpenProcess(Process_All_Access, False,Findprocess('Explorer.exe'));
Inject(ProcessHandle, @Main);
CloseHandle(ProcessHandle);
{we have a copy of ourself running in notepad so we can exit}
end;

end.

HadiDelphi
دوشنبه 07 مرداد 1387, 15:30 عصر
ببخشید یادم رفت یونیت اش رو برات بزارم
در عوض واست یه کد کامل میزارم


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, uallProcess;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure Main(); stdcall;
begin
{now we are in notepad}
LoadLibrary('kernel32.dll');
LoadLibrary('user32.dll');
MessageBox(0, 'Hello, now I am in the memory of another process!', 'Hijacked Process', 0);
MessageBox(0, 'Now we can do anything we want. :)', 'Hijacked Process', 0);
MessageBox(0, 'You can even delete the original exe and these message boxes will still be here.', 'Hijacked Process', 0);
MessageBox(0, 'See?', 'Hijacked Process', 0);
MessageBox(0, 'Told you.', 'Hijacked Process', 0);
MessageBox(0, 'Ok, bye.', 'Hijacked Process', 0);
MessageBox(0, 'Hails to Barnamenevis.org fellas ', 'Hijacked Process', 0);
MessageBox(0, 'I''ll close notepad for you ;)', 'Hijacked Process', 0);
ExitProcess(0);
end;

function Inject(ProcessHandle: longword; EntryPoint: pointer): Boolean;
var // Injection Function
Module, NewModule: Pointer;
Size, BytesWritten, TID: longword;
begin
Result := False;
Module := Pointer(GetModuleHandle(nil));
Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten) then
if CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID) <> null then
Result := True;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
ProcessHandle: longword;
begin
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, FindProcess('explorer.exe'));
Inject(ProcessHandle, @Main);
CloseHandle(ProcessHandle);
{we have a copy of ourself running in notepad so we can exit}
end;

end.

دنیای دلفی
دوشنبه 07 مرداد 1387, 23:12 عصر
ممنون وقت گذاشتيد من درون فايل اجرايي وقتي مي نويسمش به راحتي كار مي كنه ولي من مي خواهم اين كار را از درون يك dll انجام بدهم يعني تزريق درون حافظه يك پروسس . وقتي از درون فايل اجرايي اين كار را مي كنم مشكلي نيست مثلا درون ماشين حساب ولي وقتي از طريق يك dll اين كار را مي كنم تزريق انجام مي شود ولي بلافاصله باعث خراب شدن حافظه مربوطه (مثلا ماشين حساب) مي گردد و آن پروسس بسته مي شود و البته خطاي ويندوزي هم مي دهد. البته بدون اينكه تابع من كه يك سري پيام را نشام مي داد كار كند.
چرا بايد در اينگونه توابع ImageBase را تغيير داد

مهران موسوی
سه شنبه 08 مرداد 1387, 01:05 صبح
نه آقا مهران من از این روش استفاده کردم هچکدوم از آنتی ویروس های که نصب کرده بودم بهش گیر ندادن . (نه ZoneAlarm و نه Nod32 ver 3 )
البته جناب دنیای دلفی به نظر من هم بهتر به جای تزریق کرد به Explorer.exe یه پروسه خودتون درست کنید و به اون کد هاتون رو تزریق کنید

دوست عزيز اين روش يك روش رايج براي دور زدن فايروال ها هست . اگه يك سري از تنظميات بر روي فايروال كاربر انجام شده باشه جلوي كار برنامتون رو ميگيره .

در ضمن NOD32 Antivirus 3.0.621 كه من نصب دارم بعضي اوقات به فايلهايي كه از اين جور تكنيكها توش استفاده كردم گير ميده :متفکر:


راستي uallCollection واقعا تحسين بر انگيز هستش .... همراه باهاش مثالهايي هم ارائه شده ؟

Nima NT
سه شنبه 08 مرداد 1387, 01:20 صبح
آقا مهران من دلفی بلد نیستم ولی غرض از جسارت بنده از هدف آقای دنیای دلفی برای کسب این مطالب اطلاع دارم ، هدف ساخت یه قفل نرم افزاری مشابه PLZ Dump me های آقا هادی هستش .

HadiDelphi
سه شنبه 08 مرداد 1387, 10:34 صبح
دوست عزيز اين روش يك روش رايج براي دور زدن فايروال ها هست . اگه يك سري از تنظميات بر روي فايروال كاربر انجام شده باشه جلوي كار برنامتون رو ميگيره .

در ضمن NOD32 Antivirus 3.0.621 كه من نصب دارم بعضي اوقات به فايلهايي كه از اين جور تكنيكها توش استفاده كردم گير ميده :متفکر:


راستي uallCollection واقعا تحسين بر انگيز هستش .... همراه باهاش مثالهايي هم ارائه شده ؟

بله تنظیماتی دارن که میتونه جلوش رو بگیره ولی در حالت معمولی و با تنظیمات استاندارد اکثرا گیر نمیدم
در مورد UallCollection هم , متاسفانه مثالی در دست رس نیست

HadiDelphi
سه شنبه 08 مرداد 1387, 10:47 صبح
ممنون وقت گذاشتيد من درون فايل اجرايي وقتي مي نويسمش به راحتي كار مي كنه ولي من مي خواهم اين كار را از درون يك dll انجام بدهم يعني تزريق درون حافظه يك پروسس . وقتي از درون فايل اجرايي اين كار را مي كنم مشكلي نيست مثلا درون ماشين حساب ولي وقتي از طريق يك dll اين كار را مي كنم تزريق انجام مي شود ولي بلافاصله باعث خراب شدن حافظه مربوطه (مثلا ماشين حساب) مي گردد و آن پروسس بسته مي شود و البته خطاي ويندوزي هم مي دهد. البته بدون اينكه تابع من كه يك سري پيام را نشام مي داد كار كند.
چرا بايد در اينگونه توابع ImageBase را تغيير داد

من منظورتون رو درست متوجه نشدم اگه میخواهید خود Dll رو اینجکت کنید که در اون حالت ساختار Dll فرقی نداره چطوری باشه و واسه این کار هم تو UallCollection تابع وجود داره

ولی

اگه میخواهید از تو Dll این کار بکنید به غیر از ImageBase فکر کنم هیچ فرقی با EXE نداره ولی باید توجه کنی که شما نمیتونی هر دستوری رو اینجکت کنی مثلا نمیتونی از توابع API ای که تو پروسه مقصد از شون استفاده نشده , استفاده کنی.

در مورد ImageBase هم اطلاعات چندانی ندارم ولی فکر کنم به دلیل سازگاری با پروسه مقصد این کار رو میکنن

vcldeveloper
سه شنبه 08 مرداد 1387, 16:49 عصر
چرا بايد در اينگونه توابع ImageBase را تغيير داددر شرایط عادی، ImageBase پیش فرض برای یک برنامه EXE یا یک DLL یکسان هست. در همچین شرایطی، اگر از آن DLL در EXE مربوطه استفاده کنید، چون آدرس مورد نظر DLL در فضای Process از قبل اشغال شده، ویندوز مجبور هست که DLL را در فضای دیگه ایی لود کنه و آدرس توابع را هم متناسب با آدرس جدید تنظیم کنه. بنابرین، در برنامه هایی که از DLL استفاده می کنند، بهتر هست که ImageBase اون DLL را به شکلی تغییر بدید که احتمال اشغال بودن آن بخش از حافظه به حداقل برسه، به این ترتیب، ویندوز مجبور نیست کار اضافه تری انجام بده و کارایی افزایش پیدا میکنه. اما در زمانی که DLL را به فضای یک Procees تزریق می کنید، احتمالا ویندوز بطور خودکار عمل فوق را انجام نمیده، پس باید مطمئن باشید که ImageBase ایی انتخاب کنید که موجب تخریب سایر داده های موجود در فضای Process نشه.