BitLocker Partition Recovery

مدتی پیش سهوا چند دستور DiskPart.exe را روی کامپیوتر اجرا کردم که باعث ایجاد مشکلاتی برای درایوهایم شد. این درایوها به وسیله BitLocker رمز شده بودند و از طرفی من فایل Password Recovery که برای بازگردانی این گونه درایوها لازم است را گم کرده بودم. استفاده از روشهای رایج برای بازگردانی هیچ فایده ای نداشت و هیچ اطلاعاتی برای حل این مشکل در اینترنت پیدا نکردم. به فکر افتادم این کار را به یکی از مراکز بازگردانی اطلاعات بسپارم. بعد کمی پیگیری تنها یک مرکز برای این کار پیدا کردم که با رمز بودن درایو مشکلی نداشت. اما این مرکز هم در فاصله چند صد کیلومتری من بود و هیچ علاقه ای برای رفتن به آنجا نداشتم. پس خودم دست به کار شدم و سعی کردم مشکل را بر طرف کنم. بالاخره بعد از مدتی مطالعه و آزمایش و خطا موفق به بازگردانی اطلاعاتم شدم. در اینجا به بیان تجربیاتم می پردازم.


ساختار سیستم فایل
هر دیسک یک MBR یا Master Boot Record دارد. MBR اطلاعاتی به طول 512 بایت است که در سکتور صفر قرار دارد و حاوی اطلاعاتی از قبیل جدول پارتیشن ها، کدهای اجرایی که BIOS اجرا میکند (مثلا برای بالا آمدن سیستم عامل که اصلاحا به   آن BootLoader یا Bootstrap می گویند ) ، یک عدد 32 بیتی به عنوان شناسه دیسک و ... است.
جدول پارتیشن ها 64 بایت طول دارد و اندازه هر مدخل آن 16 بایت است ( یعنی هر پارتیشن 16 بایت اطلاعات برای ذخیره کردن در این مدخل دارد ) پس تنها 4 پارتیشن می تواند در این جدول وارد شود. برای رفع این محدودیت پارتیشن ها را به دو دسته تقسیم کردن:
1- Primary که خود یک پارتیشن است و یک مدخل در جدول دارد.
2- Extended که شامل تعدادی پارتیشن Logical است و یک مدخل در جدول دارد. میتواند شامل حداکثر 24 پارتیشن Logical باشد و اطلاعات این پارتیشن های Logical را در EMBR یا Extended Master Boot Record روی خودش نگه میدارد.
سکتور صفر پارتیشن ( اولین سکتور پارتیشن ) برای نگهداری اطلاعات پایه پارتیشن استفاده میشود. مثلا فرمت پارتیشن (Fat32 ، NTFS و ... ) و اطلاعات متناسب با فرمت آن.
برای مثال اگر یک پارتیشن را به عنوان NTFS فرمت کنید اطلاعات زیر در سکتور صفر قرار میگیرد:
تعداد بایت هر سکتور، تعداد سکتور هر کلاستر ( کلاستر کوچکترین واحد ذخیره سازی فایل است )، تعداد سکتورها، آدرس شروع MFT یا Master File Table و ...
MFT جدول مهمی است که اطلاعات تمام فایلها و فولدرهای روی دیسک را نگه میدارد و به همین دلیل دو نسخه از آن در پارتیشن قرار داده میشود. نمای زیر ساختار کلی یک پارتیشن NTFS است:


پارتیشن هایی که به وسیله BitLocker رمز میشوند ساختار متفاوتی دارند. در وافع میتوان گفت BitLocker یک فرمت است مانند NTFS و FAT و ... با این تفاوت که وقتی در حالت رمز شده است به ساختار خودش و وقتی رمزگشایی شده است به صورت NTFS خواهد بود.
پروسه رمزگذاری/رمزگشایی BitLocker پیچیده است و برای اطلاعات بیشتر می تواند به مرجع شماره 6 نگاه کنید. اما آنچه برای این نوشته مهم است این که سکتور صفر این نوع پارتیشین شبیه NTFS است ( طبقه مرجع نامعتبر 7 !!! ) و طبق بررسی های خودم میتوانید سکتور صفر پاتیشن های BitLocker روی یک سیستم را به جای هم استفاده کنید البته با دو تغییر کوچک.
در واقع آنها در دو قسمت با هم اختلاف دارند. تصویر زیر سکتور صفر دو پارتیشن BitLocker را نشان میدهد.

یک اختلاف در آفست 0x1B به طول 4 بایت و دیگری در آفست 0xB2 به طول 18 بایت. اولی را در MBR دیسک حاوی سیستم عامل میتوانید پیدا کنید ( به نظر می آید برای هر پارتیشن BitLocker  موجود روی سیستم ، شانزده بایت اختصاص داده شده که 4 بایتش همین عدد است ):

من سه پارتیشن BitLocker روی دو دیسک داشتم ( دوتا روی یکی و یکی روی دیگری ) و در MBR دیسکی که ویندوز رویش نصب است سه عدد چهار بایتی را که یکی از موارد اختلاف بود را پیدا کردم (تصویر سمت چپ ). اولی و سومی همان اعداد تصویر بالایی هستن و دومی هم برای تصویر سمت چپ.
عدد 18 بایتی اختلاف دوم هم در همان دیسکی که پارتیشن رویش قرار دارد و در آفست 0x22 بلوکی قرار دارد که با نام FVE_META_DAT شناخته میشود. این بلوک تا حدودی کاری مشابه MFT در NTFS را انجام می دهد.


