PDA

View Full Version : خواندن محتویات Ram



Asad.Safari
دوشنبه 15 اسفند 1384, 19:42 عصر
با سلام

من در دانشگاه یک پروژه با c دارم که باید محتویات ram رو از خونه اول تا آخر بخونم
و در آخر تو یه فایل txt اون رو تو یه آدرس ذخیره کنم!

من فکر کنم با اشاره گرها این امکان وجود داشته باشد!

اگر راه حلی برای این قضیه دارید ممنون میشم !


اگه کدی هم باشه که عالی میشه!

saeedIRHA
سه شنبه 16 اسفند 1384, 02:31 صبح
سلام دوست عزیز!
رو چه سیستم عامل میخواهی این کارو انجام بدین ؟!
چون range آدرس ها تو Linux و Windows متفاوت هستن!
و فک نمیکنم در محیط 32 بیت بتونین تمام Ram رو بخونین چون Protected Mode هست
و محدودیت دارین! فقط از 4 گیگ آدرس دهی شما اجازه دست رسی به 2 گیگ رو دارین!!!

Asad.Safari
سه شنبه 16 اسفند 1384, 19:20 عصر
در سیستم عامل windows2000 میخام این کار رو بکنم !
مهم نیست که چقدر رش رو بخونم !مهم اینه که پروژه رو تحویل بدم!


اگه راحلی داشتین ممنون میشم

saeedIRHA
دوشنبه 22 اسفند 1384, 05:16 صبح
سلام
دوست عزیز تا اونجا که من اطلاع دارم اینکارو فک نمیکنم تو Windows بتونی انجام بدی!
چون هر تابع در windows محدوده خاصی در Memory داره و windows اجازه دسترسی
به محدوده تابع دیگه رو به شما نمیده و اگر هم قصدی صورت بگیری Error:
"Access Violation" به شما خواهد داد!
تنها اجازه که windows به شما میده اینکه section .Text رو اونم فقط با دسترسی Read-Only بخونی.
حالا چطور میشه اینکارو فقط انجام داد خودم دارم تحقیق میکنم راجعبش.
اگر از ما زود تر به نتیجه رسیدی لطف کن و راه حل رو برای ما اینجا بزار
چون من هم خیلی دوست دارم بدونم چطور میشه اینکارو کرد.

Asad.Safari
دوشنبه 22 اسفند 1384, 17:01 عصر
من با استفاده از اشاره گر میتونم محتویات ram رو بخونم !
ولی نمی تونم آخرین خانه رو تعیین کنم


int *p;
int a,b;
p=(char *)0;
for(a=1;a<50;a++){
printf("%d=",a);
printf("%d\t",*p);
printf("\n");
p+=1;
}

saeedIRHA
دوشنبه 22 اسفند 1384, 19:01 عصر
دوست عزیز این کاری که شما انجام دادین خوندن Ram به حساب نمیاد!
با اینکار شما فقط خانه های حافظه رو مقدار دهی کردین و با استفاده از Pointer
آدرس خونه مورده نظر رو بدست اوردین!
در Ram خیلی چیز هایه دیگه منجمله DLL ها Load شدن که اگر بخوایم Ram رو درست بخونیم باید بتونیم
section .text تابع های که تو Ram هست رو بخونیم
که این کار هم به این راحتیا نیست!

Asad.Safari
سه شنبه 23 اسفند 1384, 15:52 عصر
به ما گفتن که محتویات هر خونه از ram رو بخونیم
و اونو پس از تیدیل به مبنای باینری , تو یه فایل ذخیره کنیم!
من هم این نتیجه رو با کد بالا میگیرم !
یا شاید اصلا اشتباه عمل میکنم
لطفا راهنمایی کنید!


با تشکر

saeedIRHA
چهارشنبه 24 اسفند 1384, 02:33 صبح
سلام
من نمیدونم دقیقاً استادتون ازتون چی خواسته اما:
اگر گفته که حافظه رو پر کنید و بعد محتویات Ram رو بخونین داری درست عمل میکنی!
اما اگر گفته نه Ram به صورت کامل بخونین و شما هم داری این کارو تحت Windows انجام میدنی
در این صورت این روش عملی نیست!

Asad.Safari
چهارشنبه 24 اسفند 1384, 23:34 عصر
اون به ما گفته که یه برنامه بنویسید که دونه به دونه خونه های ram رو بخونه !
و تو تو یه فایل ذخیره کنیم!
مگه من خودم خونه هاشو پر میکنم؟؟؟؟

لطفا راه حا ارایه بدبد! ممنون میشم!


با تشکر

pedram_keivani
پنج شنبه 25 اسفند 1384, 00:22 صبح
دوستان از طریق* void نمیشه این کارو انجام داد؟

saeedIRHA
جمعه 26 اسفند 1384, 10:48 صبح
بله شما با این کارت داری خونه های حافظه رو از 1 تا 50 مقدار دهی میکنی
و بعد با استفاده از pointer آدرس خونه های حافظه رو که با 1 تا 50 پر کردی بدست میاری!
من نمیدونم شما تا چه حد با C کار کردین که بتونم حدس بزنم منظور استادتون چی بوده.
ولی اگر بخوای محتویات Ram رو بخونی این کد کمکت میکنه بفهمید چطور میشه اینکارو کرد
و تو Ram چه چیز هایه دیگه هم هست.




int main()
{
int *ptr;
int i ;
int x = 0x0022FF4F;
char b[]="SAEED";

for(i=0;i <20;i++)
{
x++;
ptr =(int *)x ;
printf("Address of Pointer is : 0x%p \nWith Value : %c\n",ptr,*ptr);
}
}


ولی اگر خیلی وقت نیست با C کار میکنین مسلماً منظوره استادتون این کار نبوده
و همون روشی بوده که شما به کار بریدین یعنی پر کردن خونه های حافظه ،و بعد بدست اوردن
آدرس اونها،اگر هم میخواین در فایل ذخیره کنین بجای printf از fprintf استفاده کنین.
اگر سؤالی داشتید در خدمتم!
یک نکته هم حواست باشه, اگر از Windows XP SP2 استفاده نمیکنی 0x0022ff4f ممکنه
یک چیز دیگی باشه ولی اگر درست عمل کنه اولین چیزی که میبینی باید 'S' باشه!

siahacker
جمعه 26 اسفند 1384, 11:46 صبح
سلام
من این دو تا کد رو نوشتم البته اصل این کدها از آقای SaeedIRHA هستند
کد ادومی فکر می کنم بهتر جواب بده


#include <stdio.h>
int main()
{
int *ptr;
int i,x=1;
for(i=0;i<10;i++)
{

ptr=&x;
*ptr++;
printf("Address of Pointer is : 0x%p \n With Value : %c\n",ptr,*ptr);
}
return 0;
}

#include <stdio.h>
int main()
{
int *ptr;
int i,x=1;
for(i=0;i<10;i++)
{

ptr=&x;
printf("Address of Pointer is : 0x%p \n With Value : %c\n",x++,*ptr);
}
return 0;
}

saeedIRHA
جمعه 26 اسفند 1384, 12:32 عصر
مرسی دوست عزیز،اما مسئله که هست من میخواستم به این دوستمون نشون بدم که متغییر های
دیگه چطوری تو Ram قرار میگیرن،و نشون بدم که چیز های دیگی هم تو Ram هستن،
البته قبلاً هم گفتم،در Windows هر تابع قلمرو خاص خودشو داره و نمیتونه به قلمرو تابع دیگه
دسترسی داشته باشه اگر هم بتونه فقط به قسمت section .text میتونه اونم با دسترسی
Read-Only, هر تلاش دیگی پیغام "Access Violation" به شما خواهد داد،که بیشتر بحثش برمیگرده
به Assembly, در کدم هم مخصوصاً از Static Address استفاده کردم که تغییرش بدی و ببینی مثلاً
رو آدرس هایه دیگه چطوری کار میکنه!!!!!! مثلاً اگر بزاری 0x41414141 ببین چی میشه !
برنامه Crash میکنه!دلیلشم ارض کردم خدمتتون!
بازم اگر سؤالی داشتی خوشحال میشام بتونم کمک کنم!

