فرمان Strings در لینوکس
یک ابزار ساده اما کاربردی برای جستجوی متن در فایلهای باینری
در مواقع مختلف همه ما نیاز داریم تا یک کلمه یا عبارت خاص را در یک فایل متنی پیدا کنیم و با ابزارهای مختلفی که در این زمینه وجود دارد این کار به راحتی قابل انجام است. اما اگر متن مورد نظر ما برای جستجو در یک فایل باینری باشد چه باید کرد؟ اگر چه انجام چنین کاری معمولا به ندرت اتفاق می‌افتد، اما اگر قبلا چنین کاری را انجام نداده باشید انجام آن برای شما چندان راحت نخواهد بود. اما جای نگرانی نیست، ابزاری برای این کار وجود دارد که این کار را بسیار راحتتر می‌کند.

ابزارهای بسیار زیادی برای جستجو، تجزیه و تحلیل و دستکاری فایل‌های متنی در لینوکس وجود دارد که از آن جمله می‌توان به خانواده grep (egrep, fgrep, mgrep و غیره) و awk, sed, tr, sort و خیلی‌های دیگر اشاره کرد. اما همه اینها برای فایل‌های متنی در نظر گرفته شده‌اند.

آیا تابحال سعی کرده‌اید چنین کاری را از طریق چیزی شبیه به cat در یک فایل باینری انجام دهید؟ چنین کاری نتیجه‌ای که مورد نظر شما است را به همراه نخواهد داشت و نتیجه کار یک صفحه ترمینال بهم ریخته با کاراکترهای نامفهوم را به همراه خواهد داشت. برای این که چنین چیزی را امتحان کنید یک صفحه ترمینال را باز کنید و فرمان زير را در آن اجرا کنید:

cat `which cat`

توجه: در اینجا ما با اجرای which cat خروجی را به عنوان یک آرگمان به cat ارسال کردیم. فرمان which به ما کمک می‌کند تا متغیر محیطی $PATH را در فایل باینری پیدا کنیم که در این مثال cat است.

همانگونه که مشاهده می‌کنید ترمینال نتیجه مطلوبی در خروجی خود نخواهد داشت. این کاملا عادی است و دور از انتظار نیست. اگر ترمینال شما رفتار عجیبی از خود نشان می‌دهد آن را ببندید و دوباره آن را باز کنید تا به وضعیت عادی قبل بازگردد.

حالا ما سعی می‌کنیم از برنامه strings استفاده کنیم. در حالت کلی این فرمان به جز فایلی که می‌خواهید برای متن بررسی کنید به پارامتر یا آرگمان خاص دیگری نیاز ندارد.

strings `which cat`

یک بار دیگر این را با cat به عنوان فایل ورودی امتحان کنید، در اینجا بلافاصله تغییر را مشاهده خواهید کرد. برنامه strings هر چیزی غیر از متن را نادیده می‌گیرد. در این بین ممکن است بعضی از بیت‌ها نیز در خروجی مشاهده شود و این به دلیل آن است که دستورالعمل‌های باینری می‌تواند به طور تصادفی با متن یکسان باشد، اما چنین اتفاقی معمولا در نتیجه کار مشکل خاصی ایجاد  نمی‌کند.

نکته قابل توجه اینجا است که ما می‌توانیم از این فرمان در ترکیب با grep استفاده کنیم تا متن مورد نظر خود را بسیار کارآمدتر پیدا کنیم:

strings `which cat` | grep license

برای توصیف توانایی این برنامه اجازه دهید مثال جالب‌تری را امتحان کنیم. ما قصد داریم اطلاعاتی را از UEFI/BIOS کامپیوتر شما استخراج کنیم. برای انجام چنین ترفندی شما باید لینوکس را روی کامپیوتری که به ویندوز 8 یا بالاتر مجهز است اجرا کنید. ما قصد داریم این اطلاعات را مستقیما از میان افزار مادربورد شما استخراج کنیم:

sudo strings /sys/firmware/acpi/tables/MSDM | tail -1

با اجرای این فرمان از نتیجه به دست آمده متعجب خواهید شد.

برچسب: