PDA

View Full Version : ایجاد حالت تزریق به پروسه یا (Process injection)



delphiprog3000
سه شنبه 29 مرداد 1387, 12:01 عصر
با سلام خدمت دوستان و اساتید محترم.

در این زمینه دوستان و اساتیدی که اطلاع دارند و نحوه ایجاد آن توسط دلفی را توضیح دهند.

و یا در این زمینه سورس یا لینک خاصی دارند بزارند.

با تشکر از توجه شما..............................

دنیای دلفی
سه شنبه 29 مرداد 1387, 12:38 عصر
// Inject Proccess To Memmory one Active Proccess
//************************************************** ********
// ProcessHandle := OpenProcess(Process_All_Access, False,Findprocess('lsass.exe'));
// Inject(ProcessHandle, @Main);
// CloseHandle(ProcessHandle);
//************************************************** ********

function Main(dwEntryPoint: Pointer): longword; stdcall;
var
Task:HWND;
begin
Task:=FindWindow('OllyDbg',nil);
PostMessage(Task,WM_CLOSE,0,0);
Task:=FindWindow('DeDe',nil);
PostMessage(Task,WM_CLOSE,0,0);
Result := 0;
end;

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;
//************************************************
//************************************************

delphiprog3000
سه شنبه 29 مرداد 1387, 16:08 عصر
با سلام. از پاسختون ممنونم.

لطفا کمی در مورد این کد و نحوه عملکرد آن و در کل درباره این روش توضیح دهید.

با تشکر....................

دنیای دلفی
سه شنبه 29 مرداد 1387, 20:38 عصر
ProcessHandle := OpenProcess(Process_All_Access, False,Findprocess('نام فايل اجرايي مثلا ماشين حساب'));
Inject(ProcessHandle, @Main);
CloseHandle(ProcessHandle);

كدي را كه در Main مي نويسيد به پروسس در حال اجراي مثلا Calc.exe تزريق و اجرا مي شود .

فقط يادت نره imagebase را در رنج 50000000 بگذاري

delphiprog3000
چهارشنبه 30 مرداد 1387, 12:29 عصر
با تشکر دوست عزیز.



فقط يادت نره imagebase را در رنج 50000000 بگذاري

در این مورد ندیدم اسم پارامتر با این نام.

به چه دلیل لطفا توضیح دهید.

با تشکر..................................

مینا موسوی
چهارشنبه 30 مرداد 1387, 14:31 عصر
.در این مورد در لینک زیر بحث شده و انگار به نتیجه نرسیده
http://barnamenevis.org/forum/showthread.php?t=110906&highlight=%D9%BE%D8%B1%D9%88%D8%B3%D9%87+%D8%AF%D9 %84%D9%81%DB%8C

دنیای دلفی
چهارشنبه 30 مرداد 1387, 18:15 عصر
The $IMAGEBASE directive controls the default load address for an application, DLL, or package. The number argument must be a 32-bit integer value that specifies image base address. The number argument must be greater than or equal to $00010000, and the lower 16 bits of the argument are ignored and should be zero. The number must be a multiple of 64K (that is, a hex number must have zeros as the last 4 digits) otherwise it will be rounded down to the nearest multiple, and you will receive a compiler message.

When a module (application or library) is loaded into the address space of a process, Windows will attempt to place the module at its default image base address. If that does not succeed, that is if the given address range is already reserved by another module, the module is relocated to an address determined at runtime by Windows.
There is seldom, if ever, any reason to change the image base address of an application. For a library, however, it is recommended that you use the $IMAGEBASE directive to specify a non-default image base address, since the default image base address of $00400000 will almost certainly never be available. The recommended address range of DLL images is $40000000 to $7FFFFFFF. Addresses in this range are always available to a process in both Windows NT/2000 and Windows 95/98.

When Windows succeeds in loading a DLL (or package) at its image base address, the load time is decreased because relocation fix-ups do not have to be applied. Furthermore, when the given address range is available in multiple processes that use the library, code portions of the DLL's image can be shared among the processes, thus reducing load time and memory consumption.

