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

زبان و کامپایلر

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

فایل‌های وابسته‌

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

منابع به‌کار رفته‌

یکی از اجزای مهم به‌کار رفته در فایل‌های اجرایی، به منابع ‌(Resources) معروف هستند که در واقع داده‌های از پیش تعریف‌شده را برای برنامه‌ نگهداری می‌کنند. پنجره‌های از پیش تعریف‌شده،‌ آیکون‌ها، تصاویر گرافیکی موجود در برنامه، رشته‌های متنی، فایل‌های صوتی و تصویری و ... از جمله منابع یک فایل اجرایی به‌شمار می‌روند. یک برنامه‌نویس می‌تواند به هر تعداد و از نوع منبع به فایل ارجایی خود بیافزاید و در مهندسی معکوس می‌توان این منابع را استخراج کرده یا تغییر داده و یا نمونه دیگری جایگزین کرد.

نرم‌افزارهای ویژه‌ای هستند که می‌توان با استفاده از آنها به منابع یک فایل اجرایی دسترسی پیدا کرد و آنها را مطابق میل خود تغییر داد و یا آنها را از دل فایل اجرایی بیرون کشید. با استفاده از همین برنامه‌هاست که می‌توان زبان منوها، پنجره‌های و محیط برنامه را بدون دسترسی داشتن به کد برنامه تغییر داد.  انواع نرم‌افزارهای فارسی‌ساز با استفاده از همین تکنیک‌ها طراحی می‌شوند

Disassemblerها

هر برنامه، مستقل از زبان برنامه‌نویسی آن به کد ماشین تبدیل می‌شود. حال اگر بخواهیم که ماشین را دوباره به کدهای زبان‌ برنامه‌نویسی تبدیل کنیم، ممکن است این کار امکان‌پذیر نباشد. اما با توجه به این‌که هر دستور زبان ماشین معادل یک دستور زبان اسمبلی است، می‌توان هر برنامه‌ای را به‌زبان اسمبلی برگرداند که این عمل را Disassemble یا عکس‌ عمل اسمبل گویند. با این کار، اگر شخص به‌قدر کافی به زبان اسمبلی مسلط باشد، می‌تواند هر تغییری در کد برنامه بدهد و مجددا آن را اسمبل کرده و فایل اجرایی جدید با اعمال تغییرات ایجاد کند. نرم‌افزارهای توانمندی هستند که می‌توانند علاوه بر عمل disassemble ، امکانات بسیاری را برای اعمال تغییرات در فایل اجرایی در اختیار کاربران قرار دهند.

فعالیت‌های فایل اجرایی‌

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

ورودی و خروجی‌

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

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

فعالیت در رجیستری و شبکه‌

دو نوع فعالیت دیگر وجود دارد که در حوزه‌های جداگانه بررسی می‌شوند و می‌توانند اطلاعات خوبی در اختیار کار برقرار دهند و یکی تاثیرات که یک فایل اجرایی در رجیستری ویندوز اعمال می‌‌کند و دیگری ارتباطات و اتصال‌هایی که برنامه با شبکه و اینترنت برقرار می‌کند. در این زمینه‌ها نیز نرم‌افزارهایی وجود دارند که کلیه کارهای یک برنامه را برای تغییر دادن رجیستری در نظر می‌گیرد و می‌توان با بررسی آن به رفتارهای فایل اجرایی پی برد. برنامه‌هایی نیز تحت عنوان کلیNetwork monitor  هستند که کلیه اتصال‌ها، نوع اتصال و پروتکل به‌کار رفته در آن و دیگر جزییات مربوط به ارتباطات و شبکه را کنترل می‌کنند.

ارتباطات سخت‌افزاری‌

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

منبع : گلیک

دسته ها : برنامه‌نویسی
شنبه نهم 6 1387
در مطالب شماره‌های گذشته دستورات مهمی از جی‌کوئری را معرفی کردیم، اگر به یاد داشته باشید در بخش‌های قبل در مورد زنجیره‌های جی‌کوئری مطالبی ارائه شد و تا به این جا نمونه‌های مختلفی از زنجیره‌ها را در جی‌کوئری مثال زده‌ایم. در آخرین بخش از این سری از آموزش‌های جی‌کوئری در مورد مدیریت این زنجیره‌ها صحبت خواهیم کرد.

قبل از‌ هر چیز باید به این نکته اشاره کرد که سازندگان و نویسندگان جی‌کوئری با ایجاد زنجیره‌ها در جی‌کوئری گام مهمی در انعطاف‌پذیری و قابلیت‌های این فریم ورک برداشته‌اند، این زنجیره‌ها نه تنها قدرت اجرای چندین دستور پشت سر‌هم و در یک خط را به شما می‌دهند بلکه باعث می‌شوند تا راندمان برنامه‌های نوشته شده را به طرز کاملا باور نکردنی در مقایسه با دیگر فریم‌ورک‌های جاوااسکریپت، بالا‌ببرید.

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

بسته به روشی که در یک زنجیر جی‌کوئری به‌کار گرفته‌می‌شود، ممکن است حتی در یک زنجیر، چندین گروه از عناصر انتخاب شده ایجاد شوند؛ به‌عنوان مثال تابع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()  هیچ پارامتر ورودی ندارد.

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

