View Full Version : در مورد پروسس اينجكشن و كدهاي تزريقي
FiACKER
جمعه 22 آذر 1387, 14:33 عصر
در مورد پروسس اينجكشن تا جايي كه من متوجه شدم برنامه نويس فقط اجازه داره از توابع Api براي هر كاري استفاده كنه به اضافه حلقه و شرط هم مشكلي نداره... !
ايا مي شه علاوه بر تابعي كه درون پروسه تزريق مي شه توابع ديگري هم درونه همون پروسه تزريق بشه و بين اين توابع تعامل وجود داشته باشه و بتونن با هم ارتباط برقرار كنن ؟
اصلا مي شه كاري كرد هر كدي كه ما مي خواييم در يه پروسه ديگه اجرا بشه ؟
اگر اره چطور ؟
اگه كسي كده پيشرفته در مورد Process Injection داره ، لطف مي كنه در همين تاپيك اپلود كنه.
با تشكر
HadiDelphi
جمعه 22 آذر 1387, 20:05 عصر
میتونین این کار بکنین
البته اگه بخوای فقط کد طزریق کنی کار خیلی سخت هست
بهتره به جای کد , Dll به پروسه مورد نظر طزریق کنی کارش تا یه حدی راحت تر
arash_ebrahimi_nk
جمعه 22 آذر 1387, 22:00 عصر
کاری که دوستمون سوال کردن عملی هست چون من در madremote تابع copyfunction (بدون سورس) رو دیدم که تابع مورد نظر ما در سورس برنامه خودمون رو به پروسه دلخواه تزریق میکنه (و به قول خودش فقط Entry Point اون رو در اختیار ما قرار میده برای فراخوانی و اجرا). البته کدی که توابع Api رو کپی و اجرا میکنه روی وب موجود هست من هم به زبان دلفی اون رو دارم و باهاش کار هم کرد و توابع ای که میخواستم رو با تغییر کد به پروسه مورد نظر تزریق و اجرا کردم و جواب هم داد.
آیا کسی در مورد سورس های madremote یا سورس مشابه اطلاعاتی داره؟
آیا میتوان subclassing را از طریق ProcessInjection انجام داد؟ یه چیزی تو مایع های هوک یک پروسه بدون دی ال ال؟
Mask
شنبه 23 آذر 1387, 00:28 صبح
این پست میشه گفت دهمین پسته در باره همین سوال شما که بنده در تالار های مختلف پرسیدم.
اما هیچکس یه کد درست حسابی یا عملی نداد.
بحث یه مقدار تخصصیه باید انگار مانی پیاده شید.
arash_ebrahimi_nk
شنبه 23 آذر 1387, 12:11 عصر
به نظر شما خودمون نمیتونیم به جایی برسیم؟ اگر تمام کدهای مربوطه رو من اینجا بذارم و اونها رو تشریح کنیم چون یه تابع دارم (با سورس) که میگه میتونه تابع تزریق کنه (البته با مثالی از تابع API) و مثالی داره از هوک بدون دی ال ال که تابع مورد نظر رو به پروسه ها تزریق میکنه و خودش میاد CreateProcess رو در داخل خودش هوک میکنه (هنوز بررسی نکردم چطوری) برای هوک کردن پروسه هایی که بعد از اعمال هوک اجرا میشن.
HadiDelphi
شنبه 23 آذر 1387, 16:43 عصر
اگه تو بحث های آقای inspir (نمیدونم درست نوشتم یا نه ) بگردین کد هم گیر میارین
FiACKER
یک شنبه 24 آذر 1387, 00:56 صبح
بحث یه مقدار تخصصیه باید انگار مانی پیاده شید.
از اين حرفت خوشم اومد ... با حال بود !
اره مثله اينكه ! بايد يه چيزي بديم !!!!
به نظر شما خودمون نمیتونیم به جایی برسیم؟ اگر تمام کدهای مربوطه رو من اینجا بذارم و اونها رو تشریح کنیم چون یه تابع دارم (با سورس) که میگه میتونه تابع تزریق کنه (البته با مثالی از تابع API) و مثالی داره از هوک بدون دی ال ال که تابع مورد نظر رو به پروسه ها تزریق میکنه و خودش میاد CreateProcess رو در داخل خودش هوک میکنه (هنوز بررسی نکردم چطوری) برای هوک کردن پروسه هایی که بعد از اعمال هوک اجرا میشن.
دوسته عزيز اقاي arash_ebrahimi_nk لطف كنيد و هر چي سورس در اين مورد داريد همينجا اپلود كنيد !
دوستان + من يه مطالعه اي مي كنيم ... شايد چيزي دستگيرمون شد !
اگه تو بحث های آقای inspir (نمیدونم درست نوشتم یا نه ) بگردین کد هم گیر میارین
(نام تجاري دلفي ... Inprise)
كدي كه ايشون دادند يه مثاله خيلي ساده بود ! توابع api رو به راحتي مي شه باهاش اينجكت كرد !
بهتره به جای کد , Dll به پروسه مورد نظر طزریق کنی کارش تا یه حدی راحت تر
اين كار چطور انجام مي شه !؟
بعد از اينجكت dll به پروسه چطور بايد كدهاي درون dll فراخوني بشه و كاره ما انجام بشه ؟
ايا به اين كار مي گن HooK !؟
اگه سورسي در اين رابطه داريد لطف مي فرماييد ... ؟
با تشكر از همگي دوستان
arash_ebrahimi_nk
یک شنبه 24 آذر 1387, 08:20 صبح
یه کد آسون که من برای تزریق توابع API ازش استفاده میکنم و جواب میده
unit WindowU;
interface
uses
Windows, SysUtils;
type
TSetWindowLong = function(hwnd: HWND; nIndex, value: Integer): Integer; stdcall;
TInjData = packed record
hwnd : HWND;
fnSetWindowLong : TSetWindowLong;
oldWndProc : THandle;
value : Integer;
UnicodeB : Boolean;
UnicodeC : Boolean;
hInst : HWND;
end;
pInjData = ^TInjData;
function SetRemoteWndProc(cWinH: THandle; value: Integer): THandle;
implementation
//Thread Procedure
function GetWindowInfoProc(InjData: pInjData): DWORD; stdcall;
begin
InjData.oldWndProc := THandle(InjData.fnSetWindowLong(InjData.hwnd, GWL_WNDPROC, InjData.value));
Result := 1;
end;
procedure AfterThreadProc;
begin
//
end;
function GetRemoteWindowInfo(hProcess: THandle; hWnd: HWND; var oldProc: THandle;
SetWndLongValue: Integer): Integer;
var
hUser32: HINST;
pDataRemote: pInjData; // the address (in the remote process) where INJDATA will be copied to;
pCodeRemote: pDWORD; // the address (in the remote process) where ThreadFunc will be copied to;
hThread: THandle; // the handle to the thread executing the remote copy of ThreadFunc;
dwThreadId: DWORD;
nCharsXferred: integer; // number of chars retrieved by WM_GETTEXT in the remote thread;
dwNumBytesXferred: DWORD; // number of bytes written/read to/from the remote process;
DataLocal: TInjData;
cbCodeSize: integer;
begin
//init locals
hThread := INVALID_HANDLE_VALUE;
dwThreadId := 0;
nCharsXferred := 0;
dwNumBytesXferred := 0;
pDataRemote := nil;
pCodeRemote := nil;
result := 0;
try //finally
try //catch exceptions
hUser32 := GetModuleHandle('user32');
if (hUser32 = INVALID_HANDLE_VALUE) then raise exception.Create('get module handle failed');
if IsWindowUnicode(hWnd) then begin
DataLocal.UnicodeB := True;
DataLocal.fnSetWindowLong := TSetWindowLong(GetProcAddress(hUser32, 'SetWindowLongW'));
end else begin
DataLocal.UnicodeB := False;
DataLocal.fnSetWindowLong := TSetWindowLong(GetProcAddress(hUser32, 'SetWindowLongA'));
end;
// Initialize INJDATA function and target hwnd
DataLocal.hWnd := hWnd;
DataLocal.oldWndProc := 0;
DataLocal.value := SetWndLongValue;
DataLocal.hInst := THandle(GetWindowLong(hwnd, GWL_HINSTANCE));
// Allocate memory in the remote process for INJDATA
pDataRemote := pInjData(VirtualAllocEx(hProcess, nil, sizeof(TInjData), MEM_COMMIT, PAGE_READWRITE));
if (pDataRemote = nil) then raise exception.Create('allocation of thread memory failed ' + IntToStr(GetLastError));
// Write a copy of DataLocal to the allocated memory
if ord(WriteProcessMemory(hProcess, pDataRemote, @DataLocal, sizeof(TInjData), dwNumBytesXferred) ) = 0 then
raise exception.Create('allocate data space failed ' + IntToStr(GetLastError));
// Calculate the number of bytes that ThreadFunc occupies
//const int cbCodeSize = ((LPBYTE) AfterThreadFunc - (LPBYTE) ThreadFunc);
cbCodeSize := integer(@AfterThreadProc) - integer(@GetWindowInfoProc);
// Allocate memory in the remote process for the injected ThreadFunc
pCodeRemote := pDWORD(VirtualAllocEx(hProcess, nil, cbCodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE ) );
if (pCodeRemote = nil) then raise exception.Create('allocation of thread memory for ThreadFunc failed');
// Write a copy of ThreadFunc to the allocated memory
if ord(WriteProcessMemory(hProcess, pCodeRemote, @GetWindowInfoProc, cbCodeSize, dwNumBytesXferred)) = 0 then
raise exception.Create('allocate code space failed ' + IntToStr(GetLastError));
// Start execution of remote ThreadFunc
hThread := CreateRemoteThread(hProcess, nil, 0, pCodeRemote, pDataRemote, 0 , dwThreadId);
//CreateRemoteThreadEx(processHandle, nil, 0, entryPoint, params, 0, tid);
if (hThread = INVALID_HANDLE_VALUE) then raise exception.Create('create remote thread call failed');
WaitForSingleObject(hThread, 3000); //wait 3 seconds and then give up
// Get result (password) back
ReadProcessMemory(hProcess, pDataRemote, @DataLocal, sizeof(TInjData), dwNumBytesXferred);
// copy result
oldProc := DataLocal.oldWndProc;
except on E: exception do begin
oldProc := 0;
Exit;
end;
end;
result := 1;
finally
if (pDataRemote <> nil) then
VirtualFreeEx(hProcess, pDataRemote, 0, MEM_RELEASE);
if (pCodeRemote <> nil) then
VirtualFreeEx(hProcess, pCodeRemote, 0, MEM_RELEASE);
if (hThread <> INVALID_HANDLE_VALUE) then begin
GetExitCodeThread(hThread, cardinal(nCharsXferred));
CloseHandle(hThread);
end;
end;
end;
function SetRemoteWndProc(cWinH: THandle; value: Integer): THandle;
var
oldproc: THandle;
pid, ph : dword;
begin
Result := 0;
GetWindowThreadProcessID(cWinH, @pid);
if pid = GetCurrentProcessID then Exit;
ph := OpenProcess(PROCESS_ALL_ACCESS, false, pid);
GetRemoteWindowInfo(ph, cWinH, oldproc, value);
Result := oldProc;
CloseHandle(ph);
end;
end.
اون مثال دیگه ای هم که گفته بودم ضمیمه کردم.
HadiDelphi
دوشنبه 25 آذر 1387, 19:27 عصر
اين كار چطور انجام مي شه !؟
برای اینجکت کردن DLL میتونی از MadCollection استفاده کنید
بعد از اينجكت dll به پروسه چطور بايد كدهاي درون dll فراخوني بشه و كاره ما انجام بشه ؟
اگه دقت کنید میبینید هنگام برنامه نویسی و ساخت DLL دقیقا مثل برنامه کنسول یه تابع اصلی وجود داره که DLL بعد از لود شدن به طور اتوماتیک اون تابع رو اجرا میکنه
حالا شما میتونی تمام توابع خودت رو تو اون تابع اصلی فراخوانی بکنی
به همین سادگی
ايا به اين كار مي گن HooK !؟
نه به این کار HOOK نمیگن
اگه سورسي در اين رابطه داريد لطف مي فرماييد ... ؟
مطمئن باش هیچکسی سورس کدی که یه DLL رو اینجکت کنه , بهت نمیده البته مفد
چون یه کار پیچیده ای هست
البته یه راهی هم هست
برو سراغ ویروس های Open Source
arash_ebrahimi_nk
دوشنبه 25 آذر 1387, 21:08 عصر
HadiDelphi:
اگر شما کدی دارید که میخواهید بفروشید میتونید شفاف بیان کنید؛ در غیر اینصورت (چون به نظر اطلاعاتتون در این زمینه کم نیست) اگر دوست داشتید میتونید به ما کمک کنید؛ مثلاً یه نگاه اجمالی به فایل پیوست شده بندازید چون سورس اینجکت کردن دی ال ال در اون موجود است! (بدون مثال-> البته مثالش رو هم دارم.)
HadiDelphi
سه شنبه 26 آذر 1387, 11:51 صبح
HadiDelphi:
اگر شما کدی دارید که میخواهید بفروشید میتونید شفاف بیان کنید
نه من قصد فروش کدی رو ندارم چون نیازی به این کار ندارم
در ضمن من گفتم اگه بخوای یه همچین کدی رو گیر بیاری باید بری سراغ سورس ویروس ها که کدی رو هم که شما گذاشتین مال روتکیت AFXRootkit2005 هست
یعنی من گفتم میتونی از کجا مفد گیر بیاری
arash_ebrahimi_nk
سه شنبه 26 آذر 1387, 12:07 عصر
اون نمونه بود که شاید کدهای مخرب توش باشه ولی سورس در زمینه دی ال ال اینجکشن زیاد هست مثلا این نمونه سورس رایگان که ویروس شناخته نمیشه:
http://uall.cheat-project.com/uallCollection/Files/uallCollection.zip
برای سورس بیشتر به این سایت هم میتونید مراجعه کنید:
hackhound.org
اما ما میخواهیم خودمون از کد سر در بیاریم و کد بنویسیم نه اینکه بخریم یا کپی کنیم؟! درسته؟
به هر حال من منتظر بررسی ها و توضیحات دوستان در مورد کدهایی که ارسال کردم هستم.
larry-ellison
سه شنبه 26 آذر 1387, 15:16 عصر
پروسس اینجکشن به راحتی با کپی کردن کد مورد نظر در محدوده حافظه پروسس مورد نطر امکتن پذیر است . کافیست به این شکل عمل کنید :
(به برخی از API ها که بتوانید از آنها استفاده کنید اشاره می کنم)
process id فرآیند مورد نظر خود را پیدا کنید (CreateToolHelp32snapshot)
پروسس را باز کنید
فضای مورد نیاز را در آن رزرو کنید (VirtualAllocEx)
کد خود را با استفاده از writeprocessmemory در محدوده حافظه پروسس مورد نظر کپی کنید
با استفاده از CreateRemoteThread تابع مورد نظر خود را اجرا کنید.
*************
چون data segment برنامه اصلی شما در محیط اینجکشت شده وجود ندارد باید تمامی داده های مورد نیاز خود را نیز در محدوده آدرس پروسس مورد نیاز کپی کنید ( تمامی string ها )
چونIAT برنامه اصلی در محیط inject شده قابل استفاده نیست باید آدرس تمامی API های مورد استفاده را (حتی ساده تری آنها را) با استفاده از GetProcessAddress بدست آورد.
اندازه متغیر های محلی inject شده بیش از ۴ KB نباشد و از far jump استفاده نکنید .
امیدوارم این اشاره های مختصر برای پیشبرد کارتان مفید باشد
HadiDelphi
سه شنبه 26 آذر 1387, 18:43 عصر
تو uallCollection کدی برای اینجکت کردن DLL یه طور دستی وجود نداره
arash_ebrahimi_nk
چهارشنبه 27 آذر 1387, 21:41 عصر
از جناب larry-ellison مجدداً تشکر میکنم و اینکه اگر این اطلاعات، اشاراتی مختصر بود باید بدونید که ما در این زمینه مبتدی هستیم و همینقدر هم نمیدونیم سوالی که دارم اینه که آیا Subclassing رو بدون dll و بطور قانونی (از نظر آنتی ویروس ها) میشه انجام داد یا نه؟ اگه عملی هست من برم و در مورد پروسه ها بخونم
در ضمن این هم برای جناب HadiDelphi :
HadiDelphi
چهارشنبه 27 آذر 1387, 22:31 عصر
جناب arash_ebrahimi_nk (http://barnamenevis.org/forum/member.php?u=19570) با استفاده از uallcollection شما فقط میتونید یه DLL رو که تو هارد هست ( که از یه روش خیلی ساده استفاده میکنه ) به پروسه های دیگه اینجکت کنید
که جواب گوی کاری که شما میخواهید بکنید , نیست
arash_ebrahimi_nk
پنج شنبه 28 آذر 1387, 09:23 صبح
من که نمیخوام از دی ال ال استفاده کنم شما گفتید سورس برای اینکار وجود نداره من هم بهتون دادم همین.
larry-ellison
پنج شنبه 28 آذر 1387, 09:46 صبح
سوالتان را در مورد subclassing متوجه نشدم . اگر قصد استفاده از class را در کار Injection دارید باید بگم که این کار تا حدودی مشکل ساز است چون کلاس ها با ساختار منطقی که دارند حجم زیادتری را اشغال می کنند و می دانید که در Process Injection محدودیت 4KB وجود دارد
آنتی ویروس های امروزی بصورت heuristic می توانند رفتار برنامه را بررسی کنند لذا حتی وجود داشتن یکی از API های حساس در IAT می تواند زنگ خطری برای Antivirus باشد.
(برای رفع این مشکل شما احتمالا نیاز به تکنیک های SSDT Unhooking خواهید داشت.)
در صورتی که این مطلب پاسخ سوال شما نبود لطفا سوال خود و نیازتان را با توضیحات بیشتر ارسال کنید.
arash_ebrahimi_nk
پنج شنبه 28 آذر 1387, 11:19 صبح
subclassing هوک کردن پیام هاست با این شیوه:
- ابتدا GetWindowLong را فراخوانی میکنیم برای بدست آوردن هندل "پروسیجر دریافت و ارسال پیام" یک کنترل.
- سپس هندل یک "پروسیجر دریافت و ارسال پیامِ سفارشی" که خودمان نوشته ایم را از طریق SetWindowLong جایگزین هندل "پروسیجر دریافت و ارسال پیام" کنترل مورد نظر مینماییم.
- پروسیجر سفارشی معمولاً بدین صورت نوشته میشود که یک سری پیام های مورد نیاز، دریافت و ویرایش (من نیاز به ویرایش ندارم) گشته و دیگر پیام ها (یا همه پیام ها) به هندل سابق "پروسیجر دریافت و ارسال پیام" منتقل میشوند (برای پاسخگویی برنامه به آن پیام ها تا برنامه هنگ نکند).
البته این کار از طریق هوک توابع API نیز امکانپذیر است چون در هر دو مورد نیاز به مانیتور کردن (یا دستکاری) پیامهایی است که به یک کنترل فرستاده میشوند.
آیا هیچکدام از روش های فوق بدون دی ال ال امکانپذیر میباشد یا خیر؟
larry-ellison
پنج شنبه 28 آذر 1387, 12:01 عصر
hook کردن API ها معمولا به دو روش User Moder و Kernel Mode انجام می شود.
در روش user moder نیاز به دستکاری IAT پروسس مورد نظر دارید که در اینصورت باید ایجاد پروسس ها را مانیتور کنید . ولی بهترین راه حل استفاده از روس Kernel Mode می باشد در این حالت نیاز دارید که یک Driver (نوشتن آن بسیار ساده است) بنویسید و NAPI های مورد نظر خود را Hook کنید.
غالبا از روش Kernel Mode برای مخفی سازی پروسس های در حال اجرا ، فایلها ، کلید های رجیستری ، پورت ها ، د.ر زدن فایروال و .... استفاده می شود.
larry-ellison
پنج شنبه 28 آذر 1387, 12:13 عصر
در مورد subclassing نکته اصلی این است که این کار باید از داخل خود پروسس انچام گیرد یعنی شما نمی توانید از پروسس خودتان یک subclass از window class پروسس دیگر ایجاد کنید . برای حل این مشکل می توانید کد خود را به داخل پروسس مورد نظر inject کنید و این کار را از فضای داخل پروسس مورد نظر خود انجام دهید و این کار نیازی به dll مجزا ندارد
arash_ebrahimi_nk
پنج شنبه 28 آذر 1387, 12:16 عصر
حال اگر قصد فقط یک پروسه (ایجاد شده و در حال اجرا) باشه چطور (در این صورت نیاز به مانیتور کردن پروسه هایی که جدید ایجاد میشوند نداریم، درسته؟) در این صورت میشه فقط از طریق Process-Injection توابع API مورد نظر رو مانیتور (-یا دستکاری- که من بهش نیاز ندارم) کنیم؟ (من میخوام پیام های مربوط به منو -Menu- رو هوک کنم).
arash_ebrahimi_nk
پنج شنبه 28 آذر 1387, 12:21 عصر
در مورد subclassing نکته اصلی این است که این کار باید از داخل خود پروسس انچام گیرد یعنی شما نمی توانید از پروسس خودتان یک subclass از window class پروسس دیگر ایجاد کنید . برای حل این مشکل می توانید کد خود را به داخل پروسس مورد نظر inject کنید و این کار را از فضای داخل پروسس مورد نظر خود انجام دهید و این کار نیازی به dll مجزا ندارد
خب سوال من هم همینه - چطور میتونم این کار روانجام بدم؟
larry-ellison
پنج شنبه 28 آذر 1387, 12:22 عصر
بله , چون در اینصورت process مد نظرتون مشخصه و PID آن را دارید می توانید صرفا پیامهای ارسالی به آن را hook کنید . روش دیگر استفاده از unconditional jump است . مایکروسافت برای این کار Detours را ارایه کرده.
larry-ellison
پنج شنبه 28 آذر 1387, 12:30 عصر
این مقاله می تواند به شما کمک کند :
http://www.codeproject.com/KB/threads/winspy.aspx
روش سوم چیزیه که شما یرای process injection به آن نیاز دارید. فقط می ماند پیاده سازی subclassing
arash_ebrahimi_nk
پنج شنبه 28 آذر 1387, 12:33 عصر
خب بذارید ابتدا از طریق پروسس اینجکشن به نتیجه برسیم.
آیا بطور قطعی subclassing از طریق Process-Injection امکانپذیر است؟ این گونه Process-Injection شگرد خاصی دارد؟ میتونید مثالی بیارید؟
arash_ebrahimi_nk
پنج شنبه 28 آذر 1387, 12:47 عصر
مثل اینکه ما پشت سر هم پست میدیم و پست همدیگه رو نمیبینم - مثالی که آوردین کامل است و Subclassing رو از طریق Process-Injection نشون میده. باز هم تشکر میکنم. سورسی که در لینک فوق موجوده همه جور Inject رو شامل میشه و همه اونها رو توضیح میده.
آنتی ویروس Kaspersky به هر نوع Inject حساس است؛ درسته؟
larry-ellison
پنج شنبه 28 آذر 1387, 12:56 عصر
خواهش می کنم . اگه بتونم کمک کوچکی بکنم خوشحال می شم.
در مورد kaspersky باید بگم که قویترین ابزاریه که باهاش سر و کله زدم مخصوصا نسخه های آخرش که دیگه محشره . ولی هر چیزی راهی داره . kasper امکان inject کردن رو نمیده چون تمام API های مورد نیاز رو hook کرده و تا بخواهید کاری بکنید متوجه می شه . مگر اینکه نذارید یعنی API ها را از کنترلش خارج کنید . این کار با استفاده از SDT unhooking امکان پذیر می باشد . ولی خود unhooking هم معمولا با API ها انجام می گیره که اونها هم دست kasper هستند . تنها راه حل ممکن دستکاری آدرس ها بدون استفاده از API ها است و این کار هم فقط با دسترسی به دستورات cmos امکان پذیر است
Fh_prg
پنج شنبه 28 آذر 1387, 13:04 عصر
سوالتان را در مورد subclassing متوجه نشدم . اگر قصد استفاده از class را در کار Injection دارید باید بگم که این کار تا حدودی مشکل ساز است چون کلاس ها با ساختار منطقی که دارند حجم زیادتری را اشغال می کنند و می دانید که در Process Injection محدودیت 4KB وجود دارد
كي گفته محدوديت 4كيلو بايت وجود دارد؟ خواهشا چيزاي جديد از خودتون اختراع نكنيد!
هيچ محدوديتي وجود نداره فقط جمله ايشون رو تصحيح ميكنم به اين صورت كه در پروسس اينجكشن بلاك هاي حافظه اي كه ويندوز در اختيارمون ميذاره مضربي از 4096 بايت ميباشد يعني حداقل بلاك اختصاص يافته ميتونه 4096 بايت معادل 4 كيلوبايت باشه ولي مقدار اون ميتونه خيلي بيشتر باشه تا جايي كه ويندوز با توجه به ميزان رم و حافظه مجازي ميتونه به برنامه شما اختصاص بده. تو اين تاپيك اشتباهات و حرفاي عجيب و غريب زياد ميبينم ! حالا اگه فرصت شد توضيح ميدم...
larry-ellison
پنج شنبه 28 آذر 1387, 13:23 عصر
كي گفته محدوديت 4كيلو بايت وجود دارد؟ خواهشا چيزاي جديد از خودتون اختراع نكنيد!
هيچ محدوديتي وجود نداره فقط جمله ايشون رو تصحيح ميكنم به اين صورت كه در پروسس اينجكشن بلاك هاي حافظه اي كه ويندوز در اختيارمون ميذاره مضربي از 4096 بايت ميباشد يعني حداقل بلاك اختصاص يافته ميتونه 4096 بايت معادل 4 كيلوبايت باشه ولي مقدار اون ميتونه خيلي بيشتر باشه تا جايي كه ويندوز با توجه به ميزان رم و حافظه مجازي ميتونه به برنامه شما اختصاص بده. تو اين تاپيك اشتباهات و حرفاي عجيب و غريب زياد ميبينم ! حالا اگه فرصت شد توضيح ميدم...
لطفا مطالعات خودتون رو در مورد زبان ماشین و اسمبلی افزایش بدید . اونوقت متوجه می شید که محدودیت 4 kb فقط به خاطر تغییر نحوه آدرس دهی و مقدار دهی ESP می باشد.
Fh_prg
پنج شنبه 28 آذر 1387, 15:02 عصر
لطفا مطالعات خودتون رو در مورد زبان ماشین و اسمبلی افزایش بدید . اونوقت متوجه می شید که محدودیت 4 kb فقط به خاطر تغییر نحوه آدرس دهی و مقدار دهی ESP می باشد.
متاسفانه شما اصلا در مورد اصول كار سيستم عامل (ويندوز) اطلاعات درستي نداريد!
larry-ellison
پنج شنبه 28 آذر 1387, 17:30 عصر
متاسفانه شما اصلا در مورد اصول كار سيستم عامل (ويندوز) اطلاعات درستي نداريد!
بله ، فرمایش جنابعالی کاملا صحیحه . چون اگه اطلاعاتم در این زمینه کافی بود الان باید در خود مایکروسافت مشغول بودم . لطفا شما که اطلاعات کافی دارید ما را بیشتر راهنمایی نمایید تا حداقل جهل من بر طرف بشه
و اگر ممکنه ابتدا از stack و stack probe شروع کنید . متشکرم
Fh_prg
پنج شنبه 28 آذر 1387, 18:27 عصر
بله ، فرمایش جنابعالی کاملا صحیحه . چون اگه اطلاعاتم در این زمینه کافی بود الان باید در خود مایکروسافت مشغول بودم . لطفا شما که اطلاعات کافی دارید ما را بیشتر راهنمایی نمایید تا حداقل جهل من بر طرف بشه
و اگر ممکنه ابتدا از stack و stack probe شروع کنید . متشکرم
مطمئنا مايكروسافت نه وقتشو داره و نه علاقشو كه هر كسي تونست سيستم پروگرمينگ انجام بده جذب خودش كنه چون كم نيستن اينجور آدما!
من نيومدم اينجا كلاس آموزشي راه بندازم ولي ميتونم لااقل جلوي بعضي اشتباهات و باورهاي غلط افراد رو بگيرم. اگه وقت شد توضيحات كافي رو ميدم همينطور كه تو پست قبليم گفتم.
larry-ellison
پنج شنبه 28 آذر 1387, 19:15 عصر
مطمئنا مايكروسافت نه وقتشو داره و نه علاقشو كه هر كسي تونست سيستم پروگرمينگ انجام بده جذب خودش كنه چون كم نيستن اينجور آدما!
من نيومدم اينجا كلاس آموزشي راه بندازم ولي ميتونم لااقل جلوي بعضي اشتباهات و باورهاي غلط افراد رو بگيرم. اگه وقت شد توضيحات كافي رو ميدم همينطور كه تو پست قبليم گفتم.
خواهش می کنم قدری از این وقت ارزشمندتان را صرف جلوگیری از اشتباهات و باور های غلط بکنید و ذکات چیز هایی رو که یاد گرفتید همینجا بدید. من به شدت مشتاقم یاد بگیرم
و اگر حرفی برای گفتن ندارید لطفا وقت کسانی رو که می خواهند کاری انجام بدند و یا کسانی مثل من که می خواهند چیزی یاد بگیرند را نگیرید.
من تا حالا در پست های شما حرف حساب قانع کننده مستدلی ندیدم جز اینکه همیشه فرمودید اگر وقت داشتید جلوی اشتباهات رو خواهید گرفت .
illegalyasync
پنج شنبه 28 آذر 1387, 23:30 عصر
من نيومدم اينجا كلاس آموزشي راه بندازم ولي ميتونم لااقل جلوي بعضي اشتباهات و باورهاي غلط افراد رو بگيرم. اگه وقت شد توضيحات كافي رو ميدم همينطور كه تو پست قبليم گفتم.
براي اينكه اشتباهات و باورهاي غلط ديگران رو رفع كني بايد خودت اول درستش رو بلد باشي . ماكزيمم اندازه هر Remote Thread ميتونه به اندازه يك Virtual Memory Page باشه كه در ويندوزهاي 32 بيتي مقدار 4K هست . از اونجائي كه بين اين Page ها نميتوني Far Jump كني پس بايد كدي كه Inject ميكني كمتر از اندازه يك Page باشه . اين مسئله اصلا ربطي به اينكه چقدر ميشه حافظه Allocate كرد نداره . روتكيتهاي User Mode در ويندوز معمولا از دو روش استفاده ميكنن كه يكيش Injection هست و اون يكي Detour Hook . وقتي Injection به هر دليل فايده نداره Detour Hook كمك ميكنه .
Fh_prg
جمعه 29 آذر 1387, 16:37 عصر
براي اينكه اشتباهات و باورهاي غلط ديگران رو رفع كني بايد خودت اول درستش رو بلد باشي . ماكزيمم اندازه هر Remote Thread ميتونه به اندازه يك Virtual Memory Page باشه كه در ويندوزهاي 32 بيتي مقدار 4K هست . از اونجائي كه بين اين Page ها نميتوني Far Jump كني پس بايد كدي كه Inject ميكني كمتر از اندازه يك Page باشه . اين مسئله اصلا ربطي به اينكه چقدر ميشه حافظه Allocate كرد نداره . روتكيتهاي User Mode در ويندوز معمولا از دو روش استفاده ميكنن كه يكيش Injection هست و اون يكي Detour Hook . وقتي Injection به هر دليل فايده نداره Detour Hook كمك ميكنه .
متاسفانه شما بدون اينكه درك كني دوستمون چه اشتباهي در گفتارش كرده به صورت كوركورانه ازش دفاع كردي. با كمال تاسف بعضي افراد با خواندن چند مقاله و سورس كد به خودشون اجازه ميدن در مورد موضوعي كه حتي عملا تجربه نكردن اظهار نظر كنن!
شما حتي در مورد تابع CreateRemoteThread كه مهمترين وسيله براي اينجكشن در حالت يوزر مود هست مطالعه درستي نكردي و نميدوني اعدادي كه گفتي براي حالت پيشفرض هست!
حرف شما رو كه ميگي تو اينجكشن محدوديت 4 كيلوبايتي وجود داره به شدت رد ميكنم مگه اينكه منظورت چيزه ديگه اي بوده باشه كه نتونستي درست بيان كني...
بهترين راه براي ثابت كردن يك مثال هست.
پروسيجري كه به Notepad تزريق ميشه با متغيرهاي محليش بيشتر از 4 كيلوبايت هست و هيچ محدوديتي در اين مورد وجود نداره و تا جايي كه سيستم به شما اجازه بده ميتونيد سايز اين Thread تزريق شده و پارامترهاي خط فرمانش رو بزرگتر كنين و به هر جاي اون كه خواستيد پرش كنيد. در نهايت حتي ميتونيد با رعايت كردن اصول Relocation و جدول ايمپورتها كل فايل اجرايي خودتون رو به پروسه مورد نظر تزريق كنيد با هر اندازه اي...
illegalyasync
جمعه 29 آذر 1387, 20:25 عصر
در مورد مقدمه نامربوطی که گفتی پاسخی ندارم .
اما در مورد بقیه اش . به نظر میاد متوجه نشدی که Injection دارای معانی مختلفی هست که استفاده از تابع CreateRemoteThread ویندوز فقط یکی از اونهاست . وقتی در یکی از مطالبت نوشتی که "فقط جمله ايشون رو تصحيح ميكنم به اين صورت كه در پروسس اينجكشن بلاك هاي حافظه اي كه ويندوز در اختيارمون ميذاره مضربي از 4096 بايت ميباشد" یعنی متوجه نیستی ما فعل ثابت و مشخصی که اسمش Process Injection باشه و ویندوز اونجا حافظه ای در اختیارمون بذاره نداریم . توصیه میکنم این مقاله (http://www.codeproject.com/KB/threads/winspy.aspx) رو ببینی و از MSDN برای فهمیدنش کمک بگیری .
یکی از بچه ها گفت که تابع منتقل شده از طریق CreateRemoteThread دارای محدودهء 4 کیلوبایتی هست که حرف درستی زده . برای Injection کدهای بزرگ باید از DLL Injection استفاده بشه . کدهائی که تو داخل یک ریسمان راه دور کپی میکنی نمیتونن بیشتر از 4k فضا لازم داشته باشن . دلیلش تو مقدمات اسمبلی x86 روی معماری 32 بیتی گفته شده . غیر از این ، کدهائی که به این نحو منتقل و اجرا میشن طبیعتا با DEP هم مشکل دارن .
در ضمن فایلی که آپلود کردی CRCش مشکل داره و قابل مشاهده نیست . طبعا من استقبال میکنم که تو یک کد سی بنویسی که از طریق WriteProcessMemory کدی رو منتقل و بوسیلهء RemoteCreateThread اجراش کنی تا متوجه محدودیت اندازهء Stack بشی . در مورد مقادیر پیش فرض : تو میتونی اندازه استک برنامه های خودت رو بیشتر کنی ، اما نمیتونی اندازهء استک برنامه هائی که خودت کامپایل نکردی و در حال اجرا هستن رو بیشتر کنی .
Fh_prg
جمعه 29 آذر 1387, 21:39 عصر
لطفا با آسمون ريسمون بافتن تاپيك رو به بي راهه نكش و وقت من رو براي جواب دادن به حرفاي بي ربطت تلف نكن
اما در مورد بقیه اش . به نظر میاد متوجه نشدی که Injection دارای معانی مختلفی هست که استفاده از تابع CreateRemoteThread ویندوز فقط یکی از اونهاست . وقتی در یکی از مطالبت نوشتی که "فقط جمله ايشون رو تصحيح ميكنم به اين صورت كه در پروسس اينجكشن بلاك هاي حافظه اي كه ويندوز در اختيارمون ميذاره مضربي از 4096 بايت ميباشد" یعنی متوجه نیستی ما فعل ثابت و مشخصی که اسمش Process Injection باشه و ویندوز اونجا حافظه ای در اختیارمون بذاره نداریم . توصیه میکنم این مقاله (http://www.codeproject.com/KB/threads/winspy.aspx) رو ببینی و از MSDN برای فهمیدنش کمک بگیری .
مطمئنا ميتوني موضوع تاپيك رو ببيني و حتما خوندن هم بلدي كه بفهمي موضوع تاپيك در مورد Process Injection هست
اگه ميخواي در مورد معاني مختلف اينجكشن صحبت كني ميتوني يك تاپيك ديگه بزني !
من به هيچ وجه در مورد معماري x86 صحبتي نكردم و چيزي رو ازش نقض نكردم من دارم در مورد موضوع بحث و حرف اشتباهي كه يكي از دوستان گفته صحبت ميكنم
یکی از بچه ها گفت که تابع منتقل شده از طریق CreateRemoteThread دارای محدودهء 4 کیلوبایتی هست که حرف درستی زده . برای Injection کدهای بزرگ باید از DLL Injection استفاده بشه . کدهائی که تو داخل یک ریسمان راه دور کپی میکنی نمیتونن بیشتر از 4k فضا لازم داشته باشن . دلیلش تو مقدمات اسمبلی x86 روی معماری 32 بیتی گفته شده . غیر از این ، کدهائی که به این نحو منتقل و اجرا میشن طبیعتا با DEP هم مشکل دارن .
به نظر مياد اصلا تجربه اي در process injection كه بحث اصلي اين تاپيك هست نداري كه اينجوري صحبت ميكني و فقط به يك سري مطالب كه طوطي وار از كتابا خوندي تكيه ميكني
بله براي كدهاي بزرگتر بايد از dll اينجكشن استفاده بشه و بسيار منطقي تره ولي اين دليل نميشه كه نشه بيشتر از 4 كيلو بايت مستقيم اينجكت كرد!
تا جايي كه من ميدونم CreateRemoteThread چيزي رو جابجا نميكنه و فقط با گرفتن يك نقطه شروع و پارامترهاي اون و قرار دادن اون پارامترها روي پشته
كد مورد نظر رو به صورت يك thread اجرا ميكنه البته ما ميتونيم بدون استفاده از پارامتر هم thread خودمون رو اجرا كنيم پس درس بعدي اينكه اين تابع چيزي جابجا نميكنه ! فكر ميكنم writeprocessmemory براي اينكار مناسبتر باشه !
در ضمن فایلی که آپلود کردی CRCش مشکل داره و قابل مشاهده نیست . طبعا من استقبال میکنم که تو یک کد سی بنویسی که از طریق WriteProcessMemory کدی رو منتقل و بوسیلهء RemoteCreateThread اجراش کنی تا متوجه محدودیت اندازهء Stack بشی . در مورد مقادیر پیش فرض : تو میتونی اندازه استک برنامه های خودت رو بیشتر کنی ، اما نمیتونی اندازهء استک برنامه هائی که خودت کامپایل نکردی و در حال اجرا هستن رو بیشتر کنی .
من نميدونم چرا به اندازه استك گير دادي در صورتي كه ربط چنداني به قضيه نداره نمونه كد من رو ببين تا بفهمي !
نگاهي هم به پارامتر stacksize در msdn و توضيحات اضافيش بندازي بد نيست
فايل رو دوباره آپلود كردم و دقيقا همون چيزي كه خواستي توش پياده كردم.
كد كاملا واضحه ونيازي به توضيح نداره.
illegalyasync
جمعه 29 آذر 1387, 22:29 عصر
کماکان بی ادبیها و مطالب نامربوطت رو که احتمالا اقتضای سنت هست نادیده میگیرم .
من نميدونم چرا به اندازه استك گير دادي در صورتي كه ربط چنداني به قضيه نداره نمونه كد من رو ببين تا بفهمي !WriteProcessMemory باید کد مورد نظر تو رو روی استک بنویسه ، در واقع استک تنها مسئله ای هست که به این قضیه مربوطه .
ولي اين دليل نميشه كه نشه بيشتر از 4 كيلو بايت مستقيم اينجكت كرد!بعد از اینکه با مفهوم استک آشنا شدی و مشخص شد که چرا باید ابتدا با تابع VirtualAllocEx ضمن تخصیص ، مجوز Page هائی که Allocate میشن رو به EXECUTE_READWRITE تغییر بدی متوجه میشی که چرا نمیتونی بین Page هات Far Jump کنی . در مقاله ای که لینکش رو دادم اگر به قسمت Why can my ThreadFunc have only 4k of local variables? مراجعه کنی به وضوح این مسئله "بدیهی" رو توضیح داده که چرا نمیتونی از 4k تجاوز کنی و اگر هم بکنی با Access Violation مواجه میشه .
Maximum size of remote thread is 4k (http://dc214.defcon.org/notes/rootkit_basics.ppt)
saeedIRHA
جمعه 29 آذر 1387, 23:12 عصر
100 به صفر به نفع FH_Prg شرط بندی میکنم ;)
دوست عزيز لطفاً از جهت دادن به تاپيک با طرفداری از کسی و شعله ور کردن آتيش خوداری کنيد
و بگذاريد به نتيجه برسيم و چيزی ياد بگيريم،
هر دوی دوستان دارن لطف ميکنن و وقت ميزارن.
Fh_prg
جمعه 29 آذر 1387, 23:26 عصر
کماکان بی ادبیها و مطالب نامربوطت رو که احتمالا اقتضای سنت هست نادیده میگیرم .
دوست عزيز حرفهاي من آينه تمام نماي حرفهاي خودته اگه توش بي ادبي ميبيني دليلش رو در حرفاي خودت بايد جستجو كني نه در سنت من! اينم درس بعدي...
WriteProcessMemory باید کد مورد نظر تو رو روی استک بنویسه ، در واقع استک تنها مسئله ای هست که به این قضیه مربوطه .
اين حرفت رو به عنوان يك جك در دفترچه خاطراتم ثبت ميكنم.
متاسفانه در اثر خواندن مقالات پراكنده بدجوري خودت رو گيج كردي! هيچ قانوني وجود نداره كه بگه من حتما بايد در پشته كدهامو بنويسم ! ديدي كه عملا با يك برنامه ساده بهت نشون دادم و اين برنامه ميتونه كاملتر شه و حتي اگر در داخل كد از ديتاسكشن هم استفاده شده باشه خودش به صورت خودكار ديتاسكشن رو هم با پروسيجر تزريق كنه...
بعد از اینکه با مفهوم استک آشنا شدی و مشخص شد که چرا باید ابتدا با تابع VirtualAllocEx ضمن تخصیص ، مجوز Page هائی که Allocate میشن رو به EXECUTE_READWRITE تغییر بدی متوجه میشی که چرا نمیتونی بین Page هات Far Jump کنی . در مقاله ای که لینکش رو دادم اگر به قسمت Why can my ThreadFunc have only 4k of local variables? مراجعه کنی به وضوح این مسئله "بدیهی" رو توضیح داده که چرا نمیتونی از 4k تجاوز کنی و اگر هم بکنی با Access Violation مواجه میشه .
الان متوجه شدم !
متاسفانه اصلا متوجه نميشي چي دارم ميگم و منظورم چيه. ترجيح ميدم با آدمي كه حتي با تجربه عملي چيزي رو قبول نميكنه و ميگه مرغ يك پا داره بحث نكنم!
saeedIRHA
شنبه 30 آذر 1387, 00:10 صبح
با سلام
يک سؤالی برای من پيش آمد،آيا ميشه با تزريق کردن process به برنامه اي که
سطح دسترسی Admin داره سطح دسترسی خودمون رو ارتقا بديم و کدی رو با
permission admin اجرا کنيم؟
(من در اين ضمينه تجربه زيادی ندارم ، عذر ميخوام اگر سؤالم مبتدی هست)
larry-ellison
شنبه 30 آذر 1387, 00:55 صبح
مطمئنم در این تاپیک بیش از اینکه هدف طرفداری از کسی باشه , به اشتراک گذاشتن یافته ها مد نظر می باشد تا با استفاده از این مطالب به نتایج جدید تری برسیم و یا سعی در یافتن راه حل هایی برای رفع نیازهای نرم افزاری باشیم.
از همه عزیزان هم استدعا دارم در این راستا تلاش کنند.
من بعد از خواند پست های قبلی کماکان با نظر جناب illegalyasync موافق هستم چون این تجربه را 4 سال پیش داشتم و به عینه نتیجه را مشاهده کرده ام.
در مورد سطوح دسترسی (بر خلاف مطالب قبل این مورد نظر شخصی است و ادله کافی برای آن ندارم) :
در صورت inject شدن به process دیگر برنامه سطوح دسترسی target process را بدست می آورد بدین شکل براحتی می توانید سطوح دسترسی مانند system را بدست بیاورید ولی دسترسی admin بستگی به کاربر login شده دارد.
امیدوارم اگر دوستان پاسخی به این پست در جهت تایید و یا رد آن دارند مطالب خود را بطور مستدل ارایه نمایند تا مطالب ارسال شده مفید و قابل استفاده جمع باشد و از غرض ورزی های بی مورد که در شان چنین forum هایی نیست بپرهیزند.
Fh_prg
شنبه 30 آذر 1387, 01:08 صبح
با سلام
يک سؤالی برای من پيش آمد،آيا ميشه با تزريق کردن process به برنامه اي که
سطح دسترسی Admin داره سطح دسترسی خودمون رو ارتقا بديم و کدی رو با
permission admin اجرا کنيم؟
(من در اين ضمينه تجربه زيادی ندارم ، عذر ميخوام اگر سؤالم مبتدی هست)
بله مسلما همين اتفاق ميوفته ولي در صورتي كه بتوني عمل تزريق رو انجام بدي چون در پرميشني غير از مدير به شما اجازه تزريق كد به پروسه هاي سيستمي داده نميشه مگه اينكه مدير سيستم باشيد با پرميشن كامل.
من بعد از خواند پست های قبلی کماکان با نظر جناب illegalyasync موافق هستم چون این تجربه را 4 سال پیش داشتم و به عینه نتیجه را مشاهده کرده ام.
ممكنه در مورد اون لينكها و مقالاتي كه اكثرا قديمي هم هستن اين اتفاق افتاده باشه در اثر استفاده نادرست از توابع و كد نويسي ها ولي اين دليل نميشه كه اينكار نشدني باشه ديدي كه ثابت كردم ميشه.
مطمئنم در این تاپیک بیش از اینکه هدف طرفداری از کسی باشه , به اشتراک گذاشتن یافته ها مد نظر می باشد تا با استفاده از این مطالب به نتایج جدید تری برسیم و یا سعی در یافتن راه حل هایی برای رفع نیازهای نرم افزاری باشیم.
كاملا موافقم.
در مورد پست دنياي دلفي : بهتره زودتر از 48 ساعت پاكش كني چون فكر كنم اشتباه اومدي
illegalyasync
شنبه 30 آذر 1387, 01:22 صبح
چون این تجربه را 4 سال پیش داشتم و به عینه نتیجه را مشاهده کرده ام
مسئله ای که ما در موردش صحبت کردیم اونقدر بدیهی و ابتدائی بود که هیچ ضرورتی به ادامه نداشت . بالاخره برخی از امور رو میشه با مطالعه و بررسی متوجه شد و مجادله در موردشون لااقل در شان ما که نیست . البته میشه در یه فرصت دیگه در مورد معنی تغییر مجوز Page ها و اجرا کردن کد بوسیلهء اونها ( که در Code Injection از طریق CreateRemoteThread ازش استفاده میشه ) توضیح بدیم که برای کسانی که دنبال مطلب هستن مفید باشه .
يک سؤالی برای من پيش آمد،آيا ميشه با تزريق کردن process به برنامه اي که
سطح دسترسی Admin داره سطح دسترسی خودمون رو ارتقا بديم و کدی رو با
permission admin اجرا کنيم؟
فرض میکنم در مورد ویندوز سوال کردی . کسانی که مجوز SeDebugPrivilege رو ندارن نمیتونن چنین کاری رو انجام بدن . کسانی که دارن میتونن . قبلترها یه سری حمله بنام Shatter Attack معروف بودن سعی میکردن از نقائص امنیتی استفاده کنن و با سوء استفاده از Messageهای ویندوز و تزریق کد به برنامه یا جلسه با مجوز بالاتر دسترسیشون رو افزایش بدن . اون وقتها که وضع امنیتی IE افتضاح بود اکثر Malwareهائی IE از این روش استفاده میکردن . اگر منظورت لینوکس باشه فقط root و فقط به شرطی که به dtrace دسترسی داشته باشه میتونه چنین کاری رو انجام بده .
vcldeveloper
شنبه 30 آذر 1387, 01:32 صبح
دوستان،
میشه درباره اختلاف نظرهای فنی بصورت علمی، و با لحن مناسب بحث کرد، نیازی نیست که برای اثبات نظر خودمان از توهین و متلک پراکنی به این و آن استفاده کنیم!
اگر لحن صحبت دوستان، که پست به پست بدتر و شدید الحن تر میشه، اصلاح نشه؛ این تاپیک و تاپیک های مشابه آن را قفل خواهم کرد، پس لطف کنید و مراعات کنید.
Fh_prg
شنبه 30 آذر 1387, 01:44 صبح
البته میشه در یه فرصت دیگه در مورد معنی تغییر مجوز Page ها در استك و اجرا کردن کد بوسیلهء اونها ( که در Code Injection از طریق CreateRemoteThread ازش استفاده میشه ) توضیح بدیم که برای کسانی که دنبال مطلب هستن مفید باشه .
مشكلت اينه كه فكر ميكني در process injection حتما بايد كدها در پشته كپي شن كه دچار محدوديت ميشه و من سعي كردم خلاف اينو بهت ثابت كنم اميدوارم در آينده خودت با آزمايشات بيشتر منظور من رو بهتر درك كني...
مهران موسوی
شنبه 30 آذر 1387, 02:45 صبح
اخه دوستان چرا بحث در مورد اين مسائل رو اينقدر طولاني ميكنيد ؟
ببينيد Fh_prg راست ميگه .
درسته كه در ارسال مقادير به پشته ما با محدوديت 4 كيلوبايتي رو به رو هستيم ولي كدي كه ما ميخواييم تزريق كنيم ربطي به پشته نداره . چون ما يك فضا در حافظه براش گرفتيم و اون رو در اون فضا با توابع مربوطه مينويسيم . پس در نتيجه در امر تزريق با محدوديت حجم كدهاي ماشين رو به رو نميشيم .
ولي يك نكته هست . طبيعتا ممكن هست تابع ما داراي يك پارامتر هم باشه . اين پارامتر چه جوري بايد بهش رسونده بشه ؟ خب معلومه خود CreateRemoteThread اين پارامتر رو برامون قبل از پرش به مكان شروع كدهاي تابع ميريزه توي پشته تا تابع بتونه اون رو از پشته بخونه . حالا اينجا با محدوديت 4 كيلوبايتي رو به رو ميشيم . پس در نتيجه پارامتري كه تابع ما ميگيره نبايد حجمش بيشتر از 4 كيلوبايت باشه . در صورتي كه بيشتر بود بايد از DLL injection استفاده كنيم كه معقولانه ترين راه هست .
خب به نظرتون مسئله به اين سادگي ارزش اين همه بحث رو داشت ؟؟!!!!
دنیای دلفی
شنبه 30 آذر 1387, 09:25 صبح
Fh_prg (http://barnamenevis.org/forum/member.php?u=325) جان لطف كن در خصوص اين Push ها يك توضيحي بده :
push 1097F71Ch
push 0F71C6780h
push 17389718h
push 101CB718h
push 17302C17h
push 18173017h
push 0F715F547h
push 4C103748h
push 272CE7F7h
push 0F7AC6087h
push 1C121C52h
push 7C10871Ch
push 201C701Ch
push 4767602Bh
push 20211011h
push 40121625h
push 82872022h
push 47201220h
push 13101419h
push 18271013h
push 28858260h
push 15124045h
push 5016A0C7h
push 28191812h
push 0F2401812h
push 19154127h
push 50F0F011h
mov ecx, 15124710h
push ecx
push 11151247h
push 10111512h
push 47101115h
ممنون مي شوم
Fh_prg
شنبه 30 آذر 1387, 16:41 عصر
ولي يك نكته هست . طبيعتا ممكن هست تابع ما داراي يك پارامتر هم باشه . اين پارامتر چه جوري بايد بهش رسونده بشه ؟ خب معلومه خود CreateRemoteThread اين پارامتر رو برامون قبل از پرش به مكان شروع كدهاي تابع ميريزه توي پشته تا تابع بتونه اون رو از پشته بخونه . حالا اينجا با محدوديت 4 كيلوبايتي رو به رو ميشيم . پس در نتيجه پارامتري كه تابع ما ميگيره نبايد حجمش بيشتر از 4 كيلوبايت باشه . در صورتي كه بيشتر بود بايد از DLL injection استفاده كنيم كه معقولانه ترين راه هست .
!!!!
اتفاقا من دارم ثابت ميكنم كه حتي در پاس دادن پارامترها از طريق پشته هيچ محدوديتي وجود نداره و فقط استفاده ناشيانه از پشته باعث ايجا مشكلات فوق ميشه.
من در برنامه خودم حدود 20 كيلو بايت اطلاعات رو از طريق پشته پاس دادم و ديدين كه هيچ اتفاقي نيفتاد و اين دليل داره كه مفصلا برنامه و طرز كارش رو توضيح خواهم داد البته به دليل كمبود وقت در چند قسمت اينكارو خواهم كرد.
من در برنامه از دو روش استفاده كردم:
1.پاس دادن پارامترها از طريق پشته
2.استفاده از روش Relocation براي بازسازي آدرس String Table ها
كه هر دو روش رو با جزيياتش كامل توضيح ميدم و ميگم چه محدوديتهايي در اين روشها و كلا كد اينجكشن وجود داره.
قسمت اول :
function OpCodeLength(Address:DWORD):DWORD; cdecl; assembler;
اين فانكشن همونطور كه از اسمش پيداست يك Length DisAssembler هست
Length DisAssembler در واقع يك ديس اسمبلره كه با گرفتن يك آدرس شروع كه مكان قرار گرفتن آپكدهاست طول اولين دستور ماشيني كه در اون آدرس وجود داره به شما ميده
اين نوع ديس اسمبلر ها انواع زيادي دارن و با روشها و زبانهاي مختلف پياده سازي شدن و با جستجو در اينترنت ميتونيد انواع مختلفش رو پيدا كنين
ولي اين ديس اسمبلر به دليل سرعت بالا و حجم كم مورد علاقه من هست اون PUSH xxxx ها كه تو كدهاش ميبينين چيز عجيبي نيست فقط يك آرايه از DWORD هاست كه روي پشته ذخيره ميشن و شما ميتونين اين آرايه رو با خود دلفي پياده كنين
چجوري كار ميكنه؟
فرض كنيد من اين تابع رو با اين آدرس فراخواني كردم:
OpCodeLength($401000)
و فرض كنيد كه در آدرس 401000 اين كدها قرار داشته باشن :
401000 : 68 01 00 00 00 C3
حالا خروجي تابع عدد 5 خواهد بود چرا؟ چون اولين دستور ماشين در آدرس فوق معادل Push 01 ميباشد كه طول آن 5 بايته حالا كافيه براي شناسايي طول دستور بعدي عدد بدست آمده در تابع رو با آدرس شروع جمع كنيم
و تابع رو با اون عدد دوباره فراخواني كنيم :
OpCodeLength($401005)
كه اينبار عدد 1 برميگرده كه همون C3 هست كه آپكد دستور RET در زبان ماشينه
در ادامه ميگم كه ما از اين تابع براي كجاي برنامه استفاده ميكنيم...
HadiDelphi
شنبه 30 آذر 1387, 16:41 عصر
درسته من هم حرف آقای FH_Prg رو تایید میکنم
در Process Injection الزاما کد های اینجکت شده رو پشته قرار نمیگیره و هیچ نوع محدودیت حجمی وجود نداره.
مهران موسوی
شنبه 30 آذر 1387, 23:15 عصر
FH_Prg عزيز ميشه لطف كني و كتابخانه اي كه تابع
function OpCodeLength(Address:DWORD):DWORD; cdecl; assembler;
توش هست بزاري ... ميتونه با توجه به سرعتي كه بيان كرديد مفيد واقع بشه ...
FiACKER
سه شنبه 10 دی 1387, 19:06 عصر
سلام
مچكرم كه به اين موضوع پرداختيد :)
اگه دقت کنید میبینید هنگام برنامه نویسی و ساخت DLL دقیقا مثل برنامه کنسول یه تابع اصلی وجود داره که DLL بعد از لود شدن به طور اتوماتیک اون تابع رو اجرا میکنه
حالا شما میتونی تمام توابع خودت رو تو اون تابع اصلی فراخوانی بکنی
به همین سادگی
مطمئن باش هیچکسی سورس کدی که یه DLL رو اینجکت کنه , بهت نمیده البته مفد
چون یه کار پیچیده ای هست
البته یه راهی هم هست
برو سراغ ویروس های Open Source
بلخره سخت و پيچيده هست يا آسون ؟
اين دوستمون كه گفتند :
بهتره به جای کد , Dll به پروسه مورد نظر طزریق کنی کارش تا یه حدی راحت تر
؟؟؟
حالا يه چيزي !
ايا طريقه ي كار كردن اين روش اينجور هستش :
خودمون يه dll مي سازيم (به دلخواه ، هر كدي خواستيم مي تونيم بهش اضاف كنيم) كه به پروسه مورد نظر اتچ مي كنيم و برنامه مورد اينجكشن (يا هوك) رو كنترل مي كنيم ... يا يه سري دستور رو به دلخواه اجرا مي كنيم !
يه برنامه هست به نام Anvir كه برايه اينكه كليه پروسه هاي ويندوز رو چك كنه از يه چيزي مثله اين استفاده مي كنه ! يعني يه dll به نام AnvirHook.dll به هر پروسه اضاف مي كنه و پروسه ها رو كنترل مي كنه.
اين برنامه يه startup manager و process manager و service manager خوب هست .
و در بعضي مواقع مي تونه از يه سري قضايا شما رو مطلع كنه.
اين امتحانايه لعنتي هم كه شروع شد... 21 واحد ؟ داغونم :-) .
با تشكر
man_56
جمعه 13 دی 1387, 02:10 صبح
از خصوصیات ایرانی جماعت اینه که هموشن فکر میکنن علامۀ دهرن!!
مسالۀ محدودیت 4K هم شده داستان "فیل" مولوی (شنیدید؟)
4 روز از فوروم این میگه هست اون میگه نیست.
-- با این مقدمه خواستم بگم هر دو تون درست میگین:-)
اگر برنامه رو با vc کامپایل کنید محدودیت 4K دارید. علتش هم اینه که vc برای روتینهایی که داده های محلی بیش از 4K دارند، تابعی موسوم به stack prob رو فراخوانی میکنه (در واقع اتوماتیک به ابتدای روتین شما یک call اضافه میکنه) در نتیجه وقتی شما کد رو تزریق میکنید، این فراخوانی اضافه شده، باعث access violation می شه.
من ابداً با دلفی کار نکردم (علاقه ای هم بهش ندارم! فقط از پاسکال یه چیزایی یادمه). برنامۀ exe که Fh_prg پیوست کرده بودند رو دیس-اسمبل کردم و: فکر میکنم دلفی داده های محلی بزرگ رو در پایان بدنۀ تابع قرار میده و زمان استفاده، با یک آدرس دهی مطلق، به این داده ها دسترسی پیدا میکنه.
کار قشنگی که برنامۀ مذکور انجام میده، تصحیح این آدرس است (از خط 261 تا 269):
روتین OpCodeLength سایز دستور اسمبلی بعدی رو برمی گردونه؛ اگر 5 باشه و دستور PUSH باشه (4 تا آدرس + 1 بایت دستور 68h)، آدرس جدید رو محاسبه و جایگزین میکنه، این کار رو با تمام روتین انجام میشه.
پس با این "روش" مشکل 4K حل می شه، نه این که کلاً وجود نداره.
وسلام.
Mehran عزیز، این تابع، کلش همینجاست، دیگه کتابخانه نداره (مثلاً خودمون نوشتیمش!).
پاورقی: کل تحلیل و تایپ این متن کمتر از نیم ساعت طول کشید؛
نتیجه: اگه روتین OpCodeLength کار خودی بود(!) اینقدرها وقت نمی خواست که Fh_prg واسه توضیحش لازم داشتن..
FiACKER
جمعه 13 دی 1387, 13:24 عصر
خواهش می کنم . اگه بتونم کمک کوچکی بکنم خوشحال می شم.
در مورد kaspersky باید بگم که قویترین ابزاریه که باهاش سر و کله زدم مخصوصا نسخه های آخرش که دیگه محشره . ولی هر چیزی راهی داره . kasper امکان inject کردن رو نمیده چون تمام API های مورد نیاز رو hook کرده و تا بخواهید کاری بکنید متوجه می شه . مگر اینکه نذارید یعنی API ها را از کنترلش خارج کنید . این کار با استفاده از SDT unhooking امکان پذیر می باشد . ولی خود unhooking هم معمولا با API ها انجام می گیره که اونها هم دست kasper هستند . تنها راه حل ممکن دستکاری آدرس ها بدون استفاده از API ها است و این کار هم فقط با دسترسی به دستورات cmos امکان پذیر است
سلام
با شما موافقم !
كسپر در اين زمينه فوق العاده هست !
ولي مثله اينكه نظارتي بر روي كد هاي اينجكت شده نداره !
فقط وقتي يه برنامه مي خواد اينجكت كنه ، به كاربر پيغامي مي ده كه برنامه ي مورد نظر شما در حاله اينجكت كردنه !
خوب من كسپر رو ديسيبل مي كنم! دوباره برنامه ي مورد نظرم رو كه كد اينجكت مي كنه اجرا مي كنم ! كار برنامه چيه :
اين برنامه كه ويروس ij.bat هست ، كدهايي رو به اكسپلورر اينجكت مي كنه ! بعد خودشو مي بنده . كدهايه اينجكتي هر چند ثانيه يك سري فايل رو كپي مي كنه ! (فكر كنم هر چند ثانيه استات اپه خودش رو هم بروز مي كرد).
همه ي اين كدها داخله پروسه ي اكسپلورر اجرا مي شند ! اينها از نظر هر انتي ويروسي مشكوك به نظر مي رسه ! پس چرا كسپر هيچ كاري نكرد ؟؟؟؟؟؟؟
از دوسته عزيز Fh_Prg هم ممنون كه اون نمونه سورس رو گذاشتن و راهنمايي كردن.
اما دوست عزيز اقايه Fh_Prg مي شه بگيد چرا هر كدي رو نمي شه درونه تابع RemoteThread گذاشت ؟
من برايه تست تابع Api اي رو درون همين تابع RemoteThread قرار دادم ولي برنامه با خطا روبرو شد !
تابع مورد نظر CopyFile بود.
از توابعي مثله FindWindow يا SendMessage هم نتونستم درش استفاده كنم
لطف مي كنيد كه به اين موضوع بپردازيد...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.