siahacker
جمعه 26 اسفند 1384, 15:42 عصر
سلام
بله حرف شما درست است اگر بخواهیم با محتوای رم کار کنیم بهترین گزنه اسمبلی هست
اسمبلی تو سی و سی پلاس پلاس هم خیلی کاربرد داره

Asad.Safari
جمعه 26 اسفند 1384, 21:43 عصر
در این کدها چه طوری آخر حلقه رو با while معلوم کنم !
یعنی نا اونجا که میتونه بخونه بره و از for استفاده نکنیم!



خیلی ممنون!

siahacker
شنبه 27 اسفند 1384, 10:37 صبح
سلام
منظور شما دقیقا از این که بخونه و بره چیه؟


#include <stdio.h>
int main()
{
int *ptr;
int i,x=0x41414101;
while(x<0x41414138)
{
ptr=&x;
printf("Address of Pointer is : 0x%p \n With Value : %c\n",x++,*ptr);
}
return 0;
}

Asad.Safari
دوشنبه 29 اسفند 1384, 11:28 صبح
یعنی اینکه تا اونجا که protect mode نیست خونده بشه!



با تشکر

Asad.Safari
دوشنبه 29 اسفند 1384, 11:37 صبح
int i,x=0x41414101;
while(x<0x41414138)



من از برنامه شما سر در میارم جز دو این خط
0x41414101 این آدرسی که میدین به x یعنی چی و به
کجا اشاره میکنه ! و به این آدرس دادن چی میگن !



با تشکر

siahacker
دوشنبه 29 اسفند 1384, 14:02 عصر
سلام
این ها خانه های مربوط به رم هستند و x هم نشان دهنده ی یک آدرس است و برای این که شما بتوانید خونه های رم رو بخوندی باید با این نوع آدرس ها کار کنید

Asad.Safari
سه شنبه 01 فروردین 1385, 20:25 عصر
کل برنامه من این شده
و در کامپایل ارور میده!



#include<stdio.h>
#include<conio.h>
FILE *fp;
void main(){
void convert(int);
int *ptr;
int y,i,x=0x41414101;
fp=fopen("test.txt","w");
while(x<0x41414138)
{
ptr=&x;
convert(*ptr)
}
}

void convert(int decimal)
{
long int x=0,c=0,i=0;
int bi[8];
fp=fopen("test.txt","a");
while (decimal > 1)
{
bi[i]=(decimal%2);
i++;
c++;
decimal = decimal / 2;
bi[c]=1;
}
for(x=c;x>=0;x--){
fprintf(fp,"%p%d",bi[x]);
}
fprintf(fp,"\n");
fclose(fp);

}


با تشکر

saeedIRHA
سه شنبه 01 فروردین 1385, 23:14 عصر
سلام،
نه خیر دوست عزیز اینها خونه هایه Ram نیستن اینها Offset هستن!!!
من همین طور ی 0x41414141 رو Offset اش رو انتخاب کردم که هیچ اصولی نداره !
چون که این آدرس Valid نیست و باعث میشه که برنامه Crash کنه،
شما هم برایه برنامت پیشنهاد نمیکنم این کارو انجام بدی چون درست نیست،
Range آدرس ها در Windows از 0x00000000 هست تا 0x7FFFFFFF یعنی 4 GB که دقیقاً الان
حضور ذهن ندارم که از کجا تا کجاش رو میتونین بخونین که Access Violation نده،
ولی پیشنهاده من اینه که تو برنام تون از Exception استفاده کنین!
یعنی بیاین از Offset 0x00000000 شروع کنین به خوندن تا به Exception برسین ،
در این صورت درست عمل کردین ، چون یک نکتی هم که هست آدرس های هم تو windows
به صورت Randomaization هستن رو این حساب هیچ وقت نمیتونین آدرس شروع رو حدس بزنین،
به خاطره همین بهترین حالات همون طور هست که گفتم.

Asad.Safari
چهارشنبه 02 فروردین 1385, 14:15 عصر
این برنامه ای که تو صفحه قبل نوشتم
میتونید به این گونه که خودتون گفتین , اصلاح کنید
که کار کنه !!


تشکرات فراوان