پویا سلیمی

منبع :‌کلیک‌

دسته ها : برنامه‌نویسی
شنبه نهم 6 1387
در مقالات پیشین به اختصار درباره مهندسی معکوس صحبت کردیم. خوب است کمی بیشتر به این مساله بپردازیم تا با شناخت بهتر زمینه‌های کاربرد آن بتوانیم به فعالیت در آن رابطه پرداخته و دانش خود را در جای مناسب به‌کار گیریم.

مفهوم مهندسی معکوس‌

به هر گونه تلاش و فعالیت در راستای رسیدن از مراحل بالاتر طراحی و تولید به یک یا چند مرحله پایین‌تر، مهندسی معکوس گویند. این مفهوم در تمامی شاخه‌ها و زمینه‌های مهندسی از جمله نرم‌افزار و سخت‌افزار مطرح است. برای مثال دستیابی به ایده‌ها و روش‌های تولید یک محصول، از نمونه محصول نهایی نمونه‌ای از مهندسی معکوس است.

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

گاهی نیز به‌منظور ایجاد تغییرات در سیستمی است که طرح و اجزای اولیه آن در دسترس نیست. این کار که به‌منظور مطابقت سیستم جدید با خواسته‌ها و نیازهای جدید صورت می‌گیرد، مهندسی دوباره(Reengineering)  نیز نامیده می‌شود. همچنین با این کار می‌توان مشکلات موجود در یک سیستم را ردیابی و بررسی کرد: طی بررسی یک سیستم می‌توان به مستندسازی آن سیستم نیز پرداخت تا با ایجاد درک بهتر از سیستم در جهت بهبود آن گام برداشت.

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

در ادامه تلاش خواهیم کرد که به چند مورد از کاربردهای مهندسی معکوس در شاخه نرم‌افزار اشاره‌ای کوتاه داشته باشیم تا هدف از این شاخه از علم رایانه‌ نیز تا حدی روش شود.

کشف رمزها و کدها

باید توجه داشت که از هر ابزاری می‌توان در راه خوب یا بد استفاده کرد. این که شخص از مهارت خود و ابزارهای موجود استفاده نادرست کند، خود مسوول آن کار خواهد بود.

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

معمولا در شکستن رمزها از تکنیک‌های مهندسی معکوس استفاده می‌شود. بدون استفاده از این تکنیک‌ها اگر بخواهیم اقدام به کشف رمز کنیم،چاره‌ای جز حدس، آزمون و خطا و یا بررسی کلیه حالت‌های ممکن (Brute force) نخواهیم داشت که کار بس زمان‌گیر، دشوار و طاقت‌فرساست.

مبارزه با ویروس‌ها

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

تغییر در کار یا ظاهر نرم‌افزار

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

یکی از این مشکلات، مشکل سال‌2000  (Y2K) بود که شاید آن را به‌خاطر داشته باشید. این مشکل با آغاز هزار جدید به‌وجود آمد و در آن زمان بسیاری از سازمان‌ها و کاربران در حال استفاده از نرم‌افزارهایی بودند که شاید سال‌ها با آن کار کرده بودند و مشکلات آن را رفع کرده و اطلاعات زیادی در آنها جمع‌آوری کرده بودند. بسیاری از این نرم‌‌افزارها به‌علت آن که قدیمی شده بودند، دیگر از جانب شرکت تولیدکننده، پشتیبانی نمی‌شدند و یا شرکت‌ها به‌طور کامل منحل شده‌ بودند. اما همچنان برای آن سازمان پرکاربرد بودند. با مطرح شدن مشکل سال 2000، شرکت‌ها و سازمان‌های زیادی بار مالی زیادی را برای رفع این مشکل با استفاده از تکنیک‌های مهندسی معکوس، متحمل شدند.

طراحی مجدد

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

مراحل این کار که به دو قسمت مهندسی معکوس و مهندسی مستقیم ‌ (Forward Engineering)تقسیم می‌شود، به این صورت است که ابتدا کلیه ایده‌ها و روش‌های پیاده‌سازی نرم‌افزار مورد نظر تشخیص داده شده و سپس با توجه به اطلاعات به‌دست آمده، نرم‌افزار جدیدی طراحی و پیاده‌سازی می‌شود. شاید این یکی از دشوارترین و مفیدترین زمینه‌های کار در مهندسی معکوس باشد.

مستندسازی‌

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

Crack

یکی از کاربردهای غیرقانونی مهندسی معکوس، کرک‌کردن یک نرم‌افزار است. معمولا شرکت‌های تولیدکنده نرم‌افزار، کل امکانات مربوط به برنامه را در بسته‌ نرم‌افزاری قرار می‌دهند.

اما برای مجبور کردن کاربران به خرید برنامه، برای آن محدودیت زمانی می‌گذارند. افراد بسیاری هستند که با نفوذ به این نرم‌افزارها، محدودیت آن را برداشته و یا کد تولید و تشخیص کلید را از درون برنامه استخراج می‌کنند و در اختیار دیگران قرار می‌دهند.

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

پارسا ستوده‌نیا

منبع :‌کلیک

دسته ها : برنامه‌نویسی
شنبه نهم 6 1387
X