دیباگ کردن اسمبلی‌های دات نتی بدون داشتن سورس کد

علی بهرامی‌نژاد - - زمان تقریبی مطالعه: 3 دقیقه

امروز مساله‌ای برام پیش اومده بود که باید برنامه‌ای دات نتی رو علاوه بر دیکامپایل، دیباگ هم کنم. خب با استفاده از برنامه‌هایی مثل JetBrains dotPeek یا RedGate .NET Reflector میشه Assemblyهای برنامه رو در صورتی که Obfuscate نشده باشه دیکامپایل کرد. از بین این دو برنامه؛ به نظر من dotPeek ابزار مناسب‌تری برای دیکامپایل برنامه‌های Managed Code هست چون:

  1. رایگان
  2. قوی و سریع
  3. امکان استخراج فایل پروژه
  4. امکان ساخت فایل pdb
  5. فراهم آوردن امکان دیباگ سورس کد با بهره‌گیری از Symbol Sever

قبل از اینکه نحوه دیباگ کردن و شرح بدم، لازم میدونم که یکی دو مورد رو توضیح بدم:

  • Managed Code به کدهایی گفته میشه که توسط یکی از زبان‌های برنامه‌نویسی .Net Framework ( مثل سی شارپ و ... ) تولید شده باشه، کد نوشته شده در این زبان‌ها به زبان میانی (CIL) ترجمه و توسط دات نت روی سیستم‌ها اجرا میشه. (اطلاعات بیشتر)

  • pdb مخفف Program DataBase، فایل‌هایی هستند که اطلاعات دیباگ پروژه رو نگهداری میکنند و تنها زمانی که حالت کامپایل برنامه روی debug باشد تولید میشوند. (اطلاعات بیشتر)

  • Obfuscation یا مبهم‌سازی کد به روشی میگن که قبل از کامپایل کد ساختار کد ( مانند نام متغیر و ... ) را بهم میریزند تا وقتی توسط یک Decompiler یا Debugger کد کامپایل شده اون‌ها بررسی میشه خواندن اونها به آسانی میسر نباشه. (اطلاعات بیشتر)

چه چیزی و قرار هست بررسی کنیم؟ اینکه چطور یک برنامه دات نتی و بدون داشتن کد با استفاده از dotPeek و Visual Studio دیباگ کنیم ...

در اینجا من برنامه‌ای به اسم FooBarCLI دارم که با حالت Debug کامپایل شده. کاری که این برنامه انجام میده اینه که یک داده ورودی از Console میخونه و یک کد تصادفی به اون اختصاص میده.

پیش مرحله

این رو مد نظر قرار دهید که این روش تنها برای برنامه‌هایی جواد خواهد داد که debug mode کامپایل شده باشند.

هیچگاه از این روش برای سوء استفاده از برنامه‌ها استفاده نکنید Never ever

مرحله 1

ابتدا https://www.jetbrains.com/decompiler/download/ رو از سایت JetBrains دانلود کنید.

مرحله 2

فایل اسمبلی برنامه دات نتی (exe یا dll) مورد نظر و داخل dotPeek باز کنید:

A .net assembly decompiled in dotPeek

مرحله 3

از اسمبلی دیکامپایل شده، یک خروجی از نوع پروژه Visual Studio بگیرید:

dotPeek export to visual studio project

مانند شکل زیر تنظیمات را انجام بدید:

dotPeek export options

مرحله 4

وارد تنظیمات dotPeek از طریق منو Tools->Options بشید و در Symbol Server تنظیمات را مانند شکل پایین انجام بدید:

dotPeek settings

مرحله 5

ویژوال استودیو را باز کنید و از منو Tools->Options به قسمت Debugging رفته و Enable Just My Code را غیر فعال کنید.

visual studio just my code

و سپس در قسمت Symbols مانند شکل زیر هاست و پورت Symbol Server مربوط به dotPeek رو وارد کنید:

visual studio symbols

مرحله 6

در dotPeek، از طریق منوی Tools->Symbol Server روی Symbol Server جهت راه اندازی آن کلیک کنید:

start symbol server

مرحله 7

پروژه دیکامپایل شده را در ویژوال استودیو باز کنید و هر قسمت از کد که می‌خواهید breakpoint قراردهید:

start symbol server

مرحله 8

برنامه اصلی دات نتی که قصد دیباگ آنرا دارید اجرا کنید و پس از اجرا در Visual Studio ابزار Debugger را به پروسس آن Attach کنید:

attach to process

attach to process

مرحله 9

بسته به سایز پروژه، ممکن است روال ایجاد pdbها در dotPeek زمان‌بر باشد، در زمان تولید می‌توانید در قسمت project/pdb generation status لیست pdbهای تولید شده/در حال تولید رو مشاهده کنید، پس کمی صبور باشید:

pdb

مرحله 10

برنامه را به شکل عادی استفاده کنید تا به breakpoint شما برخورد کند.

pdb

حرف آخر

هیچگاه از این روش برای سوء استفاده از برنامه‌ها استفاده نکنید Never ever

دیدگاه‌ها