Unpacking binaries

Υποστήριξη HackTricks

Αναγνώριση πακεταρισμένων δυαδικών αρχείων

  • έλλειψη συμβολοσειρών: Είναι κοινό να βρείτε ότι τα πακεταρισμένα δυαδικά αρχεία δεν έχουν σχεδόν καμία συμβολοσειρά

  • Πολλές μη χρησιμοποιούμενες συμβολοσειρές: Επίσης, όταν ένα κακόβουλο λογισμικό χρησιμοποιεί κάποιο είδος εμπορικού πακετάρη, είναι κοινό να βρείτε πολλές συμβολοσειρές χωρίς διασταυρώσεις. Ακόμα και αν αυτές οι συμβολοσειρές υπάρχουν, αυτό δεν σημαίνει ότι το δυαδικό αρχείο δεν είναι πακεταρισμένο.

  • Μπορείτε επίσης να χρησιμοποιήσετε κάποια εργαλεία για να προσπαθήσετε να βρείτε ποιος πακετάρης χρησιμοποιήθηκε για να πακετάρει ένα δυαδικό αρχείο:

Βασικές Συστάσεις

  • Ξεκινήστε να αναλύετε το πακεταρισμένο δυαδικό αρχείο από το κάτω μέρος στο IDA και προχωρήστε προς τα πάνω. Οι αποπακετάρηδες εξέρχονται μόλις ο αποπακεταρισμένος κώδικας εξέρχεται, οπότε είναι απίθανο ο αποπακετάρης να περάσει την εκτέλεση στον αποπακεταρισμένο κώδικα στην αρχή.

  • Αναζητήστε JMP's ή CALLs σε καταχωρητές ή περιοχές της μνήμης. Επίσης, αναζητήστε συναρτήσεις που σπρώχνουν παραμέτρους και μια διεύθυνση και στη συνέχεια καλούν retn, γιατί η επιστροφή της συνάρτησης σε αυτή την περίπτωση μπορεί να καλέσει τη διεύθυνση που μόλις σπρώχτηκε στο στοίβα πριν την καλέσει.

  • Βάλτε ένα breakpoint στο VirtualAlloc καθώς αυτό εκχωρεί χώρο στη μνήμη όπου το πρόγραμμα μπορεί να γράψει αποπακεταρισμένο κώδικα. "τρέξτε στον κώδικα χρήστη" ή χρησιμοποιήστε το F8 για να πάρετε την τιμή μέσα στο EAX μετά την εκτέλεση της συνάρτησης και "ακολουθήστε αυτή τη διεύθυνση στο dump". Ποτέ δεν ξέρετε αν αυτή είναι η περιοχή όπου θα αποθηκευτεί ο αποπακεταρισμένος κώδικας.

  • VirtualAlloc με την τιμή "40" ως επιχείρημα σημαίνει Ανάγνωση+Γράψιμο+Εκτέλεση (κάποιος κώδικας που χρειάζεται εκτέλεση θα αντιγραφεί εδώ).

  • Κατά την αποπακετοποίηση του κώδικα είναι φυσιολογικό να βρείτε πολλές κλήσεις σε αριθμητικές λειτουργίες και συναρτήσεις όπως memcopy ή VirtualAlloc. Αν βρεθείτε σε μια συνάρτηση που προφανώς εκτελεί μόνο αριθμητικές λειτουργίες και ίσως κάποια memcopy, η σύσταση είναι να προσπαθήσετε να βρείτε το τέλος της συνάρτησης (ίσως ένα JMP ή κλήση σε κάποιον καταχωρητή) ή τουλάχιστον την κλήση στην τελευταία συνάρτηση και να τρέξετε εκεί καθώς ο κώδικας δεν είναι ενδιαφέρον.

  • Κατά την αποπακετοποίηση του κώδικα σημειώστε όποτε αλλάζετε περιοχή μνήμης καθώς μια αλλαγή περιοχής μνήμης μπορεί να υποδηλώνει την έναρξη του αποπακεταρισμένου κώδικα. Μπορείτε εύκολα να κάνετε dump μια περιοχή μνήμης χρησιμοποιώντας το Process Hacker (process --> properties --> memory).

  • Κατά την προσπάθεια αποπακετοποίησης του κώδικα, ένας καλός τρόπος για να γνωρίζετε αν ήδη εργάζεστε με τον αποπακεταρισμένο κώδικα (έτσι ώστε να μπορείτε απλά να το κάνετε dump) είναι να ελέγξετε τις συμβολοσειρές του δυαδικού αρχείου. Αν σε κάποιο σημείο κάνετε ένα άλμα (ίσως αλλάζοντας την περιοχή μνήμης) και παρατηρήσετε ότι προστέθηκαν πολλές περισσότερες συμβολοσειρές, τότε μπορείτε να γνωρίζετε ότι εργάζεστε με τον αποπακεταρισμένο κώδικα. Ωστόσο, αν ο πακετάρης περιέχει ήδη πολλές συμβολοσειρές, μπορείτε να δείτε πόσες συμβολοσειρές περιέχουν τη λέξη "http" και να δείτε αν αυτός ο αριθμός αυξάνεται.

  • Όταν κάνετε dump ένα εκτελέσιμο από μια περιοχή μνήμης, μπορείτε να διορθώσετε κάποιες κεφαλίδες χρησιμοποιώντας το PE-bear.

Υποστήριξη HackTricks

Last updated