حافظهی هر پراسس روی لینوکس یه فایله
خلاصهٔ کاملتر
فلسفهی معروف یونیکس میگه «همهچیز یه فایله»، ولی در عمل خیلی از کارهای سیستمعامل اصلاً با فایل انجام نمیشن. روی لینوکس یه شبهفایلسیستم به اسم /proc هست که متادیتای پراسسها رو نشون میده، ولی بیشترش فقطخواندنیه و چیز هیجانانگیزی نداره — همون چیزایی که توی خروجی ps یا top میبینی.
اما یه فایل مرموز توی /proc//mem هست که اگه مستقیم بخونیش خطای I/O میده. ترفندش اینه که اول با lseek بری سراغ آفستی که میخوای، بعد read یا write کنی؛ یا از pread/pwrite استفاده کنی که آفست رو همونجا میگیرن. اونوقت میتونی حافظهی برنامهی هدف رو همون لحظه بخونی یا عوض کنی.
نویسنده یه نمونهی بامزه میزنه: برنامهای که روی حافظهی خودش جراحی میکنه و مقدار یه متغیر رو از طریق همین فایل تغییر میده:
int mem_fd = open("/proc/self/mem", O_RDWR);
if (mem_fd < 0) return 0;
/* Write '123' at the file offset associated with my_val. */
pwrite(mem_fd, &(int){123}, sizeof(int), (off_t)&my_val);
printf("my_val = %d\n", my_val);قشنگی این API توی سادگیشه. رابط استاندارد دیباگ یونیکس یعنی ptrace با متدهای PTRACE_PEEKDATA و PTRACE_POKEDATA همین کارو میکنه، ولی خیلی دستوپاگیر و عجیبه؛ در مقابل، /proc//mem تمیز و سرراسته.
نویسنده توی سال ۲۰۰۲ یه ابزار به اسم memfetch نوشته بود که یه «اسکرینشات» غیرمخرب از حافظهی هر پراسس میگیره — برای کنجکاوی، دور زدن قابلیتهای ضددیباگ، یا نجات داده از یه برنامهی هنگکرده. حالا کدشو برای سیستمهای ۶۴ بیتی بازنویسی کرده تا دوباره کار کنه.
نکات کلیدی:
- روی لینوکس /proc//mem بهت اجازه میده حافظهی زندهی هر پراسس رو بخونی و بنویسی.
- باید اول با lseek آفست رو ست کنی یا از pread/pwrite استفاده کنی، چون خوندن مستقیم خطا میده.
- نسبت به ptrace خیلی سادهتر و تمیزتره.
- ابزار memfetch با همین روش از حافظهی برنامهها بکاپ میگیره.




