با سلام خدمت دوستان. همونطور که قول داده بودم، این هفته میخوام مرحله 5 ام رو براتون حل کنم. این چالش طبیعتا از مراحل قبلی سختتره و اینکه شما توی این چالش با یه فایل native روبرو میشید که باید بتونید با تکنیک های دیباگ و تحلیل روند اجرای برنامه، رمز عبور رو پیدا کنید. این فایل بر خلاف فایلهای قبلی، توسط یه Packer، پک شده و خب این کار تقریبا جلوی تحلیل Static رو گرفته و این کارو به شدت دشوار میکنه. پس اینجا توی این مرحله شما نحوه Unpack کردن فایلهای باینری رو هم یاد میگیرید که یکی از چالش های بهروز دنیا توی مبحث Reverse و تحلیل بدافزار هست.
چالش شماره 5 : Demo
فایلهای مربوط به این چالش رو میتونید از اینجا دانلود کنید.
پیش نیازها:
- ویندوز 7 یا بالاتر
- دیباگر x64dbg یا هر دیباگر دیگه ای
- ابزار IDAPro
- ابزار 010 یا HxD
خب شما یک فایل زیپ دارید که داخلش دوتا فایل هست. یه فایل exe که هدف اصلی سوال هست و یک فایل Message که اطلاعاتی در مورد چالش به ما میده. در ابتدا وقتی فایل Message رو باز میکنیم به ما گفته شده که «یه نفر توی تیم Flare، میخواد مارو با مهارت هایی که توی طراحی 3 بعدی داره، تحت تاثیر قرار بده. به نظر خالیه. ببینید میتونید چیزی بفهمید، یا اینکه ما اونارو اخراج کنیم».
خب وقتی که ما فایل exe رو باز میکنیم، میبینیم که یه پیغام error میاد روی صفحه. البته اگه شما اهل بازی باشید، شاید این پیغام رو نبینید و برنامه براتون به راحتی باز بشه.
خب این پیغام رو که میبینیم، اگه اهل بازی و گیم، بوده باشین، براتون آشنا میاد این متنی که نوشته شده. در اصل این پیغام، داره میگه که من نتونستم کتابخونه DirectX9 رو پیدا کنم. البته میتونید با سرچ کردن این پیغام توی گوگل، بفهمید که مشکل چیه.
خب حالا برا اینکه این برنامه اجرا بشه، باید ما DirectX9 رو نصب کنیم. یه راه دیگه هم هست که بیایم و فایل d3dx9_43.dll که کتابخونه اصلی Directx9 هست رو دانلود کنیم از سایت dll-files.com و میذاریم کنار این فایل.
خب بعد از اینکه نسخه متناسب با ویندوزتون رو دانلود کردید، فایلش رو میذارید کنار فایل exe و اونوقت وقتی اجرا میکنید، میبینید که یه لوگوی آبی شرکت Flare-on داره میچرخه و هیچ اتفاق خاصی هم نمیافته. خب برا اینکه بفهمیم مساله چه جوری حل میشه، بیایم فایل رو آنالیز کنیم. خب من اول این فایل رو میخوام ببینیم که چی هست اصن ماهیتش و بفهمم که 64 بیتیه یا 32 بیتی. برا این کار میتونیم فایل رو با یه Hex Editor باز کنید که خب من اینجا از نرم افزار 010Editor استفاده میکنم. وقتی فایل رو میبریم توی Hex Viewer ، من یه چیز عجیب غریب که تا حالا ندیدیم، میبینم، و اونم این عکسیه که پایینه و اون قسمتی که دورش خط کشیدم.
خب ببینید، ابتدای تمام فایل های exe ، ما دو حرف MZ رو داریم که خب برای فایلهای اجرایی ویندوز، این طبیعیه، بعد از MZ ما یه سری بایت دیگه داریم که میاد و اطلاعاتی رو در مورد فایل EXE نشون میده و بعد از اینها ما هدر PE رو داریم. این چیزایی که گفتم برای یه فایل exe معمولی و سالم هست. ولی اینجا توی عکس بالا میبینید که MZ اومده بعدش یه 21 اومده و بعدش PE شروع شده. این خیلی مشکوکه، چونکه اصن این 21 چیه؟ و بعدم اینکه بین MZ و PE همیشه حداقل 30 تا بایت هست که خب اینجا بینشون فقط یه 21 نوشته شده.
من توی عکس پایین یه فایل exe معمولی مثلا notepad رو توی hex editor باز میکنم، تا متوجه بشید اختلاف رو.
خب ببینید، این فایل notepad.exe هست که خب میبینید که اول فایل با هدر MZ شروع شده، و بعد از یه گپ، هدر PE شروع شده. که البته اون رشته معروف This program cannot be run in DOS mode هم همیشه توی فایلهای exe ویندوزی هست. که خب ما اینو توی فایل 4k.exe ندیدیم. اینجا من نمیخوام براتون هدر PE رو توضیح بدم و ساختار یه فایل exe رو توی ویندوز بگم اما میتونید در مورد فایلهای PE توی اینترنت جستجو کنید و بخونید.
خب حالا ما فهمیدیم که این فایل یه مشکلی داره و دستکاری شده. البته اینجا بگم که اگه شما با مفاهیم Packing آشنا باشید میتونید شک کنید که این فایل احتمالا pack شده.
خب من یه مقدار در مورد Packing بگم براتون:
روال Packing
پک کردن به این مفهومه که یه فایل اجرایی رو برمیدارن و و یه سری فشرده سازی داخلش انجام بدن که حجمش کم بشه. البته این اولین تکنیک اولین بار که استفاده شد برا فشرده سازی فایل بود ولی بعدا فهمیدن که میشه از این تکنیک پک کردن برای مخفی سازی روال اجرای برنامه هم استفاده کرد که خب بدافزارها از این تکنیک استفاده میکنن. شما وقتی یه فایل رو پک میکنید در حقیقت دارید کد اصلی برنامه رو مخفی میکنید و این باعث میشه که آنتی ویروس نتونه فایل رو آنالیز کنه و همچنین این کار باعث میشه که Reverse کردن خیلی به مراتب سخت تر بشه. وقتی یه فایل اجرایی رو پک میکنن، در حقیقت قسمتی که کد برنامه داخلشه که همون Code section هست رو Encode یا Encrypt میکنن و بعد میان اون Decoder یا Decrypter رو میذارن ابتدای کد اجرایی. بعد وقتی که شما فایل رو اجرا میکنید، در ابتدا اون Decoder اجرا میشه و میاد کد اصلی برنامه رو از حالت کد شده در میاره و به حالت قبل برمیگردونه و بعدش کنترل اجرای برنامه رو میده به دست کد اصلی برنامه. ببینید این عکس پایین تمام حرفایی که زدم رو بهتر بیان میکنه:
خب ببینید فایل اصلی سمت چپ، یه فایل معمولی exe هست که هدر PE رو داره و section های مختلفش رو میبینید که سر جاشون هستن. مثلا .text هست که خب کد برنامه داخلشه، و data و rsrc هم موجوده. عملیات packing اومده انجام شده روی فایل و همونطور که توی عکس وسطی میبینید، قسمت text پک شده و رمزنگاری شده و بقیه قسمت ها هم به همین صورت. اما توی تصویر میبینید که یه PE Header سیاه رنگ داره. این به این معنی هست که اون PE Header اصلی فایل که توی سمت چپ با رنگ آبی مشخص شده، توی فایل پک شده، هیچ استفاده ای ازش نمیشه و اون نرم افزاری که عملیات پکینگ رو انجام میده، خودش برا خودش یه PE Header داره. خب توی عکس وسط میبینید که در پایین ما یه بلوک اضافه داریم نسبت به فایل سمت چپ. به نام Decompression Stub وجود داره. این در حقیقت همون DE compressor هست. یعنی اینکه شما وقتی فایل پک شده رو اجرا میکنید، کنترل برنامه میاد در ابتدا روی این DE Compressor و اینجا یه کدی هست که میاد و اون قسمت های بالایی که Pack شدن رو استخراج میکنه، رمزگشایی میکنه و تمام اینها رو توی RAM میبره و در نهایت توی RAM ما تصویر سمت راست رو داریم، دقیقا همون فایل اصلی که سمت چپ میبینید رو داریم. که خب بعد از اینکه فایل کاملا unpack شد توی رم، کنترل اجرای برنامه، از اون DE compressor، میره به داخل text برنامه و برنامه روال اجرای خودشو به دست میاره.
روال Unpacking
حالا فرض کنید من یه برنامه دارم و یه پکر هم خودم نوشتم که صرفا میاد و هر بایت از کد من رو XOR میکنه با عبارت 0xAB و خب الان کد برنامه من پک میشه. حالا برا اینکه کدم رو بتونم Unpack باید یه DE compressor بذارم توی برنامه خودم که بیاد شروع کنه همون بایت کدهایی که الان، رمز شده رو دوباره با همون 0xAB بیام XOR کنم تا برسم به کد اصلی برنامه و بعدش بیام و کنترل اجرای برنامه رو بسپرم به دست ابتدای کد رمزگشایی شده. خب این یه مثال ساده هست که میزنم تا بفهمید که چه اتفاقی میافته. حالا برا این قضیه، فرض کنید من این برنامه خودم رو بردم توی آیدا و میخوام استاتیک آنالیز کنم. با چی مواجه میشم توی آیدا؟ با یه تکه کد که یه حلقه داره و داره دونه دونه بایت های کد رو از یه جایی میخونه و اونا رو با 0xAB عملیات XOR میکنه و ذخیره میکنه توی یه بافر. و در انتها که این حلقه تموم میشه یعنی چی؟ یعنی کد من از حالت رمز خارج شده و من مطمعنم که الان کد اصلی برنامه رو دارم و فقط کافیه که کنترل برنامه بره به سمت کد من. که این کار توی پکرها، با یه دستور JUMP و یا RET انجام میشه.
خب ببینید ما پکرهای زیادی داریم که از معروف ترین پکری که میتونید استفاده کنید و مجانی هم هست UPX هست که خب خیلی راحته Unpack کردنش. از پکرهای خیلی خیلی پیچیده هم میتونم به غولی به نام Themida اشاره کنم که واقعا Reverse کردنش به شدت سخته. چون از تکنیک هایی استفاده میکنه که واقعا شما زمان آنالیز گیج میشید و خسته.
آنالیز ایستای فایل در آیدا
خب با توجه به چیزایی که گفتیم، الان ما متوجه شدیم که این فایلی که باهاش طرفیم، پک شده. از کجا فهمیدیم؟ از اونجا که اولا هدر فایل دستکاری شده بود، که خب توی دنیای واقعی هیچ پکری، نمیاد این کار رو بکنه و انقدر ضایع هدر فایل رو برداره یه 21 بذاره. البته packing و unpacking خودش یه دنیاییه توی حوزه Reverse که واقعا الان تبدیل شده به یک چالش.
من الان میام و این فایل رو توی آیدا باز میکنم و میرم داخل تب Imports و میبینیم که هیچی نیست اونجا. طبق صحبتی که از Import ها توی پست قبلی گفتم، اصلا بعیده که یه فایل اجرایی، Import نداشته باشه. خب از اونجایی که Import های یه برنامه میتونه اطلاعات خیلی مفیدی به کسی که داره مهندسی معکوس میکنه بده، ولی ما اینجا هیج چیزی نداریم. وقتی که این فایلو با آیدا باز میکنید، آیدا چندتا پیغام ارور به شما میده که میگه نمیتونم هدرهای برنامه رو توی آدرس های مشخص بشناسم که خب خود این قضیه یه نشونه ای از اینه که برنامه پک شده. خب همه این پیغام هارو رد کنید و وقتی آیدا باز شد کلا یه تابع Start بیشتر به شما نشون نمیده چون فقط تونسته یه تابع رو شناسایی کنه. خب این تابع رو توی Graph Mode باز کردیم و عکس زیر رو داریم الان:
خب ببینید الان ما با یه برنامه ای مواجه هستیم که پک شده و هیچ اطلاعاتی در مورد این برنامه نداریم. مثلا اگه شما کد برنامه رو توی آیدا ببینید، هیچ تابعی نمیبینید، همه کد پر از Jump و XOR هست و خب ما هیچ چیزی نداریم که بتونیم این برنامه رو استاتیک انالیز کنیم. خب دوتا راه داریم: یکی اینکه بیایم و برنامه رو توی آیدا بررسی کنیم ببینیم کجا عملیات Unpacking تموم میشه، و بعدش اون آدرس رو که پیدا کردیم بریم توی دیباگر و اونجا همون آدرس رو Breakpoint بذاریم و شروع کنیم از اونجا آنالیز کردن. یه راه دیگ ام اینه که همه این کارا رو که گفتم توی دیباگر انجام بدیم.
خب طبق چیزی که توی قسمت روال unpacking گفتیم، الان ما باید دنبال یه حلقه و در اصل یک روال باشیم برای اینکه ببینیم کجا تموم میشه این روال و کجا کنترل برنامه میره به سمت کد اصلی. همونجور که گفتم، این کار با یه دستور JUMP و یا RET انجام میشه اصولا.
خب ببینید توی این گرافی که از کد میبینیم توی آیدا، الان همینجوری این Node ها به هم وصل شدن و هی از یه جایی به جای دیگه رفتن، دور زدن و هی تشکیل حلقه های مختلفی دادن. پس مشخصه که عملیات آنپک کردن رو داره انجام میده، شما یه سری jump و xor هم میبینید اما یه جایی توی کد برای من قابل توجه هست و اونم یه Node هست که به هیچ جا نرفته و در اصل انشعابی ازش بیرون نیومده.
ببینید تمام این Node ها انشعاب دارن و از جاهی مختلفی به جاهای دیگه رفتن. اما این جایی که با فلش مشخص کردم، خیلی واضحه که هیچ انشعابی ازش خارج نشده، اینجا رو زوم میکنم روش و خب میبینم که یه دستور ret انتهای این Node هست که هیچ جای دیگهای هم دستور رو توی این گراف نداریم. پس من اینجا مطمئن میشم که انتهای کار unpacking همینجاس.
خب حالا کافیه آدرس این ret رو پیدا کنیم و بریم توی محیط دیباگ و اونجا بیایم توی همین آدرس یه Breakpoint بذاریم.
خب ببینید آدرس این دستور ret رو مشخص کردم. دیباگر رو باز میکنم و میرم توی این آدرس. در همون ابتدای اجرا توی دیباگر، این آدرس رو Breakpoint میذارم.
آنالیز فایل در دیباگر
خب همونطور که توی عکس پایین میبینید الان توی دیباگر برنامه رو باز کردیم و دقیقا توی همون آدرس ما یه Breakpoint گذاشتیم. و بعد از اون برنامه رو اجرا میکنیم تا برنامه به محض رسیدن به دستور ret متوقف بشه.
خب وقتی که اجرا کردیم توی دیباگر و برنامه متوقف میشه دقیقا توی ret. حالا از اینجا ما میدونیم که بعد از این دستور ret ، ما میرسیم به کد اصلی برنامه. پس با زدن دکمه f8 یه قدم میریم جلو تا برسیم بعد از Ret. و بله اینجایی که میبینید و الان هستیم در حقیقت همون کد اصلی برنامه هست.
خب ببینید برا اینکه بهتون نشون بدم که چه اتفاقی افتاده، بیاین برنامه رو توی دیباگر ببندید، و از اول اجرا کنید و بیایم این آدرس رو ببینیم چی داخلش هست. حب الان بعد از عملیات Unpacking، ما یه دستور mov رو میبینیم توی این آدرس 00420000. حالا برنامه رو میبندیم دوباره میاریم توی دیباگر و از همون اول میایم توی این آدرس و خب میبینید که یه دستور دیگه هست که البته خب این اصن دستور نیست، اینا رمز شدن و دیباگر نمیتونه تشخیص بده این بایت کد ها رو. خب ببینید که تمام این کدها رمز شدن و وقتی که برنامه رو اجرا میکنید و بعد از دستور ret که اینجا رو ببینید، تمام این دستورات رمزگشایی شدن و توی عکس بالایی میبینیم.
خب اینم از این. حالا ما تونستیم یه فایل رو آنپک کنیم. البته این خیلی خیلی سادس. پکرها توی دنیای واقعی خیلی پیچیده تر هستند و به این راحتی نمیشه آنپکشون کرد.
خب تا الان فقط برنامه آنپک شد و هیچ اتفاق خاصی هنوز نیافتاده و ما باید رمز رو پیدا کنیم. ببینید ما الان فقط میدونیم که این برنامه داره از DirectX استفاده میکنه. ببینید من نمیدونم واقعا باید دنبال چی بگردیم. و چه جوری رمز به ما نشون داده میشه. من اومدم و دونه دونه توابعی که الان توی دیباگر میبینیم رو بررسی کردم و trace کردم تا به جواب رسیدم. خب ببینید الان ما توی آدرس 00400000 هستیم من با زدن f8 مرحله به مرحله میرم جلو تا یه چند خط پایین تر به یه حلقه میرسم. این حلقه خیلی طولانیه. برا اینکه از این حلقه رد بشم و بفهمم این حلقه کارش چی هست، یه دونه Breakpoint میذارم اولین خط بعد از حلقه تا حلقه که تموم شد دوباره بتونیم خط به خط trace کنیم.
منظورم همین je هست که با فلش مشخص کردم. اینجا یه حلقه هست. ما یه Breakpoint گذاشتیم دقیقا خط بعدیش که یه call هست و بعد f9 رو میزنیم تا برنامه اجرا بشه و وقتی به call رسید متوقف میشه. خب ببینید عکس بالا قبل از اینه که برنامه حلقه رو رد کنه. اونجایی که با فلش آبی مشخص کردم رو ببینید. حالا f9 رو میزنیم تا برنامه حلقه رو تموم کنه، و برسه و به اون call که با قرمز مشخص شده.
ببینید اونجایی که قرمزه. همون فلش اولی. این همون عکس قبلیه ولی بعد از اجرای اون حلقه. همونطور که میبینید اون call هایی که توی عکس قبلی اسم نداشتن و فقط حاوی آدرس بودن ولی الان بعد از اون حلقه میبینید که اسم گرفتن. خب این میخواد چیو به ما بگه؟ اینجا میخواد بگه که توی این حلقه داره Import Table ساخته میشه و در حقیقت بازسازی میشه. پکرها میان و import table رو هم رمز میکنن و بعد به این صورت رمزگشایی میکنن. در مورد Import Table توی پست قبلی گفتم.
خب بریم ادامه کار. الان میبینیم که یه تابع Direct3DCreate9 رو فراخوانی میکنه. من حقیقتا اصلا تا به حال با directX کار نکردم و اصلا نمیدونم چی هست. ولی خب اسم این توابع رو دونه دونه سرچ کردم و کلی هم در مورد کار با directX خوندم ولی خب چیز خاصی دستگیرم نشد. خب این تابع میاد و یه آبجکت directX میسازه و ادامه میده. خب در ادامه میبینیم که اومده و یه تابع CreateWindow رو صدا زده که خب میخواد یه پنجره بسازه. این تابع یه پنجره میسازه که اسمش رو هم گذاشته demo که وقتی برنامه رو اجرا کنید میبینید که اون بالا title برنامه رو زده demo. خب اینم از این حالا ادامه بدیم.
خب ببینید همزمان وقتی داریم خط به خط trace میکنیم، برنامه هم داره مرحله به مرحله اجرا میشه. من میخوام بدونم که چه زمانی اون لوگوی flare روی پنجره نشون داده میشه. خب پس من هر خطی که پیش میرم اون پنجره برنامه رو که بازه نگاه میکنم. الان عکس پایین رو ببینید:
ببینید فلش قرمز پایینی رو. پنجره ساحته شده و اسمش هم demo هست ولی چیزی داخلش نیست و پنجره سفیده. خب ببینید هنوز اون دستور call که با فلش مشخص کردم اجرا نشده. ولی وقتی این دستور اجرا میشه دوباره پنجره برنامه رو میبینیم:
همونطور که میبینید، اون لوگوی flare اومد و الان پنجره ساخته شد. پس این اتفاقات همه توی تابع 42038A میافته. خب بریم داخل این تابع ببینیم چه خبره. اینجایی که هستیم الان یعنی همین ابتدای این call یه breakpoint میذاریم ولی از نوع سخت افزاری و برنامه رو ریستارت میکنیم و f9 میزنیم تا برسیم سر این تابع و بعد f7 رو میزنیم تا بریم داخل این تابع.
خب حالا یه نکته دیگه بگم:
الان توی عکس بالا یه تابع GetAsyncKeyState رو هم میبینیم که اومده ریخته شده داخل esi و بعد هم عدد 1B رفته داخل پشته و این تابع فراخوانی شده. این تابع وضعیت فشار داده شدن یه کلید از صفحه کلید رو برمیگردونه. الان 1B در حقیقت کد کلید Esc هست که میتونید داکیومنت این تابع رو توی MSDN بخونید. خب اینجا میاد بررسی میکنه که اگه این کلید فشار داده شد، از برنامه خارج شو. همونجور که میبینید اگه ax یه مقدار غیر صفر داشته باشه، برنامه میره و به اون ret آخری میرسه و برنامه تموم میشه.
و اگه که این دکمه Esc فشار داده نشه، برنامه دوباره اون تابع 42038A رو اجرا میکنه. یعنی یه حلقه بی نهایت داریم اینجا که تا زمانی که دکمه Esc فشار داده نشه، اون تابع رو اجرا میکنه و اون تابع هم این لوگو رو به نمایش در میاره.
خب میایم ادامه کار دیباگر رو ریستارت میکنیم تا برسیم سر تابع 42038A و میریم داخل تابع تا ببینیم چه خبره.
خب ببینید الان داخل این تابع که شدیم، یه سری call میبینیم. من دونه دونه میام پایین و دوباره نگاه میکنم ببینم با اجرای کدوم تابع، اون لوگو نشون داده میشه. دقیقا کاری که بالا کردیم.
خب میفهمیم که تابع آخری وقتی اجرا میشه، که این تابع تو عکس پایین مشخصه.
خب ببینید این تابع رو که من داخلش میرم میبینم که دیگه از محیط کد فایل exe بیرون میایم و وارد همون d3d9.dll میشیم. یعنی این تابع در حقیقت یه تابع از این کتابخونه هست. ببینید قبل از این تابع هم یه سری تابع D3DXMatrixMultiply و اینا هستن که برا کتابخونه DirectX هستن اجرا میشن. من نمیفهمم اینا چی هستن و دارن چیکار میکنن. من تمام این توابع رو سرچ کردم ولی چیزی سر در نیوردم چون همش مربوط به مباحث سه بعدی و اینا هست. من اومدم چیکار کردم؟ برگشتم و دونه دونه توابعی که بود رو رفتم داخلش ببینم چیزی ازشون در میاد یا نه. حالا میریم سراغ تابع اصلی. الان این تابع 42038A که داخلش اون لوگو به نمایش در میاد و الان داخلش هستیم رو من اسمشو میذارم تابع final و حالا برمیگردیم توی کد اصلی برنامه. برنامه رو ریستارت میکنیم و میایم سر این تابعی که تو عکس مشخص کردم.
این تابعی که با فلش مشخص کردم رو من وقتی رفتم داخلش، یه سری call میبینیم. من بعد از کلی trace کردن، یه چیزی برام جالب شد داخل این تابع. اینجا میخوام بهتون بگم که چه نکات ریزی ممکنه وجود داشته باشه که بهش دقت نمیکنیم.
من اینجا ابتدای این تابع، دوتا call پشت سر هم میبینم، که توی عکس پایینی مشخص کردم اینارو. ببینید:
این دوتا call دقیقا یه تابع هستن. یعنی یه تابع دوبار فراخوانی شده ولی با پارامترهای مختلف. و ببینید توی عکس اونجا که عدد 1 رو نوشتم، اومده eax که در حقیقت همون مقدار بازگشتی تابع هست رو ریخته توی متغیر 430050 و بعد دوباره وقتی تابع رو برا بار دوم صدا زده دوباره مقدار بازگشتیشو ریخته توی 430054 یعنی دوبار این تابع رو صدا زده، و هر با مقدار بازگشیتشو توی این دوتا متغیر ذخیره کرده.
خب حالا این دوتا متغیر رو توی ذهنتون داشته باشید تا بریم سراغ همون تابع final چرا؟ چونکه من گفتم خب ببینیم این متغیرها کجا ازشون استفاده شده؟ چرا این تابع رو دوبار صدا زده؟
خب رفتم توی تابع final و دیدم بله اینا اونجا دارن استفاده میشن.
خب نگاه کنین اینجا ما داریم میبینیم که یکی از اون متغیرها، داره استفاده میشه اینجا. من گفتم خب الان ما دوتا متغیر داریم که توی تابع قبلی پر شدن و جفتشون هم قطعا از یه نوع هستن. چونکه خروجی یه تابع یکسان هستن. گفتم بذار اینجا جای 430050 اون یکی متغیر رو بذارم یعنی 430054 رو.
خب این خط روش دابل کلیک میکنیم تا بتونیم کدش رو تغییر بدیم و آدرس رو عوض کنیم که خب توی عکس پایین میبینید:
خب و بعدش من هرچی BreakPoint گذاشته بودم رو حذف کردم و کد رو اجرا کردم ببینم چه تغییری رخ میده تو برنامه. که خب وقتی اجرا کردم، دیدم رمز نشون داده شد.
خب ببینید اینجا در حقیقت اون متغیرها یکیشون همون لوگوی flare بود که نشون داده میشد، یکیشون هم همین رمز بود که خب به صورت پیش فرض اون اولی رو میفرستاد توی تابع و ما با عوض کردنش، تونستیم اینو ببینیم.
این چالش واقعا خیلی خاص بود. چونکه برا حلش ما باید یا خیلی دقت میکردیم و با آزمون و خطا میرفتیم جلو یا اینکه میومدیم میرفتیم میخوندیم که چه جوری با DirectX یه عکس متحرک میسازن. که خب کار سختی بود.