موقعیت صدای استریو چپ/راست را محاسبه کنید
در DX-Ball ، یک ضربه آجری یک موقعیت صفحه افقی را فراهم می کند. کد صدا آن را به یک مقدار پانینگ چپ/راست تبدیل می کند.
تابع شروع, 0x00406400، یک نتیجه کوتاه از کامپایلر دارد: یک تماس به __ftol(). REA همچنین دستورالعمل ها و تماس گیرندگان خود را باز می گرداند که به نماینده راهی برای بررسی حساب گمشده می دهد.
تازه وارد اين اصطلاحات هستي ؟
-
دستورالعمل ها: مراحل اجرا شده توسط پردازنده ، به شکل قابل خواندن نشان داده شده است مانند
MOVیاADD. - نتیجه Decompiler / pseudocode: تلاش یک ابزار تجزیه و تحلیل برای تبدیل دستورالعمل ها به کد شبیه C. می تواند قطعات را از دست بدهد ، همانطور که در این مثال است.
- تماس گیرنده: تابعی که این یکی را فراخوانی می کند. این نشان می دهد که کدام مقادیر در آن منتقل می شوند.
-
آدرس: یک مکان در برنامه ، نوشته شده در هگزادسیمال ، مانند
0x00406400. - ثابت ها: اعداد ثابت ذخیره شده در برنامه ، به عنوان بایت خام خوانده شده و رمزگشایی شده است.
سه قطعه شواهد ، یک محاسبه
- 01 * دستورالعمل هاورودی عدد صحیحیک خواندن پشته ارزش مورد استفاده توسط دستورالعمل های نقطه شناور را فراهم می کند.
-
02 * تماس گیرندهیک مختصات صفحه نمایشتماس گيرنده ي آجر زده رد ميشه
20 + 30 × tile_x. -
03 * بایت دادهثابت های عددیبایت های مرجع رمزگشایی به
1.5625,500.0و یک مقدار مقیاس.
pan = (x × 1.5625 − 500.0) × scale
در مورد رفتار بپرسید
بعد از اتصال REA به نماینده شما و تنظیم یک ابزار تجزیه و تحلیل برنامه های کد ماشین، ارائه فایل اجرایی محلی و یک سوال:
از کدام ابزار تجزیه و تحلیل استفاده کنم؟
REA برای خواندن برنامه های بومی به یکی از این موارد نیاز دارد:
- Hopper (macOS یا Linux ): راه اندازی REA آن را تشخیص می دهد یا پیشنهاد نصب آن را می دهد. در macOS ، Hopper را یک بار باز کنید و حالت نمایشی را انتخاب کنید یا مجوز را قبل از اولین تجزیه و تحلیل خود فعال کنید.
- Ghidra (macOS یا Linux; تجربی در Windows): رایگان, اما نیاز به Ghidra موجود 12.1.x نصب و 64 بیتی JDK 21 یا جدیدتر.
- IDA (Windows) : برای راه اندازی IDA موجود با ثبت نام MCP.
ببینید راه اندازی تجزیه و تحلیل برنامه های کد ماشین برای مراحل
استفاده از REA برای پیدا کردن چگونه DX-Ball محاسبه موقعیت صدا استریو. محاسبه را توضیح دهید و کد را نشان دهید.
مثال سریع. به نماینده خود مسیر را به DX-Ball 1.07 اجرایی محلی خود بدهید. REA شامل DX-Ball نیست ، بنابراین از نسخه خود استفاده کنید ، یا همان نوع سوال را در مورد یک برنامه کوچک Windows که دارید بپرسید.
چطور می توانم مسیر کامل یک فایل را بدست آورم ؟
- Windows : در File Explorer ، روی فایل کلیک راست کرده و انتخاب کنید کپی به عنوان مسیر. در Windows 10 ، هنگام کلیک راست ، Shift را نگه دارید.
- macOS : در Finder ، روی فایل کلیک راست کنید ، گزینه hold را انتخاب کنید "..." را به عنوان نام مسیر کپی کنید.
- هر سیستم: فایل را به یک پنجره ترمینال بکشید و مسیر آن ظاهر می شود.
نتایج REA را بخوانید
ورودی را بخوانید
MOV EAX, dword ptr [EBP + 0x8]
MOV dword ptr [EBP + -0xc], EAX
FILD dword ptr [EBP + -0xc]
دستورالعمل ها یک استدلال عدد صحیح را بارگذاری می کنند و آن را برای حساب نقطه شناور تبدیل می کنند. این ورودی غایب از اولین نمای شبه کد است.
تماس گیرنده را دنبال کنید
ADD EAX, 0x14
PUSH EAX
CALL 0x00406400
REA تماس گیرنده ضربه آجر را شناسایی می کند. دستورالعمل های قبلی آن مختصات کاشی را با 30 ضرب می کند ؛ اضافه کردن 0x14 (20) موقعیت صفحه نمایش آجر را می دهد.
ثابت های مرجع را بخوانید
0x420068 000000000000f93f → 1.5625
0x420070 0000000000407f40 → 500.0
0x4210a0 000000000000f03f → 1.0
حساب ها به این آدرس ها اشاره می کنند. خواندن بایت ها ارزش های واقعی را فراهم می کند ؛ دستور دستورالعمل به عامل می گوید که چگونه از آنها استفاده می شود.
عملکرد بازیابی شده را بنویسید و بررسی کنید
pan = (double)x;
pan = pan * 1.5625;
pan = pan - 500.0;
pan = pan * dxball_pan_scale;
return (DxBallInt)pan;
با مقیاس 1.0 ، موقعیت صفحه نمایش 0 ، 320 و 640 نقشه به -500 ، 0 و 500 قبل از تبدیل عدد صحیح. محاسبه مرکز صفحه را در مرکز میدان استریو قرار می دهد.
عامل از یافته های REA برای نوشتن C استفاده کرد. چک های جداگانه 3205 ورودی را با تابع اصلی x86 مقایسه کردند و تمام 63 بایت کامپایل شده از تابع کامل را بازتولید کردند.
آن را با باینری خود امتحان کنید
اتصال تجزیه و تحلیل برنامه های کد ماشین ارائه دهنده، سپس به نماینده خود یک فایل اجرایی یا کتابخانه محلی و یک ویژگی برای تحقیق بدهید. سوالات مفید شروع شامل " این فایل چگونه تجزیه می شود ؟ "یا" کدام تابع این عمل منو را مدیریت می کند ؟ ”
اگر قبلا یک نام یا آدرس تابع را می دانید ، می توانید آن را از ترمینال پرس و جو کنید. برای نصب Ghidra پیکربندی شده:
npx -y rea-agents@latest function /absolute/path/to/program main \
--provider ghidra --json
مسیر هدف را جایگزین کنید و main با نام یا آدرس تابع خود. هر فراخوان CLI باینری را وارد و تجزیه و تحلیل می کند ، سپس جلسه خود را بسته می کند. پرس و جوهای MCP نماینده شما در حالی که جلسه باز است ، از باینری وارد شده استفاده می کند.
کد شبه را در کنار دستورالعمل ها و مرجع ها بخوانید. وقتی نتیجه یک تماس یا ارزش حل نشده را ترک می کند ، از آن مکان به عنوان سوال بعدی استفاده کنید.