saeedIRHA
پنج شنبه 03 فروردین 1385, 03:53 صبح
سلام دوست عزیز،
طبقه قوانین سایت من نباید این کارو بکنم،ولی راهنمایت میکم،
اگر بخوای برنامه ت رو با ++C بنویسی خیلی راحت میتونی از Exception استفاده کنی
ولی در C نمیدونم دقیق چطور میشه این کارو کرد ،رو این حساب بهترین کار اینه که بیی از آدرس
0x00FF2200 شروع کنی و تو یک Loop بی نهایت بزاری برنامتو و بگی که آدرس هارو 4 تا ،4تا اضافه
کنی و هر بار آدرس رو نمایش بدی،بعد ببینی برنامت رو کدام آدرس Crash کرد که اون آدرس رو آخرین
آدرس در نظر بگیری!
و بعد بیای از 0x00000000 تا اون آدرس که بدست اوردی بخونی Ram رو !

Asad.Safari
پنج شنبه 03 فروردین 1385, 14:40 عصر
با سلام

یعنی چی 4 تا 4 اضافه کنه ! یعنی چهار واحد یا چها رقم !
در مورد این carsh هم یه کم توضیح بدین!
اگه یه مثال بزنید ممنون میشم
اگه نتونید در سایت مطرح کنید لطفا به ایمیلم
asadkhatar[at]yahaoo.com
بفرستید

خیلی ممنون!

Inprise
جمعه 04 فروردین 1385, 17:03 عصر
بسیاری از مشکلات شماها به عدم وجود دانش مقدماتی کافی برمیگرده . برای برنامه نویسی روی یک پلت فرم نرم افزاری و سخت افزاری ، لازمه که در مورد مقدماتش اطلاعات داشته باشید .

برای پیاده سازی جواب سوال مورد نظرت ، روی ویندوز ، و روی یک ماشین اینتل ، باید نکات ابتدائی ذیل رو بدونی :

الف- ماشین در وضعیت Protected Mode کار میکنه . یعنی هر برنامه دارای چهار گیگابایت فضای آدرسی ( فیزیکی + مجازی ) اختصاصی است و به فضای ادرسی سایر برنامه ها دسترسی نداره

ب- در این فضای چهارگیگی ، تا وقتی برنامه در وضعیت User Mode باشه ( یعنی درایور یا کرنل ماژول نباشه ) فقط به دو گیگا بایت دسترسی داره .

