سلام دوستان
چطوری میشه در c محتویات ادرس یک بایت از حافظه رو چاپ کرد برای مثال
ادرس 00421130 محتویاتش رو چاپ کرد- که حالا یک کاراکتر یا عدد و یا
هر چیزی باشه....
اینکار رو میخوام در c انجام بدم ...
میتتونی اون آدرسو بریزی توی یک متغیر(باید اشاره گر باشه) و بعد با استفاده از عملگر * محتویاتشو بخونی
مثل:
int *xptr;
xptr=0x00421130;
cout<<*xptr; ;k
اونوقت اين روش فقط ميتونه حافظه خود برنامه رو بخونه ديگه؟
براي خوندن حافظه رم فكر كنم بايد از توابع API استفاده كرد.
توی بعضی از سیستمها مقادیر اشاره گر به صورت اعدادصحیح مبنای 16 و در بعضی دیگشون بصورت اعداد صحیح مبنای 10 هست.یه راه ساده برای اینکه ببینین سیستتم شما چطوریه:
int x;
int * xptr;
xptr=&x;
cout<<"the value of xptr:"<<xptr;
یا ساده تر از اون:
int x;
cout<<"the address of x:"<<&x;
اینطوری میتونین توی خروجی شکل ذخیره را ببینین.
نقل قول: اونوقت اين روش فقط ميتونه حافظه خود برنامه رو بخونه ديگه؟
فکر نمیکنم فقط برای حافظه ی خود برنامه باشه...
(۰۱-دى-۱۳۸۷, ۰۹:۲۷:۱۶)mahbooob نوشته است: [ -> ]اونوقت اين روش فقط ميتونه حافظه خود برنامه رو بخونه ديگه؟
فکر نمیکنم فقط برای حافظه ی خود برنامه باشه...
[/quote]
اين روش فقط ميتونه حافظه خود برنامه رو بخونه
براي خوندن حافظه رم بايد از توابع API استفاده كردمثل ReadProcessMemory
البته این قضیه همچین به این راحتی ها هم نیست یعنی ویندوز چنین اجازه ای به برنامه نویس نمیده تا راحت هر آدرسی رو خواست با اشاره گر ها بخونه
هر پروسه اصطلاحا یک Virtual Address Space داره که به قسمت های کوچیکی به نام page تقسیم شده که این page ها دسترسی های متفاوتی دارن
و همیجوری نمیشه آدرس رو ریخت تو اشاره گر و خوندش، و حتی خیلی از بازه های آدرسی فقط به صورت مجازی موجودن و در واقع ممکنه اصلا چنین آدرسی نباشه
بهتره یه جستجویی در مورد Windows Memory Management بکنین
کد:
http://msdn.microsoft.com/en-us/library/aa366779(VS.85).aspx
و عمکرد این توابع رو ببینیند
VirtualQuery
VirtualQueryEx
ReadProcessMemory