ورود

View Full Version : مقدار حافظه ی اشغال شده توسط برنامه ی من !!!



ali_mohamadi8928
یک شنبه 05 اسفند 1386, 16:39 عصر
با سلام .....

من چه جوری باید در برنامم مقدار حافظه ای که خود برنامم از RAM اشغال کرده رو بدست بیارم ؟؟؟

من فرمان خاصی برای این کار پیدا نکردم ... لطفا دوستان راهنمایی کنن ...

با تشکر ....

vcldeveloper
یک شنبه 05 اسفند 1386, 16:46 عصر
uses PsAPI;

//Get memory status of the selected process.
function GetProcMemInfo(ProcID: Cardinal): TProcessMemoryCounters;
var
hProcess : THandle;
begin
//if not Windows 2000 or higher, exit. PsAPI functions are not avialable on
//Win9x systems.
if Lo(GetVersion) < 5 then
Exit;
//Get a handle of the selected process by its ID.
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION,False,ProcID );
if hProcess <= 0 then
RaiseLastOSError;
try
//Retrieve the process memory information.
Win32Check(GetProcessMemoryInfo(hProcess,@Result,S izeOf(Result)));
finally
CloseHandle(hProcess);
end;
end;


فراخوانی:


var
MemInfo : TProcessMemoryCounters;
begin
MemInfo := GetProcMemInfo(GetCurrentProcessID);
end;

ali_mohamadi8928
یک شنبه 05 اسفند 1386, 17:23 عصر
خیلی ممنونم اقا علی ...

مقدار بازگشتی که در MemInfo ذخیره میشه چندین تا هستش .... برای مثال MemInfo.PagefileUsage . ولی من باید از کدوم استفاده کنم ؟؟؟ تغریبا همهرو تست کردم ولی هیچ کدوم اونی که توی Task Manager نشون میده رو بهم بازنگردوندن ....

راستی یک همفکری هم ازتون میخوام در این زمینه .... یک سری از نرم افزارها هستن که با استفاده از WriteProcessMemory یک سری مقادیری رو توی حافظه ی برنامه ی ما میریزن که با استفاده از اونا از برنامه ی ما سوء استفاده میکنن ... حالا به نظرتون چه جوری باید بفهمم که ایا برنامه ای در حافظه ی برنامه ی من چیزی رو ریخته یا نه ؟؟؟ فکر نکنم با استفاده از اون تابع ای که شما دادین بشه همچین کاری رو کرد درسته ؟؟؟؟

vcldeveloper
یک شنبه 05 اسفند 1386, 17:43 عصر
مقدار بازگشتی که در MemInfo ذخیره میشه چندین تا هستش .... برای مثال MemInfo.PagefileUsage . ولی من باید از کدوم استفاده کنم ؟

PageFaultCount Number of page faults.
PeakWorkingSetSize Peak working set size, in bytes.
WorkingSetSize Current working set size, in bytes.
QuotaPeakPagedPoolUsage Peak paged pool usage, in bytes.
QuotaPagedPoolUsage Current paged pool usage, in bytes.
QuotaPeakNonPagedPoolUsage Peak nonpaged pool usage, in bytes.
QuotaNonPagedPoolUsage Current nonpaged pool usage, in bytes.
PagefileUsage Current space allocated for the pagefile, in bytes. Those pages may or
may not be in memory.
PeakPagefileUsage Peak space allocated for the pagefile, in bytes.
یک سری از نرم افزارها هستن که با استفاده از WriteProcessMemory یک سری مقادیری رو توی حافظه ی برنامه ی ما میریزن که با استفاده از اونا از برنامه ی ما سوء استفاده میکنن ... حالا به نظرتون چه جوری باید بفهمم که ایا برنامه ای در حافظه ی برنامه ی من چیزی رو ریخته یا نه ؟این سوال را در بخش امنیت نرم افزار مطرح کنید.


فکر نکنم با استفاده از اون تابع ای که شما دادین بشه همچین کاری رو کرد درسته ؟اون کد فقط مقدار حافظه مصرفی رو بر میگردونه، نه چیز دیگه.

ali_mohamadi8928
یک شنبه 05 اسفند 1386, 20:33 عصر
ایا این حرف درست نیست که با اجرای هر برنامه کدهای اون برنامه به حافظه ی RAM هدایت میشن ؟ خوب این کدها که مربوط به برنامه ی ما میشن باید همیشه یک حجم ثابت داشته باشن وقتی میرن توی حافظه درسته ( البته برای هر برنامه بستگی به کدهایی داره که برنامه نویس براش نوشته ) ؟ مثلا ممکنه برنامه ی من حجم کدهاش که باید بره توی حافظه 100 کیلوبایت باشه و برنامه ی شما 50 کیلوبایت و ...... خلاصه هر بار این برنامه های ما اجرا شدن باید به همون حجم کدهاشون رو بریزن توی حافظه درسته ؟ یعنی به نظر شما ممکن در هر بار اجرا حجم کدهای ریخته شده توی حافظه توسط برنامه ی ما متفاوت با دفعه ی قبل باشه ؟؟؟