ج- این دو گیگابایت در اختیار مدیر حافظه مجازی سیستم عامل است . بخشی از این فضای ادرسی روی حافظه فیزیکی ( RAM ها ) و بخش عمده اش روی حافظه مجازی ( معمولا" : دیسک های سخت موجود ) قرار داره . یک برنامهء عادی ، در سطح کاربر ، امکان تشخیص فیزیکی یا مجازی بودن یک آفست حافظه رو نداره ؛ در واقع مکان ثابتی هم برای هر ادرس وجود نداره و با تغییر وضعیت سیستم مکان ها دائما" در حال تغییر هستند .

د- برای اگر صورت مسئله واقعا" این باشه که "محتویات Ram " ( یعنی فقط حافظه فیزیکی ) در زمان ثابت t در محلی ذخیره بشه ، این عمل توسط یک برنامه عادی امکان پذیر نیست ، بلکه باید کرنل ماژولی نوشته بشه که با دسترسی مستقیم به تمام حافظه فیزکی سیستم ، یک Dump از اون رو در محلی ذخیره کنه .

ه- در ادامه نکات ابتدائی و بدیهی مذکور باید به این نکته توجه بشه که برنامه های سطح کاربر ، بصورت مستقیم به حافظه ، و سایر اجزاء سخت افزاری سیستم دسترسی ندارند ، و نخواهند داشت . تمامی آدرس ها مجازی هستند و چیزی پائین تر از API ویندوز برای دسترسی به اجزاء سیستم موجود نیست .

موفق باشید

saeedIRHA
جمعه 04 فروردین 1385, 17:23 عصر
دیگه کامل تر از این نمیشد!

Asad.Safari
جمعه 04 فروردین 1385, 21:16 عصر
راه چاره ما چیه؟؟؟

آیا این برنامه نوشتنش ممکن نیست!!!
بابا خیلی ضروریه!!


با تشکر

Inprise
جمعه 11 فروردین 1385, 02:48 صبح
کنار سوال کردن سعی کن کمی جوابهائی که بهت داده میشه رو بخونی . ضرر نداره !
راه حل معقول اینه که یک درایور بنویسی . ویندوزهای 2000 و اکس پی ، دسترسی محدود و مشروط به حافظه فیزیکی رو از طریق رابط PhysicalMemory فراهم میکنند که نیاز به مجوز Administrator داره و من موفق نشدم ازش روی 2003 سرویس پک یک استفاده کنم . روی اکس پی سرویس پک دو هم پیامهای خطائی داده میشه که نشون میده تمام حافظه دامپ نشده ؛ ولی بهر حال چون نوشتن درایور حتی برای برنامه نویسان با تجربه کار دشوار و زمان بریه میتونی همین رو به عنوان یک راه حل موقتی و فوری تجربه کنی . نسخهء ویندوزی dd رو بگیری و از این دستور استفاده کن :



dd if=\\.\Device\PhysicalMemory of=memory.bin

و اگر یحیانا" جواب نگرفتی از این :

dd if=\\.\PhysicalMemory of=memory.bin

به پیامهای خطائی که دریافت میکنی توجه نکن . خروجی هر چه که بود بهترین خروجی هست که میتونه وجود داشته باشه . لازمه در تاکیدی به پست قبلیم تذکر بدم که مفهوم "رم" اغلب به حافظه فیزیکی سیستم اطلاق میشه ، در حالیکه حافظه موجود و مورد استفاده سیستم به حافظه فیزیکی محدود نیست ؛ به عبارت ساده تر تمام محتویات "حافظه" سیستم در لحظهء t تمام آن چیزی نیست که روی "حافظه فیزیکی" یا "رم" موجوده .

Asad.Safari
جمعه 11 فروردین 1385, 10:07 صبح
با سلام

من تمام اون پست های شمت رو درباره "خوندن رم"

چند بار خوندم !!

لطفا در مورد استفاده از این ها که خودتون اشاره کردین
یه توضیحی یا مثالی بزنید

dd if=\\.\Device\PhysicalMemory of=memory.bin

و اگر یحیانا" جواب نگرفتی از این :

dd if=\\.\PhysicalMemory of=memory.bin


با تشکر

Inprise
جمعه 11 فروردین 1385, 17:32 عصر
دو جواب قبلی حاوی توضیح بودند و جواب قبلی حاوی مثال . مرحله بعدی اینه که آدرس پستی ام رو از من بگیری و پی سی ات رو برام بفرستی تا برات ویندوز نصب کنم و برنامه مزبور رو دانلود کنم و اجراش کنم و فایل خروجی اش رو برات رایت کنم و به همراه پی سی بهت برگردونم که تحویل استادتون بدی . اگر احیانا نمره مناسبی نداد میتونم بهش زنگ بزنم و باهاش صحبت کنم . اگر کمک دیگری هم از دستم بر میاد تعارف نکن .

Asad.Safari
جمعه 11 فروردین 1385, 20:19 عصر
دو جواب قبلی حاوی توضیح بودند و جواب قبلی حاوی مثال . مرحله بعدی اینه که آدرس پستی ام رو از من بگیری و پی سی ات رو برام بفرستی تا برات ویندوز نصب کنم و برنامه مزبور رو دانلود کنم و اجراش کنم و فایل خروجی اش رو برات رایت کنم و به همراه پی سی بهت برگردونم که تحویل استادتون بدی . اگر احیانا نمره مناسبی نداد میتونم بهش زنگ بزنم و باهاش صحبت کنم . اگر کمک دیگری هم از دستم بر میاد تعارف نکن .

آقای اینپرایس اگه این کار رو بکنید که شرمندمون میکنید !!


من این کد رو نوشتم و جوابم میگرم !
ببینید که آیا درست عمل میکنم !



void main()
{
FILE *fp;
long *ptr;
int i,e ;
long x = 0x00000000;
clrscr();
fp=fopen("test.txt","w");
for(;;)
{
x++;
ptr =(long *)x ;
fprintf(fp,"Address of Pointer is : 0x%p \nWith Value : %c\n",ptr,*ptr);
}





تقریبا تا آدرس 0xFFF5 میره !

با تشکر