متغیرها
در پوسته، پیش از استفاده از متغیرها، آنها را
تعریف نمیکنیم. بلکه، با استفاده از آنها، در لحظه ایجادشان میکنیم
(یعنی وقتی که یک مقداری به متغیر پاس میدهیم.) بهطور پیشفرض، تمام
متغیرها بهصورت رشتهای (String) ذخیره میشوند حتی اگر اعدادی را به
آنها بدهیم. پوسته و برخی از نرمافزارهای داخلیاش رشتههای عددی را سر
موقع عملیات ریاضی، به اعداد تبدیل میکنند. لینوکس به کوچکی و بزرگی حروف
حساس است، بنابراینAli باali فرق دارد و جفتشان باALI متفاوتند. معمولا
در برنامهنویسی لینوکس از حروف کوچک برای نامگذاری متغیرها استفاده
میکنند.
در پوسته برای دسترسی به محتویات متغیر نام آن را بعد
از علامت $ میآوریم. (یا $ را پیش از نام آن متغیر میآوریم. هر کدام را
راحتترید به خاطر بسپارید) هروقت محتویات یک متغیر را خواستید، بایستی
این $ را قبل از اسمش بیاورید. اگر بخواهید مقداری به متغیر بدهید، فقط
نامش را بیاورید، که اگر لازم باشد بهصورت دینامیک ایجاد خواهد شد. یکی
از سادهترین راهها برای نمایش محتویات متغیر، استفاده از echo در
ترمینال و بعد آوردن نام متغیر بعد از $ است.
در خط فرمان، میتوانید این موضوع را در عمل ببینید، این دستورات را در ترمینال وارد کنید:
نکته:
توجه داشته باشید که چطور کلمه Yes Dear را که فاصله داشت، داخل نقل قول
گذاشتیم. همچنین این نکته را رعایت کنید که دو طرف مساوی نباید فاصله وجود
داشته باشد.
با کمک دستور read میتوانید متغیری را با ورودی از
سمت کاربر مقدار دهی کنید. این دستور یک پارامتر میگیرد و آن هم نام
متغیری است که قرار است مقدار را داخلش بریزد و اجرایش به این صورت است که
منتظر ورود متن از سوی کاربر میشود. عملیات خواندن وقتی بهپایان میرسد
که کاربر دکمه اینتر را بزند. وقتی از ترمینال یک متغیر میخوانید، به
علامت نقل قول دیگر نیازی نیست. این مثال را ببینید:
نقل قول کردن
قبل از اینکه جلوتر برویم، بگذارید تکلیفمان را
با یکی از ویژگیهای پوسته روشن کنیم: استفاده از نقل قولها. معمولا،
پارامترهای اسکریپتها با کاراکتر فضای خالی جدا میشوند (مثل فاصله، تب
یا کاراکتر خط جدید) اگر پارامتری دارید که شامل یک یا چند فضای خالی است،
باید این پارامتر را داخل نقل قول بیاورید. عملکرد متغیرها داخل نقل قول،
بستگی به نقل قولی دارد که شما استفاده میکند. اگر متغیری $ را توی
double-quote (نقل قول دوتایی) بیاورید، زمان اجرا با مقدارش جایگزین
خواهد شد. اگر متغیر را داخل نقل قول تکی (single-quote) بیاورید، در این
صورت هیچ جایگزینی صورت نمیگیرد و همان که نوشتید به چاپ میرسد. البته،
شما میتوانید به طریقه دیگری معنی خاص $ را از بین ببرید و آن استفاده
از قبل از علامت $ است.
یک مثال کوچک و سریع بزنیم که حسابی اثر نقل قول روی متغیرها دستتان بیاید:
شما میدانید که چطور برنامه را اجرا کنید، بنابراین، خروجی به این صورت خواهد بود:
متغیرهای محیطی
یادتان است در موردPATH صحبت کردیم؟ متغیرهای محیطی، که با حروف بزرگ نمایش داده میشوند، بسته به تنظیمات شخصی شما ساخته میشوند، در راهنمای دستورات خیلی از این متغیرها داریم، اما اصلیهایش اینهاست که در جدول 1 مشاهده میکنید.
متغیرهای پارامتری
اگر اسکریپت شما با پارامتر صدا زده شود،
متغیرهای افزون بر اینها ایجاد میشوند. اگر هیچ پارامتری پاس داده نشود،
متغیر محیطی <-PostContent->zwnj;َ کماکان وجود دارد، اما مقدارش صفر است.
متغیرهای پارامتری در جدول2 فهرست شدهاند:
بیایید فرق بین *$ و ؛$ را با یک مثال سریع بفهمیم:
همانطور
که میبینید، بدون در نظر گرفتن محتویات نقل قول دوتایی، ؛$ پارامترها
را از هم جدا مینویسد. اگر میخواهید به پارامترها دسترسی پیدا کنید، به
گمانم $ گزینه بهتری است.
تمرین: ور رفتن با متغیرهای محیطی و پارامترها
پیادهسازی
بسیار ساده پارامترها را با اسکریپت زیر میفهمیم. فقط یادتان نرود که بعد
از تایپ و ذخیره آن به اسم tryvar، حتما آن را با استفاده از chmod +x
tryvar اجرایی کنید وگرنه اجرا نمیشود.
اگر این اسکریپت را اجرا کنید، خروجی زیر را میگیرید:
شرایط
پایهایترین بنیاد هر زبان برنامهنویسی، قابلیت
بررسی شرطها و انتخاب عملیات مختلف از روی نتیجه همین شرطهاست. بیایید
اول ساختارهای شرطیای که میتوانید در پوسته از آنها استفاده کنید را چک
کنیم و بعد برویم سراغ ساختارهای کنترلیای که از این شرطها استفاده
میکنند.
میتوان کد خروجی هر اسکریپتی، از جمله اسکریپتی که
خودتان مینویسید را تست کرد. به همین علت است که همیشه آخر کد خود بایستی
از دستور exit استفاده کنید.
دستور test یا ]
در عمل ثابت شده که بیشتر اسکریپتها از علامت ]
(براکت باز) یاtest استفاده میکنند. در این سیستمها، ] و test هم معنا
هستند، با این تفاوت که وقتی از ] استفاده میکنند، آخر دستور یک [ هم
میگذارند که خوانا باشد. استفاده از علامت براکت [ کمی عجیب بهنظر
میرسد، اما توی کد بسیار خوانا و ساده و مشابه زبانهای برنامهنویسی
دیگر است.
این دستورات در پوستههای یونیکس قدیمی برنامههای
خارجیای اجرا میکردند، اما در نسخههای جدیدتر دیگر پیادهسازیشان
داخلی شد. این نکته را خوب توجه کنید، به این علت که دستور test معمولا در
بیرون از اسکریپتهای پوسته استفاده نمیشود، بسیاری از کاربران تازهکار
با سیستم، اسم برنامههای خودشان را test میگذارند. اگر شما هم جزو این
دسته از برنامهنویسها هستید و این مشکل را دارید، احتمالا برنامهتان
با دستور test پوسته تداخل دارد. برای اینکه بفهمید کدام برنامه اجرا
میشود، از دستور which test استفاده کنید. اما راهحل مطمئن، همان
استفاده ازtest/. است که بهطور قطع و صد در صد برنامه شما را اجرا
میکند. چقدر خوب است که شما این عادت را در خود بهوجود بیاورید که
برنامهها را با ./ اجرا کنید.
ساختار دستور شرطی test یکی به این صورت است. مثلا برنامه زیر چک میکند که فایل موجود است یا خیر:
نکته:
توجه داشته باشید که بایستی حتماً بین شرط و علامتهای [] از کاراکتر
فاصله استفاده کنید. و اگر دارید از شیوه test استفاده میکنید هم، یادتان
باشد که بعد از test همواره و بدون هیچ استثنایی فاصله است! اگر
میخواهیدthen را در همان خط شرط بگذارید، بایستی بعد از براکت بسته، از
علامت نقطه ویرگول (;) استفاده کنید.
برای اطلاع از توضیح test، از این لینک استفاده کنید:
http://www.ss64.com/bash/test.html
محمدرضا قربانی
منبع :کلیک
زبان و کامپایلر
پیش از هر چیزی، لازم است بدانیم، نرمافزاری را که میخواهیم بررسی کنیم با چه زبانی نوشته شده است و با چه کامپایلری به فایل اجرایی تبدیل شده است. معمولا کامپایلرها با روشهای بهخصوصی اقدام به ساخت فایلهای اجرایی میکنند. با توجه به آن روشها که در همه فایلهای اجرایی نیز یکسان است میتوان فهمید که آن برنامه با چه کارهایی ساخته شده است. البته بهدلیل آن که شناخت کامپایلرها و طریقه ساخت فایلهای اجرایی توسط هر کدام از آنها نیز مستلزم داشتن آگاهی و شناخت کافی از آنهاست، این کار با استفاده نرمافزارهای ویژهای انجام میشود. برنامههای بسیاری هستند که پس از اجرای آنها و انتخاب فایل اجرایی دلخواه، اطلاعات کاملی در مورد زبان برنامهنویسی، کامپایلر مورد نظر و حتی نگارش کامپایلر و اطلاعات مفید دیگر را در اختیارتان قرار میدهد. خوب است بدانیم که شناسایی نوع کامپایلر میتواند استراتژی ما را در مراحل بعد، کاملا تحت تاثیر قرار دهد. زیرا معمولا هر کامپایلر ساختار خاصی را برای مدیریت و سازماندهی کدها، دادهها و منابع در فایل اجرایی خاص خود در نظر میگیرد که با کامپایلرهای دیگر کاملا متفاوت است.
فایلهای وابسته
بسیاری از نرمافزارها و فایلهای اجرایی، بههنگام اجرا از کتابخانهها و فایلهایی استفاده میکنند که معمولا این فایلها با پسوند.dll شناخته میشوند. گاهی لازم است بدانیم که هرdll شامل چه توابعی است و یک فایل اجرایی در هنگام کار به کدام فایلها وابسته است و کدامیک را فراخوانی میکند. نرمافزارهایی وجود دارند که قادر هستند کلیه فایلهای مورد نیاز یک برنامه در هنگام اجرا را بهصورت چند سطحی تشخیص دهند، به این معنا که اگر یک فایل وابسته، خود به فایل دیگری نیز وابسته بود، آن را هم شناسایی کنند.
منابع بهکار رفته
یکی از اجزای مهم بهکار رفته در فایلهای اجرایی،
به منابع (Resources) معروف هستند که در واقع دادههای از پیش تعریفشده
را برای برنامه نگهداری میکنند. پنجرههای از پیش تعریفشده، آیکونها،
تصاویر گرافیکی موجود در برنامه، رشتههای متنی، فایلهای صوتی و تصویری و
... از جمله منابع یک فایل اجرایی بهشمار میروند. یک برنامهنویس
میتواند به هر تعداد و از نوع منبع به فایل ارجایی خود بیافزاید و در
مهندسی معکوس میتوان این منابع را استخراج کرده یا تغییر داده و یا نمونه
دیگری جایگزین کرد.
نرمافزارهای ویژهای هستند که میتوان با
استفاده از آنها به منابع یک فایل اجرایی دسترسی پیدا کرد و آنها را مطابق
میل خود تغییر داد و یا آنها را از دل فایل اجرایی بیرون کشید. با استفاده
از همین برنامههاست که میتوان زبان منوها، پنجرههای و محیط برنامه را
بدون دسترسی داشتن به کد برنامه تغییر داد. انواع نرمافزارهای فارسیساز
با استفاده از همین تکنیکها طراحی میشوند
Disassemblerها
هر برنامه، مستقل از زبان برنامهنویسی آن به کد ماشین تبدیل میشود. حال اگر بخواهیم که ماشین را دوباره به کدهای زبان برنامهنویسی تبدیل کنیم، ممکن است این کار امکانپذیر نباشد. اما با توجه به اینکه هر دستور زبان ماشین معادل یک دستور زبان اسمبلی است، میتوان هر برنامهای را بهزبان اسمبلی برگرداند که این عمل را Disassemble یا عکس عمل اسمبل گویند. با این کار، اگر شخص بهقدر کافی به زبان اسمبلی مسلط باشد، میتواند هر تغییری در کد برنامه بدهد و مجددا آن را اسمبل کرده و فایل اجرایی جدید با اعمال تغییرات ایجاد کند. نرمافزارهای توانمندی هستند که میتوانند علاوه بر عمل disassemble ، امکانات بسیاری را برای اعمال تغییرات در فایل اجرایی در اختیار کاربران قرار دهند.
فعالیتهای فایل اجرایی
بهعنوان اطلاعات اولیه، شاید لازم باشد که بدانیم یک فایل اجرایی در زمان اجرا چه رفتاری از خود نشان میدهد و فعالیت آن چگونه است. بهعنوان مثال چه میزان حافظه اصلی را اشغال میکند و چه میزان از حافظه مجازی روی دیسک را به خود اختصاص میدهد یا در زمان اجرا تا چه حد از توان پردازنده را در اختیار خود میگیرد. این اطلاعات و بسیاری اطلاعات دیگر، از جمله مواردی هستند که میتوان در زمان اجرا، از یک فایل اجرایی کسب کرد. برای این کار نیز نرمافزارهای متنوعی وجود دارند. سادهترین ابزار موجود در این زمینه Task Manager موجود در ویندوز است که تا حدی، اطلاعات مفیدی در مورد برنامههای در حال اجرا در اختیار کاربران قرار میدهد.
ورودی و خروجی
بیشتر برنامهها عمل ورودی و خروجی روی فایل
دارند. یعنی یا از فایل خواند یا بر روی آن مینویسند. اطلاعات مربوط به
این فعالیتها نیز ممکن است در جایی لازم باشد.
نرمافزارهایی
وجود دارند که بهمحض اجرای یک برنامه، تمامی فعالیتهای ورودی و خروجی
مربوط به فایل آن را تحت نظارت و کنترل قرار میدهند. با استفاده از
اینگونه نرمافزارها میتوان اطلاعات ارزشمندی در مورد این نوع فعالیت
فایلهای اجرایی نیز کسب کرد.
فعالیت در رجیستری و شبکه
دو نوع فعالیت دیگر وجود دارد که در حوزههای جداگانه بررسی میشوند و میتوانند اطلاعات خوبی در اختیار کار برقرار دهند و یکی تاثیرات که یک فایل اجرایی در رجیستری ویندوز اعمال میکند و دیگری ارتباطات و اتصالهایی که برنامه با شبکه و اینترنت برقرار میکند. در این زمینهها نیز نرمافزارهایی وجود دارند که کلیه کارهای یک برنامه را برای تغییر دادن رجیستری در نظر میگیرد و میتوان با بررسی آن به رفتارهای فایل اجرایی پی برد. برنامههایی نیز تحت عنوان کلیNetwork monitor هستند که کلیه اتصالها، نوع اتصال و پروتکل بهکار رفته در آن و دیگر جزییات مربوط به ارتباطات و شبکه را کنترل میکنند.
ارتباطات سختافزاری
و بالاخره یک فایل اجرایی ممکن است در طول اجرا با سختافزارهای مختلف و درگاهها، تبادل اطلاعات و ارسال و دریافت داده داشته باشد. ارتباط با درگاههای سریال، موازی، USB و ... . ارسال اطلاعات به نمایشگر و تبادل اطلاعات با دیسکها و درایوها و دیگر لوازم جانبی رایانه از جمله مواردی هستند که میتوانند در بررسی رفتار یک فایل اجرایی و کسب اطلاعات اولیه در گام اول مهندسی معکوس موثر واقع شوند.
منبع : گلیک
قبل از
هر چیز باید به این نکته اشاره کرد که سازندگان و نویسندگان جیکوئری با
ایجاد زنجیرهها در جیکوئری گام مهمی در انعطافپذیری و قابلیتهای این
فریم ورک برداشتهاند، این زنجیرهها نه تنها قدرت اجرای چندین دستور پشت
سرهم و در یک خط را به شما میدهند بلکه باعث میشوند تا راندمان
برنامههای نوشته شده را به طرز کاملا باور نکردنی در مقایسه با دیگر
فریمورکهای جاوااسکریپت، بالاببرید.
افزایش راندمان به این خاطر
است که نیازی نیست تا عناصر پوشش داده شده چندین مرتبه برای انجام چندین
فرآیند مختلف مورد پردازش قرار گیرند.
بسته به روشی که در یک زنجیر
جیکوئری بهکار گرفتهمیشود، ممکن است حتی در یک زنجیر، چندین گروه از
عناصر انتخاب شده ایجاد شوند؛ بهعنوان مثال تابعclone() گروهی جدید از
عناصر پوشش داده شده را ایجاد میکند که در واقع یک کپی از عناصری است که
در ابتدا پوشش داده شدهاند، به عنوان مثال این دستور را در نظر بگیرید:
('img').clone().appendTo('َsomewhere');$
با
استفاده از این دستور و طبق صحبتهای بالا دو گروه از عناصر پوشش داده شده
ایجاد خواهندشد، یک گروه عناصر «»img درون صفحه هستند و گروهی دیگر یک
کپی از این عناصر هستند که با استفاده از دستور بعدی(appendTo) در مکانی
دیگر از صفحه نمایش داده میشوند.
اما سوالی که اینجا ممکن است
مطرحشود این است که بعد از انجام این کار اگر مثلا بخواهیم یک کلاس را به
عناصر پوشش داده شده اصلی اختصاص دهیم،با توجه به حرکت رو به جلو در زنجیر
و عدمامکان بازگشت به عقب، آن وقت وضعیت چگونه خواهدبود؟
در
اینجا دستوری معرفی میشود که میتوان با کمک آن به سادگی به این سوال
پاسخداد، دستور end() باعث میشود که انجام عملیات بر روی گروهی از
عناصر پوشش داده شده به پایانبرسد، به عنوان مثال اگر بخواهیم دستور قبلی
را به نحوی دیگر بنویسیم که بعد از انجام فرآیندی بر روی کپی گرفته شده از
عناصر انتخاب شده به سراغ عناصر اصلی برویم و روی آنها نیز فرآیند دیگری
انجام دهیم، می توانیم دستوری شبیه این دستور را داشتهباشیم:
('img').clone().appendTo('َsomewhere')$
end().addClass('beenCloned');.
تابع
end() هیچ مقداری را به عنوان پارامتر ورودی قبول نمیکند، درعوض
هرجایی که استفاده شود عناصر پوشش داده شده قبل را تحت تاثیر قرار میدهد
و باعث میشود که برنامه به سراغ آنها برود.
اگر بخواهیم به صورت
فنیتر این مسئله را بررسی کنیم که بهتر بتوانید آن را درک کنید، میتوان
اینگونه دستورات جیکوئری را توصیف کرد که در هنگام اجرای یک زنجیره در
جیکوئری، هر کدام از عناصر پوشش داده شده در یک stack (پشته) قرار
میگیرندpush() میشوند سپس درهر زمانی که دستور end() فراخوانی
میشود، آخرین گروه عناصر پوشش داده شده که در بالاترین مکان stack قرار
دارند، pop میشوند و شما می توانید از آنها استفاده کنید.
دستور
دیگری که می توان در اینجا معرفی کرد، andSelf() است. با استفاده از
این دستور می توانید دو گروه از عناصر push شده در stack که در
بالاترین مکان قرار دارند را با یکدیگر ادغام کنید به این معنا که آخرین
دو گروه از عناصر پوشش داده شده قبلی که در زنجیره جیکوئری مورد استفاده
قرار گرفتهاند، با استفاده از این دستور با یکدیگر ادغام میشوند. این
دستور نیز مانند دستور end() هیچ پارامتر ورودی ندارد.
در پایان
این بخش و در کل آموزشهای جیکوئری سعی کردیم که در مورد ایجاد و مدیریت
عناصر در جیکوئری صحبت کنیم، در طی تمامی این مباحث، جیکوئری ابزاری را
معرفی کرد که با استفاده از آنها میتوانید بهسادگی و صرف کمترین منابع
سیستم به هدفتان برسید، اکنون شما میتوانید کلیه عناصر موجود در یک صفحه
وب را با استفاده از دستورات و انتخابگرهای متعددی که جیکوئری در
اختیارتان قرار میدهد ، کنترل کنید و بر روی آنها فرآیندهای مورد نظرتان
را انجام دهید.
پویا سلیمی
منبع :کلیک
مفهوم مهندسی معکوس
به هر گونه تلاش و فعالیت در راستای رسیدن از
مراحل بالاتر طراحی و تولید به یک یا چند مرحله پایینتر، مهندسی معکوس
گویند. این مفهوم در تمامی شاخهها و زمینههای مهندسی از جمله نرمافزار
و سختافزار مطرح است. برای مثال دستیابی به ایدهها و روشهای تولید یک
محصول، از نمونه محصول نهایی نمونهای از مهندسی معکوس است.
یکی
از اهداف مهندسی معکوس، شناسایی اجزای سازنده یک محصول و روابط بین
آنهاست که گاهی از آن اجزا برای ساخت یک محصول جدید نیز بهره گرفته
میشود.
گاهی نیز بهمنظور ایجاد تغییرات در سیستمی است که طرح و
اجزای اولیه آن در دسترس نیست. این کار که بهمنظور مطابقت سیستم جدید با
خواستهها و نیازهای جدید صورت میگیرد، مهندسی دوباره(Reengineering)
نیز نامیده میشود. همچنین با این کار میتوان مشکلات موجود در یک سیستم
را ردیابی و بررسی کرد: طی بررسی یک سیستم میتوان به مستندسازی آن سیستم
نیز پرداخت تا با ایجاد درک بهتر از سیستم در جهت بهبود آن گام برداشت.
البته
باید توجه داشت که بهکارگیری فنون مهندسی معکوس در هر رشتهای، دشواریها
و مشکلات خاص خود را دارد و به ابزار و امکانات خاصی نیاز دارد و گاهی با
وجود کامل بودن ابزار و امکانات ممکن است نتیجه مطلوب نهایی حاصل نشود.
بنابراین در بهکارگیری این فنون باید تمامی هزینهها و زمان مصرفی و
نتیجه نهایی در نظر گرفته شوند. بهعبارتی باید توجه داشت که میزان هزینه
مورد نظر در مقابل دسترسی به چه هدفی صرف میشود.
در ادامه تلاش
خواهیم کرد که به چند مورد از کاربردهای مهندسی معکوس در شاخه نرمافزار
اشارهای کوتاه داشته باشیم تا هدف از این شاخه از علم رایانه نیز تا حدی
روش شود.
کشف رمزها و کدها
باید توجه داشت که از هر ابزاری میتوان در راه
خوب یا بد استفاده کرد. این که شخص از مهارت خود و ابزارهای موجود استفاده
نادرست کند، خود مسوول آن کار خواهد بود.
معمولا کشف کدها یا
شکستن رمز، ذهن را به سمت اعمال غیرقانونی میبرد. کشف کدها و رمزها و
کدهای یک نرمافزار بانک از جمله این موارد است. اما شکستن رمز همیشه بد و
غیرقانونی نیست. اغلب اطلاعات رد و بدل شده بین مجرمان نیز رمزگذاری
میشود و برای جلوگیری از فعالیت آنها، پلیس باید اطلاعات بهدست آمده از
آنها را کشف رمز کند. باید توجه داشت که معمولا عمل رمزگشایی با استفاده
از کلید صورت میگیرد و در صورت در دسترس نبودن کلید، ناچار به شکستن رمز
یا کشف رمز هستیم. بنابراین خوب است در بهکارگیری این اصطلاحات دقت کنیم.
معمولا
در شکستن رمزها از تکنیکهای مهندسی معکوس استفاده میشود. بدون استفاده
از این تکنیکها اگر بخواهیم اقدام به کشف رمز کنیم،چارهای جز حدس، آزمون
و خطا و یا بررسی کلیه حالتهای ممکن (Brute force) نخواهیم داشت که کار
بس زمانگیر، دشوار و طاقتفرساست.
مبارزه با ویروسها
مبارزه با ویروسها و کشف نرمافزارهای مخرب، از دیگر کاربردهای مهندسی معکوس است. معمولا نویسندگان ویروسها و تولیدکنندگان نرمافزارهای مخرب از زبانهای سطح پایین و اغلب از زبان اسمبلی استفاده میکنند. دلیل این امر نیز آن است که اولا ویروسها قصد دارند به نقاطی از سیستم دسترسی پیدا کنند که شاید زبانهای سطح با امکان دستیابی به آن را نداشته باشند. در ثانی میخواهند تا جای ممکن اندازه ویروس کوچک بوده و سرعت اجرای بالایی داشته باشد. پس از نوشتن ویروس آن را به کد ماشین تبدیل کرده و اجرا میکنند. حال برای اینکه بتوان از کارکرد آن ویروس مطلع شده و جلوی فعالیت آن را بگیریم، باید با استفاده از تکنیکهای مهندسی معکوس، به کد آن دسترسی پیدا کنیم. در طراحی نرمافزارهای ضدویروس، با استفاده از تکنیکهای گفته شده، به نشانههای مختص هر ویروس پی برده میشود و با توجه به طریقه عمل آن ویروس، راههای بازگردانی تغییرات طراحی شده و در نهایت راه از بین بردن آن ویروس تعیین میشود.
تغییر در کار یا ظاهر نرمافزار
ممکن است نرمافزاری در اختیار داشته باشیم که
کدهای برنامهنویسی آن در دسترس ما نباشد و بخواهیم تغییرکوچکی در روند
اجرای برنامه اعمال کنیم. همچنین ممکن است بخواهیم تغییری در ظاهر برنامه
ایجاد کنیم. حتی برخی اوقات لازم است قابلیتهای جدیدی به یک نرمافزار
اضافه شود و یا اشکالات موجود در آن رفع شوند. در کلیه این موارد نیز جز
تکنیکهای مهندسی معکوس، راه دیگری نخواهیم داشت. اغلب این مسایل در
مواقعی رخ میدهد که کد برنامه در دسترس نبوده و شرکت تولیدکننده نرم
افزار نیز دیگر از آن پشتیبانی نمیکند.
یکی از این مشکلات، مشکل
سال2000 (Y2K) بود که شاید آن را بهخاطر داشته باشید. این مشکل با آغاز
هزار جدید بهوجود آمد و در آن زمان بسیاری از سازمانها و کاربران در حال
استفاده از نرمافزارهایی بودند که شاید سالها با آن کار کرده بودند و
مشکلات آن را رفع کرده و اطلاعات زیادی در آنها جمعآوری کرده بودند.
بسیاری از این نرمافزارها بهعلت آن که قدیمی شده بودند، دیگر از جانب
شرکت تولیدکننده، پشتیبانی نمیشدند و یا شرکتها بهطور کامل منحل شده
بودند. اما همچنان برای آن سازمان پرکاربرد بودند. با مطرح شدن مشکل سال
2000، شرکتها و سازمانهای زیادی بار مالی زیادی را برای رفع این مشکل با
استفاده از تکنیکهای مهندسی معکوس، متحمل شدند.
طراحی مجدد
یکی از کاربردها و زمینههای فعالیت برای مهندسی
معکوس که بسیاری مفید است، طراحی مجدد یک نرمافزار بر اساس یک نمونه
موجود است. این کار معمولا بهدلایل زیادی، از جمله تغییر سیستم عامل،
صورت میگیرد و کاری بسیار پیچیده و دقیق است که معمولا بهصورت کار گروهی
و توسط شرکتهای بزرگ انجام میشود.
مراحل این کار که به دو قسمت
مهندسی معکوس و مهندسی مستقیم (Forward Engineering)تقسیم میشود، به
این صورت است که ابتدا کلیه ایدهها و روشهای پیادهسازی نرمافزار مورد
نظر تشخیص داده شده و سپس با توجه به اطلاعات بهدست آمده، نرمافزار
جدیدی طراحی و پیادهسازی میشود. شاید این یکی از دشوارترین و مفیدترین
زمینههای کار در مهندسی معکوس باشد.
مستندسازی
برای برنامهها و یا توابع کتابخانهای که بدون کد برنامهنویسی عرضه میشودند معمولا مستنداتی نیز وجود ندارد. مانند توابع محلی ویندوزNT که شامل چندین هزار تابع است که برای آنها جز چند صفحه اطلاعات ابتدایی، مستنداتی از سوی شرکت سازنده یعنی مایکروسافت ارایه نشده است. برای مستندسازی اینگونه برنامهها یا توابع نیز، تکنیکهای مهندسی معکوس چارهساز خواهند بود.
Crack
یکی از کاربردهای غیرقانونی مهندسی معکوس،
کرککردن یک نرمافزار است. معمولا شرکتهای تولیدکنده نرمافزار، کل
امکانات مربوط به برنامه را در بسته نرمافزاری قرار میدهند.
اما
برای مجبور کردن کاربران به خرید برنامه، برای آن محدودیت زمانی
میگذارند. افراد بسیاری هستند که با نفوذ به این نرمافزارها، محدودیت آن
را برداشته و یا کد تولید و تشخیص کلید را از درون برنامه استخراج میکنند
و در اختیار دیگران قرار میدهند.
به این ترتیب کاربران بدون
پرداخت هزینه، از نرمافزار مورد نظر برای مدت زمان نامحدود استفاده
میکنند. البته همه جای دنیا افرادی وجود دارند که برای حمایت از
تولیدکنندگان نرمافزار از نسخههای کرکشده استفاده نکرده و اصل آن را
خریداری میکنند. مسلما کاربردهای مهندسی معکوس به همین چند مورد خلاصه
نمیشود و با توجه به شرایط و زمانهای مختلف میتواند کاربردهای دیگر و
حتی کاربردهای دیگری نیز داشته باشد.
پارسا ستودهنیا
منبع :کلیک