خوب من میخوام حجم کد برنامم رو که توی حافظه هستش بدست بیارم . ( خیلی برام اهمیت داره این کار ) تمامی سایت ها رو جست جو کردم .... در تمامی موتورهای جست جو کلمات کلیدی مربوطه رو نوشتم ولی کدی پیدا نکردم که به کارم بیاد ... از اولش هم که این تاپیک رو ایجاد کردم منظورم همین بود ..... ( اون کدی که اقا علی دادن یک مقدار رو بر میگردونه که هر ثانیه ممکنه تغییر کنه . من فکر نمیکنم که کدها ی مربوط به برنامه ی ما که ریخته میشه توی حافظه هر ثانیه حجمش تغییر کنه درسته ؟؟؟ باید از اول تا اخر اجرای یک برنامه یک مقدار ثابت باشه درسته ؟؟؟)

لطفا دوستان کمک کنن .... !!! ؟؟؟؟

با تشکر .....

Inprise
یک شنبه 05 اسفند 1386, 20:38 عصر
یعنی به نظر شما ممکن در هر بار اجرا حجم کدهای ریخته شده توی حافظه توسط برنامه ی ما متفاوت با دفعه ی قبل باشه ؟؟؟

بله . در واقع در اغلب موارد همینطور هست .
هر برنامه روی ویندوز یک فضای آدرسی مختص به خودش داره . داخل این فضا ، فقط متن برنامه نویس ، هیپ ها و استک ها ، و توابع کتابخانه ای که از اونها استفاده شده ، و سایر روتینهائی که به فضای برنامه وارد میشن - مثل کدهای فایروال شخصی و آنتی ویروس و ... - هم وجود دارن . هیچ ضمانتی برای نحوه چینش این قطعات در حافظه در هر زمان اجرا نیست . ضمن توجه به این مسئله ، بحث Alignment آفست ها هم مطرح هست . اینها باعث میشن که میزان فضای اختصاص یافته به کد ، و داده در هر نوبت اجرا لزوما یکسان نباشه . شاید بهتر باشه توضیح بدی دنبال چی هستی تا راهنمائی بهتری بشه

ali_mohamadi8928
یک شنبه 05 اسفند 1386, 20:48 عصر
اقا به زبان ساده ... من میخوام کسی نتونه به برنامم تزریق کد بکنه و تا این کار رو کرد برنامم متوجه بشه ....

مهدی کرامتی
یک شنبه 05 اسفند 1386, 21:01 عصر
یک سری از ابزارهای تجاری تامین امنیت برنامه ها مانند ASProtect ، Themida و ... روتین هایی دارند که بکمک اونها میشه CRC بخش های حساس کد رو کنترل کرد. روش کارشون هم تا جایی که میدونم اینه که CRC بخش مورد نظر از کد در RAM را با CRC معادل در Disk Image مقایسه میکنند و به این ترتیب امکان تشخیص Injection رو به شما میدن. مثالهای این مورد رو هم میتونی تو Sample های همون نرم افزارها مشاهده کنی.

ali_mohamadi8928
دوشنبه 06 اسفند 1386, 06:23 صبح
ایا راهی وجود نداره که ما محتویاتی که برناممون ریخته توی RAM رو هر چند وقت یکبار استخراج کنیم و خودمون عملیات مقایسه رو انجام بدیم ؟؟؟ ( فکر نکنم استخراجش غیر ممکن باشه درسته ) ... اگه دوستان راهی برای استخراجش میدونن لطفا کمک کنن ...

با تشکر ...

مهدی کرامتی
دوشنبه 06 اسفند 1386, 11:18 صبح
ممکنه، ولی بس دشوار و پیچیده است...

Inprise
دوشنبه 06 اسفند 1386, 23:16 عصر
اقا به زبان ساده ... من میخوام کسی نتونه به برنامم تزریق کد بکنه و تا این کار رو کرد برنامم متوجه بشه ....

اینکار رو توسط برنامه اصلی نمیتونی انجام بدی . اما میتونی برنامه/برنامه های جانبی ای بنویسی که روشهای تزریق کد رو زیر نظر بگیرن و در صورت وقوع عملیاتی رو انجام بدن . مثلا میتونی یک برنامه جانبی بنویسی CreateRemoteThread رو هوک کنه که اگر کسی با استفاده از یکی از دو ترفندی که نهایتا از این روتین استفاده میکنن کدی رو به برنامه تو تزریق کرد بفهمی . اضافه بر این ، میتونی برای همه روتینهائی که به نحوی در تزریق کد دخیل هستن Detour Hook بنویسی ، و فقط به برنامه های خاصی اجازه فراخوانی اون روتینها رو بدی . البته این روش فقط در مقابل حمله های سطح کاربر مفید هست ، و همین ، حداکثر کاریه که با دلفی میتونی انجام بدی .

ali_mohamadi8928
دوشنبه 06 اسفند 1386, 23:39 عصر
با سلام ... ممنون از راهنمایی هایی که کردین ...

من یک توضیح در مورد CRC میخوام .... اصلا چی هست و بدرد چی میخوره ؟؟؟

من اگه بخوام مقادیری که برنامم میریزه توی حافظه رو از حافظه استخراج کنم و توی یک Stream ذخیره کنم باید چه جوری این کار رو بکنم ؟؟ لطفا اگه کدی در این زمینه میتونید در اختیار بزارید کوتاهی نکنید .... واقعا ممنونم از همراهی صمیمانه ی شما دوستان عزیز ...

Inprise
دوشنبه 06 اسفند 1386, 23:49 عصر
CRC‌ رو از گوگل بپرس. "مقادیری که برنامه ات در حافظه میریزه" رو من نمیفهمم . یک برنامه ، معمولا ، در حافظه ، تشکیل میشه از :

- قسمتی برای توابع و روتینهای سیستم عامل که استفاده شدن ، که یا در اون قسمت قرار میگیرن یا قبلا جای دیگری فراخوانی شدن و فقط آدرسشون مپ میشه
- داده ها ، مثل متغیرها و منابع و ... که در فضاهائی بنام هیپ و استک قرار دارن
- متن باینری برنامه

سیستم عامل همه اینها رو وارد حافظه میکنه و بعد روند اجرای برنامه شروع میشه . حالا مشکل و مسئله تو چیه ؟ چرا میخوای کسی کدی رو به برنامه ات تزریق نکنه ؟ که چه اتفاقی نیفته که بدون تزریق کد نمیتونه بیفته ؟

ali_mohamadi8928
سه شنبه 07 اسفند 1386, 11:41 صبح
- قسمتی برای توابع و روتینهای سیستم عامل که استفاده شدن ، که یا در اون قسمت قرار میگیرن یا قبلا جای دیگری فراخوانی شدن و فقط آدرسشون مپ میشه
- داده ها ، مثل متغیرها و منابع و ... که در فضاهائی بنام هیپ و استک قرار دارن
- متن باینری برنامه

خوب منم حرفم همینه دیگه .... من فقط متن باینری برنامم که میره توی Ram رو میخوام هر چند وقت یکبار بکشمش توی یک Stream و .... من فقط دنبال یک کد هستم که این کار رو بکنه برام ...

Inprise
سه شنبه 07 اسفند 1386, 21:34 عصر
یک ریسمان جدا بنویس که کل فضای آدرسی برنامه ات رو بگرده و هر کدام از Page ها که مجوزشون Executable هم هست رو برات بنویسه در استریم مورد نظرت . یک برنامه میتونه چند سکشن با مجوز اجرائی داشته باشه ، یا به دلائل مختلفی ، برخی از کدها از استک یا هیپ اجرا بشن و اندازه و محل این کدها متغیر هست . در یک حالت فرضی غیر فنی ، قیاس دائمی متن روی حافظه هیچ ارتباطی به سوال قبلی ات نداره ، چون تزریق کد در حافظه توسط پروسه های غریبه داخل متن اصلی برنامه ات قرار نمیگیره !

ali_mohamadi8928
سه شنبه 07 اسفند 1386, 23:24 عصر
نمیدونم چی بگم والا .... انگاری تشخیص تزرق کد یه جورایی غیر ممکن هستش ... بهترین راه اینه که ایده ی خودم رو تغییر بدم .... اگه از راه Hook هم بخوام وارد بشم خیلی از توابع رو باید زیر نظر داشته باشم که بازم خیلی مشکل هستش .... پس نتیجه این میشهکه اصلا باید بیخیالش شد درسته ؟؟؟

Inprise
چهارشنبه 08 اسفند 1386, 09:04 صبح
میتونی بیخیالش بشی . میتونی هم یاد بگیری که اگر از کسی کمکی خواستی و سوالی ازت کرد به اون سوالات به دقت جواب بدی . منفعتش عاید خودت میشه .

ICEMAN
چهارشنبه 08 اسفند 1386, 10:29 صبح
یک سری از ابزارهای تجاری تامین امنیت برنامه ها مانند ASProtect ، Themida و ... روتین هایی دارند که بکمک اونها میشه CRC بخش های حساس کد رو کنترل کرد. روش کارشون هم تا جایی که میدونم اینه که CRC بخش مورد نظر از کد در RAM را با CRC معادل در Disk Image مقایسه میکنند و به این ترتیب امکان تشخیص Injection رو به شما میدن. مثالهای این مورد رو هم میتونی تو Sample های همون نرم افزارها مشاهده کنی.
منظورتون از بخشهای مهم کجاهاست