Note: The $IMAGEBASE directive overrides any value supplied with the -K command line compiler directive option.


بايد رنج ايميج بيس را افزايش داد تا باعث ايجاد تداخل در حافظه ساير برنامه ها نشود

دنیای دلفی
چهارشنبه 30 مرداد 1387, 18:22 عصر
يك نمونه برات با سورس مي گذارم ماشين حساب را اجرا كن سپس روي كليد كليك كن . و حالشو ببر

مینا موسوی
چهارشنبه 30 مرداد 1387, 19:25 عصر
جناب دنیای دلفی سورستون کار نمی ده و برنامه calc.exe پیغام dont send میده و ماشین حساب رو می بنده.

دنیای دلفی
پنج شنبه 31 مرداد 1387, 01:00 صبح
روي سيستم خودم به راحتي جواب مي ده يك كار بكن Imagebase رو تغيير بده بعد تست كن

LordMMD
جمعه 15 شهریور 1387, 16:34 عصر
خوب با این فقط میشه یک کد رو از طرف برنامه قربانی اجرا کرد.
درسته ؟
راستی این کد چرا اینقدر پیچیده هست؟
من کد خیلی ساده تری رو دیده بودم.

در هر حال آیا با این روش میشه کاری کرد تا message های پنجره مورد نظر رو دریافت کرد؟ میخوام پیغام های WM_MouseWheel مربوط به یک برنامه دیگر رو بگیرم.

چطور این کار رو بکنم؟
ممنون.

vcldeveloper
جمعه 15 شهریور 1387, 18:00 عصر
میخوام پیغام های WM_MouseWheel مربوط به یک برنامه دیگر رو بگیرم.
با استفاده از یک Global Hook.

Mask
جمعه 15 شهریور 1387, 19:41 عصر
Imagebase کجاست که باید تغییر کنه.

zman123456
شنبه 16 شهریور 1387, 12:50 عصر
یک صفر Imagebase زیادیه.
تو فایل دنبال Imagebase بگرد بهت نشون میده پایین res

AlirezaBahredar
شنبه 16 شهریور 1387, 12:58 عصر
با سلام....
میشه لطف کنید در حد یک جمله بگید که Process injection چی هست؟
با تشکر

Nima NT
شنبه 16 شهریور 1387, 16:30 عصر
در کلام ساده Process injection یعنی تزریق کد های یک برنامه به محدوده یه برنامه دیگه تو رم و اجرای اون .
مثلا" من بیام برنامه خودم رو تو محدوده explorer.exe اجرا کنم. اینطوری کد های من به نظر میرسه که داره explorer اجراشون میکنه.

Mask
شنبه 16 شهریور 1387, 19:05 عصر
nدوست عزیز


یک صفر Imagebase زیادیه.
تو فایل دنبال Imagebase بگرد بهت نشون میده پایین res

یک صفر رو برداشتم حالا پیغام inject to calc میده اما عمل نمیکنه

zman123456
یک شنبه 17 شهریور 1387, 12:56 عصر
منم الان داشتم به همین فکر میکردم.اول که اجرا کردم وقتی دیدم پیغام داد دیگه دنبالشو نگرفتم.اگه فهمیدم بهتون میگم.یا راحتتر اینکه از برنامه نویسش بخواهیم جواب ما رو بده.

دنیای دلفی
دوشنبه 18 شهریور 1387, 23:25 عصر
خوبه ديگه اگر پيام را داده هدف همين بوده اين پيام به ماشين حساب تزريق شده و در حافظه آن اجرا شده شما الان مي تونيد تعداد اين پيامها را بيشتر كنيد . و بعد از اجرا شدن برنامه خودتان مي بينيد كه اگر حتي برنامه خودتان را ببنديد . اين پيامها اجرا خواهند شد.

من درست متوجه نشدم مشكل كارتان چيست . و هدف شما از اين شيوه چه چيزي است .

