Υπολογίστε τη στερεοφωνική θέση του ήχου αριστερά/δεξιά
Στο DX-Ball, το χτύπημα ενός τούβλου παρέχει μια οριζόντια θέση στην οθόνη. Ο κώδικας ήχου τη μετατρέπει σε μια τιμή στερεοφωνικής θέσης αριστερά/δεξιά.
Η αρχική συνάρτηση, 0x00406400, έχει ένα σύντομο αποτέλεσμα απομεταγλώττισης: μια κλήση στο __ftol(). Το REA επιστρέφει επίσης τις εντολές της και τις καλούσες συναρτήσεις, που δίνουν στον βοηθό έναν τρόπο να διερευνήσει τις αριθμητικές πράξεις που λείπουν.
Βλέπετε πρώτη φορά αυτούς τους όρους;
-
Εντολές: τα βήματα που εκτελεί ο επεξεργαστής, σε αναγνώσιμη μορφή όπως
MOVήADD. - Αποτέλεσμα απομεταγλώττισης / ψευδοκώδικας: η προσπάθεια ενός εργαλείου ανάλυσης να μετατρέψει τις εντολές ξανά σε κώδικα που μοιάζει με C. Μπορεί να παραλείψει τμήματα, όπως σε αυτό το παράδειγμα.
- Καλούσα συνάρτηση: μια συνάρτηση που καλεί αυτήν. Δείχνει ποιες τιμές μεταβιβάζονται.
-
Διεύθυνση: μια θέση στο πρόγραμμα, γραμμένη σε δεκαεξαδική μορφή, όπως
0x00406400. - Σταθερές: σταθεροί αριθμοί αποθηκευμένοι στο πρόγραμμα, που διαβάζονται ως ακατέργαστα bytes και αποκωδικοποιούνται.
Τρία στοιχεία, ένας υπολογισμός
- 01 · ΕντολέςΜια ακέραια τιμή εισόδουΜια ανάγνωση από τη στοίβα παρέχει την τιμή που χρησιμοποιούν οι εντολές κινητής υποδιαστολής.
-
02 · Καλούσα συνάρτησηΜια συντεταγμένη οθόνηςΗ καλούσα συνάρτηση που χειρίζεται το χτύπημα του τούβλου μεταβιβάζει
20 + 30 × tile_x. -
03 · Bytes δεδομένωνΟι αριθμητικές σταθερέςΤα bytes στα οποία γίνεται αναφορά αποκωδικοποιούνται ως
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 και JDK 21 ή νεότερο, 64 bit.
- IDA (Windows): για υπάρχουσα εγκατάσταση IDA με καταχώριση MCP.
Δείτε τη ρύθμιση ανάλυσης εγγενούς κώδικα για τα βήματα.
Χρησιμοποιήστε το REA για να βρείτε πώς το DX-Ball υπολογίζει τη στερεοφωνική θέση του ήχου. Εξηγήστε τον υπολογισμό και δείξτε τον κώδικα.
Παράδειγμα προτροπής. Δώστε στον βοηθό σας τη διαδρομή προς το τοπικό σας εκτελέσιμο DX-Ball 1.07. Το REA δεν περιλαμβάνει το DX-Ball, οπότε χρησιμοποιήστε το δικό σας αντίγραφο ή κάντε την ίδιας μορφής ερώτηση για ένα άλλο μικρό πρόγραμμα Windows που διαθέτετε.
Πώς βρίσκω την πλήρη διαδρομή ενός αρχείου;
- Windows: στην Εξερεύνηση αρχείων, κάντε δεξί κλικ στο αρχείο και επιλέξτε Copy as path. Στα Windows 10, κρατήστε πατημένο το Shift ενώ κάνετε δεξί κλικ.
- macOS: στο Finder, κάντε δεξί κλικ στο αρχείο, κρατήστε πατημένο το Option και επιλέξτε Copy "…" as Pathname.
- Σε κάθε σύστημα: σύρετε το αρχείο σε ένα παράθυρο τερματικού και θα εμφανιστεί η διαδρομή του.
Διαβάστε τα αποτελέσματα του 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
Οι αριθμητικές πράξεις αναφέρονται σε αυτές τις διευθύνσεις. Η ανάγνωση των bytes παρέχει τις πραγματικές τιμές· η σειρά των εντολών δείχνει στον βοηθό πώς χρησιμοποιούνται.
Γράψτε και ελέγξτε την ανακτημένη συνάρτηση
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. Ξεχωριστοί έλεγχοι συνέκριναν 3,205 εισόδους με την αρχική συνάρτηση x86 και αναπαρήγαγαν και τα 63 μεταγλωττισμένα bytes της πλήρους συνάρτησης.
Δοκιμάστε το με το δικό σας δυαδικό αρχείο
Συνδέστε έναν πάροχο ανάλυσης εγγενούς κώδικα και δώστε στον βοηθό σας ένα τοπικό εκτελέσιμο ή μια βιβλιοθήκη και μια λειτουργία προς διερεύνηση. Χρήσιμες αρχικές ερωτήσεις είναι «Πώς αναλύεται αυτό το αρχείο;» ή «Ποια συνάρτηση χειρίζεται αυτή την ενέργεια του μενού;»
Αν γνωρίζετε ήδη ένα όνομα ή μια διεύθυνση συνάρτησης, μπορείτε να υποβάλετε ερώτημα από το τερματικό. Για μια ρυθμισμένη εγκατάσταση Ghidra:
npx -y rea-agents@latest function /absolute/path/to/program main \
--provider ghidra --json
Αντικαταστήστε τη διαδρομή στόχου και το main με το δικό σας όνομα ή διεύθυνση συνάρτησης. Κάθε κλήση CLI εισάγει και αναλύει το δυαδικό αρχείο και μετά κλείνει τη συνεδρία της. Τα ερωτήματα MCP του βοηθού σας επαναχρησιμοποιούν το εισαγμένο δυαδικό αρχείο όσο αυτή η συνεδρία παραμένει ανοιχτή.
Διαβάστε τον ψευδοκώδικα μαζί με τις εντολές και τις αναφορές. Όταν ένα αποτέλεσμα αφήνει μια κλήση ή τιμή ανεπίλυτη, χρησιμοποιήστε αυτή τη θέση ως την επόμενη ερώτηση.