ایا راهی وجود نداره که ما محتویاتی که برناممون ریخته توی RAM رو هر چند وقت یکبار استخراج کنیم و خودمون عملیات مقایسه رو انجام بدیم ؟؟؟ ( فکر نکنم استخراجش غیر ممکن باشه درسته ) ... اگه دوستان راهی برای استخراجش میدونن لطفا کمک کنن ...
با تشکر ...
مگه استخراج برنامه از RAM چیزی جز Dump کردن هست ؟؟!!!!


یک ریسمان جدا بنویس که کل فضای آدرسی برنامه ات رو بگرده و هر کدام از Page ها که مجوزشون Executable هم هست رو برات بنویسه در استریم مورد نظرت . یک برنامه میتونه چند سکشن با مجوز اجرائی داشته باشه ، یا به دلائل مختلفی ، برخی از کدها از استک یا هیپ اجرا بشن و اندازه و محل این کدها متغیر هست . در یک حالت فرضی غیر فنی ، قیاس دائمی متن روی حافظه هیچ ارتباطی به سوال قبلی ات نداره ، چون تزریق کد در حافظه توسط پروسه های غریبه داخل متن اصلی برنامه ات قرار نمیگیره !
میشه در مورد Page ها و مجوزهای اجرایی بیشتر توضیح بدید متوجه منظورتون نشدم همین طور detour hook ؟؟!
این لینک بحث مشابه یی هست با عنوان Stop Dll Injection

مهدی کرامتی
چهارشنبه 08 اسفند 1386, 11:19 صبح
منظورتون از بخشهای مهم کجاهاست
اون بخشهایی که شما توسط tag هایی که خود این ابزارهای به شما میدن علامت گذاری میکنید.

ali_mohamadi8928
چهارشنبه 08 اسفند 1386, 13:04 عصر
مگه استخراج برنامه از RAM چیزی جز Dump کردن هست ؟؟!!!!

خوب همین Dump رو چه جوری باید انجام داد ؟؟ من دارم خودم رو میکشم تا به دوستان بفهمونم منظورم رو ولی همش به بیراهه کشیده میشد .... من منظور اصلیم همونی هست که شما گفتین .... خوب این کار رو چه جوری بکنم ؟؟؟ اگه میشه یک اموزش بدید در این رابطه ...

با تشکر ...

مهدی کرامتی
چهارشنبه 08 اسفند 1386, 14:58 عصر
منظور ایشان انجام Dump با استفاده از ابزاری غیر از سورس کد است، چیزی مثل OllyDBG

ali_mohamadi8928
چهارشنبه 08 اسفند 1386, 18:16 عصر
اقای DelphiAssistant من خیلی در این رابطه کنجکاو شدم و اطمینان دارم بقیه ی دوستان هم همین احساس رو دارن !!! ایا میشه یکی از دوستان چگونگی DUMP کردن رو با همون نرم افزاری که گفتین توضیح بدن ؟؟؟ خیلی مایلم بیشتر راجع بهش بدونم و یکبار این کار رو تجربه کنم ... اخه به خیلی از سوالاتم در رابطه با چکونگی رفتن برنامه به حفظه و ... جواب میده اینکار و میتونم با فکر بازتری روی مشکلم تمرکز کنم ... ...

خیلی ممنون میشم اگه یکی چگونگی انجام این کار رو با مثال توضیح بده .... با تشکر فراوان خدمت دوستای مهربون ....

ICEMAN
چهارشنبه 08 اسفند 1386, 18:32 عصر
سلام ...
اول Olly رو از آدرس زیر download کن
http://ollydbg.de/odbg110.zip
وقتی فایل اجرایی برنامه رو توش باز کنی توی پنجره CPU قسمت پایین DUMP حافظه رو بهت نشون میده .
میتونی توش Search کنی و ... نرم افزار های Debugger و Disassembler های زیادی هست که این کار و میکنه ولی من با دلفی توی این زمینه ها کار نکردم ولی با C/C++ و ASM کدش رو دارم اگه فک میکنی بدردت میخوره بگو برات بذارم
البته اگه تو بخش خودش در موردش بپرسی شاید بهتر باشه

ali_mohamadi8928
چهارشنبه 08 اسفند 1386, 22:18 عصر
اگه کدش را با C++ بزاری شاید تونستم ترجمش کنم به دلفی که مربوط به این بحث هم بشه ...

ICEMAN
پنج شنبه 09 اسفند 1386, 11:11 صبح
اینم کدی که گفتم تحت Visual C++ هست
توی www.planetsourcecode.com رو هم بگردی 100% پیدا میکنی

موفق باشی