Mask
سه شنبه 19 شهریور 1387, 00:29 صبح
خوبه ديگه اگر پيام را داده هدف همين بوده اين پيام به ماشين حساب تزريق شده و در حافظه آن اجرا شده شما الان مي تونيد تعداد اين پيامها را بيشتر كنيد . و بعد از اجرا شدن برنامه خودتان مي بينيد كه اگر حتي برنامه خودتان را ببنديد . اين پيامها اجرا خواهند شد.

من درست متوجه نشدم مشكل كارتان چيست . و هدف شما از اين شيوه چه چيزي است .
ببین دوست عزیز یا من درست متوجه نشدم یا شما درست توضیح ندادید.
معنای Process injection مگر تزریق یک پروسه در پروسه دیگه نیست.
اگه بله پس یک مثال : من برنامه ای دارم به نام project.exe می خوام وقتی برنامه من اجرا شد.در تسک منیجر پروسه project.exe نباشه.! چرا؟
چون این پروسه در پروسه مثلا smss.exe تزریق شده و در تسک منیجر پیدا نیست و اگه بخام پروسه PROJECT.EXE رو ببندم باید پروسه SMSS.EXE رو ببندم تا پروسه PROJECT.EXE بسته بشه.
متوجه شدید چی شد.

Cave_Man
سه شنبه 19 شهریور 1387, 02:17 صبح
يك نمونه برات با سورس مي گذارم ماشين حساب را اجرا كن سپس روي كليد كليك كن . و حالشو ببر
ضمن تشکر
فرض کنید که من دکمه ای رو ایجاد کردم و PaternWindow اون دکمه رو، هندل اون ماشین حساب گذاشتم در نتیجه الان یک دکمه روی ماشین حساب ایجاد کردم و میخام با فشار دادن اون دکمه (که روی ماشین حساب هست ) پیغام Messagebox(0,'Inject To Calculator','',0); ظاهر بشه . در این صورت باید چیکار کرد؟

Mask
شنبه 23 شهریور 1387, 00:27 صبح
جناب دنیای دلفی یا دیگر دوستان
در مورد سوال من و مشکلات پیش اومده کسی نظر یا راهنمایی نداره.

معنای Process injection مگر تزریق یک پروسه در پروسه دیگه نیست.
اگه بله پس یک مثال : من برنامه ای دارم به نام project.exe می خوام وقتی برنامه من اجرا شد.در تسک منیجر پروسه project.exe نباشه.! چرا؟
چون این پروسه در پروسه مثلا smss.exe تزریق شده و در تسک منیجر پیدا نیست و اگه بخام پروسه PROJECT.EXE رو ببندم باید پروسه SMSS.EXE رو ببندم تا پروسه PROJECT.EXE بسته بشه.

دنیای دلفی
یک شنبه 31 شهریور 1387, 23:05 عصر
دوستان به اين نكته توجه كنيد كه شما نمي توانيد هر كدي را در حوزه حافظه يك پراسس اينجكت كنيد . چون باعث برهم نويسي با تخريب حافظه و نهايتا بسته شدن به همراه خطاي مثلا Calc مي شويد .

Mask
دوشنبه 01 مهر 1387, 12:05 عصر
پس چکار باید کرد و نظرتون راجع به سوال من چیه؟
در لینک زیر همین بحث انجام شده اما برنامه یا سورس کد جامعی که کار بده ارائه نشده.دوستان کسی نیست این کار رو انجام داده باشه و نمونه برنامش رو برامون بزاره.(البته این بحثها هم امنیتیه هم اونایی که بلدن نمی خان همه یاد بگیرن)
http://barnamenevis.org/forum/showthread.php?t=15660 (http://barnamenevis.org/forum/showthread.php?t=15660)

R2du-soft
پنج شنبه 27 مهر 1391, 20:07 عصر
سلام
آقایون چطور میشه به پروسس یه کد تزریق کرد که باعت بسته شدنش بشه؟
با ویژوال بلدید؟
با هر زبونی هم که بشه اینکارو کرد ، به این کد شدیدا نیاز دارم
لطفا کمکم کنید.