مشکل
من دو هارد دیسک دارم. روی یکی (Disk0) سه پاتیشن (C, D, E) و روی دیگری (Disk1) یک پاتیشن (F) قرار دارد. پارتیشن F بوسیله BitLocker رمز شده است و Password Recovery را هم گم کرده ام. یک فلش دیسک به دستگاه وصل میکنم و می خواهم یکسری دستوارت DiskPart ( نرم افزار مدیریت دیسک که همراه ویندوز 7 ارائه شده است ) را روی فلش دیسک اجرا کنم. اما اشتباهی این دستورات را به جای disk2 روی disk1 اجرا می کنم. ترتیب دستورات ایگونه است:
1- ابتدا دستور Clean را اجرا میکنم که MBR و سکتور صفر هر پارتیشن را صفر میکند.
2- سپس دستور Create Partition Primary را اجرا میکنم که یک پارتیشن Primary می سازد (در واقع MBR را تنظیم میکند و سکتور صفر را برای پارتیشن جدید با اطلاعات مناسب پر میکند)
حالا متوجه اشتباهم می شوم. ویندوز دیگر پارتیشن F را نشان نمیدهد.
اتفاقی که افتاد این بود که با دستور Clean من MBR دیسک و سکتور صفر F را را پاک کردم اما اطلاعات آن دست نخورده باقی ماند (شکل دوم). با دستور Create Partition Primary هم MBR دوباره ساخته شد و سکتور صفر آن اتفاقا روی محلی قرار گرفت که سکتور صفر پاتیشن قبلی قرار داشت. در واقع سکتور صفر F ، در سکتور 2048 دیسک قرار داشت و پاتیشن از این محل شروع میشد و سکتور 0 دیسک هم برای MBR بود. وقتی MBR دوباره ساخته شد باز هم در سکتور صفر بود و وقتی پارتیشن دوباره ساخته شد اولین سکتورش ، سکتور 2048 دیسک بود (شکل سوم ).

راه حل
ابزارهای مختلفی را امتحان کردم ولی بهترین آنها Paragon Partition Manger ( برای ویرایش سکتورهای پارتیشن ) و HxD ( برای ویرایش و جست و جو در فایل های به صورت هگز ) را مورد استفاده قرار دادم.
من این مشکل را اینگونه حل کردم. 
1- ابتدا در در برنامه DiskPart با دستور create partition primary روی disk1 دوباره MBR دیسک و سکتور صفر را تنظیم کردم. به صورت کاملتر این سلسله از دستورات را اجرا کردم:
diskpart
select disk 1
clear
create partition primary

2- سکتور صفر یکی از پارتیشن های سالم BitLocker روی سیستم را در سکتور صفر پارتیشن جدید کپی کردم. برای این کار در نرم افزار پاراگون، روی پارتیشن سالم راست کلیک کردم و Edit/View Sectors را انتخاب کردم و یه کمک گزینه Save Sectors to File فقط سکتور صفر را ذخیره کردم. سپس روی پارتیشن تازه ساخته شده راست کلیک کردم و Edit/View Sectors را انتخاب کردم و یه کمک گزینه Load File to Sectors و فایلی که ذخیره کرده بودم  روی سکتور صفر پارتیشن جدید ذخیره کردم.
3- در پاراگون و به کمک راست کلیک روی disk 0 و انتخاب Edit/View Sectors به سراغ MBR دیسک 0 رفتم و عدد 4 بایتی اختلاف را پیدا کردم ( متعلق به پاتیشن F پاک شده است ) و در آفست مورد نظر از سکتور صفر پارتیشن جدید کپی کردم (   روی پارتیشن خراب کلیک راست کردم و Edit/View Sectors را انتخاب کردم و عدد را در جای مورد نظر قرار دادم).
4- در HxD و مسیر Extra>Open Disk و انتخاب disk1 و استفاده از ابزار جست وجوی آن در disk1 به دنبال بلوک FVE_META_DAT گشتم ( امضای آنه یعنی -FVE-FS- را جست و جو کردم ) و 18 بایت اختلافی را از آفست 0x22 آن به آفست 0xb2 در سکتور صفر پاتیشن جدید کپی کردم.
5- یک حرف به پارتیشن جدید اختصاص دادم ( در پاراگون راست کلیک روی پارتیشن و انتخاب Assign Drive Letter ) 
6- سیستم را ریستارت کردم.
7- پارتیشن کار می کرد !!!!


نکته:
1- تنها ابزاری که برای بازیابی پارتیشن های BitLocker موجود است  BitLocker Repair Tool است که برای بازیابی به کلید بازیابی یا یکی از اطلاعات معادل نیاز دارد. پس اگر از BitLocker استفاده می کنید حتما Recovery Password  یا یکی از معادل های آن (  RecoveryKey یا KeyPackage ) مربوط به هر پارتیشن را در جای مطمئنی ذخیره کنید تا در صور نیاز از آنها استفاده کنید. من آنها را گم کرده بودم و مجبور به صرف زمان خیلی زیادی شدم. البته شرایط پارتیشن من بسیار خوب بود و اگر آسیب جدیتری می دید شاید امکان بازگردانی نبود.
2- زیاد به مستندات مایکروسافت اعتماد نکنید. مطابقت دقیقی بین آنها و واقعیت وجود ندارد. اغلب نیاز به مهندسی معکوس دارد.

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


مراجع برای مطالعه بیشتر