Site hosted by Angelfire.com: Build your free website today!

IDA: Description

Is Deeply Awesome...

by human_thought

Έκθεση για το project:Cracking Tools 

  Το IDA είναι ο σημαντικότερος disassembler που χρησιμοποιούν οι crackers.Έχει μεγάλη αξία για όλους
εμάς και είναι πραγματικά ένα εργαλείο που βοηθάει σημαντικά την διαδικασία του cracking,ακόμα και αν
το εκτελέσιμο είναι πακαρισμένο.Για αυτό το λόγο έκανα μία προσπάθεια να το περιγράψω στο πλαίσιο του 
3ου Project της M.a.s.k. για τα cracking tools.Here you go...


 
Εργαλεία: IDA φυσικά...
 
Δυσκολία: Εύκολο-Μέτριο
 
Συνοδευτικά αρχεία: ΕΔΩ

    
  Επειδή οι περισσότεροι μαθαίνουν ευκολότερα με παραδείγματα,έχω συμπεριλάβει ένα απλό messagebox 
το οποίο και θα κάνω disassemble και παράλληλα θα εξηγήσω πως και γιατί το ida είναι απαραίτητο
σε όλους εμάς.Ας ξεκινήσουμε λοιπόν(στο τωρινό παράδειγμα χρησιμοποιώ μια λίγο παλιότερη από τις
τωρινές εκδόσεις του Ida,την 4.17,υπάρχουν και πιο νέες όμως όπως οι 4.30):

  Ανοίξτε το IDA και έπειτα το messagebox.exe που είναι το συνοδευτικό μας αρχείο.Αυτό που 
ανοίγουμε είναι φυσικά ένα Portable Executable,στο format που παρείχε η IBM.Στα options φαίνεται 
αν θέλουμε να κάνουμε load στα resources.Φυσικά δεν θέλουμε κάτι τέτοιο καθώς ένα απλό messagebox
δεν έχει resources.Οπότε δεν πρέπει να κάνουμε tick στo Load resources.Το IDA επίσης θα αναλάβει
να μετανομάσει τα dll entries που χρησιμοποιούνται από το πρόγραμμα και θα κάνει disassemble και
το import section.Ακόμα καθορίζεται το system directory του συστήματός μας που σε εμένα είναι 
C:\WINNT καθώς χρησιμοποιώ win2k καθώς γράφω το βοήθημα αυτό.Στα kernel options υπάρχουν κάποια 
από τα δομικά στοιχεία του IDA και είναι tickαρισμένα αφού πάντα χρησιμοποιούνται.Αν θέλετε να 
αφαιρέσετε κάποια στοιχεία από αυτά μπορείτε να το κάνετε βγάζοντας το tick τους.Το ίδιο ισχύει
και για τα Processor options.Ας ανοίξουμε λοιπόν το disassembly πατώντας ΟΚ ελευθερώνοντας την
δύναμη του IDA:

  Με την έναρξη του IDA ήδη λαμβάνουμε τις πρώτες πληροφορίες:

_text:00401000 ; Virtual size                  : 00000026 (     38.)
_text:00401000 ; Section size in file : 00000200 ( 512.)
_text:00401000 ; Offset to raw data for section: 00000400
_text:00401000 ; Flags 60000020: Text Executable Readable
Πληροφορίες για το .text section ή αλλιώς το τμήμα κώδικα ενός εκτελέσιμου,σε default compilation.Λοιπόν,το μέγεθος που καταλαμβάνει το τμήμα αυτό όταν τρέχει στη μνήμη είναι 38 bytes. Ακόμα μαθαίνουμε ότι το raw section size του αρχείου είναι 200h bytes.Πως γίνεται στην μνήμη το πρόγραμμα να έχει λιγότερα bytes κώδικα? Είναι φυσικό αυτό καθώς στο raw offset 401000h+27h ξεκινάνε τα μηδενικά του code section,τα οποία φυσικά δεν φορτώνονται στην σελίδα μνήμης που χρησιμοποιείται καθώς τρέχει το πρόγραμμα.Ακόμα βλέπουμε το raw data for section που αφορά το που βρίσκεται(που ξεκινά δηλαδή) το .text section σε raw offset του αρχείου.Με λίγα λόγια στην μετατόπιση 400h από την αρχή του αρχείου βρίσκεται η αρχή του section αυτού.Τέλος άλλη μία ενδιαφέρουσα πληροφορία αφορά τα flags(characteristics) του .text section.Εδώ είναι 60000020. Θυμάστε τα bits που εξηγούσαμε την άλλη φορά?Αυτό που μας ενδιαφέρει είναι ότι το .text section μας έχει "executable" και "readable" characteristics.Επιτρέψτε μου να κάνω μία επισήμανση σε αυτό το σημείο.Με το που βλέπετε τα παραπάνω στοιχεία θα πρέπει να είστε σε θέση να καταλαβαίνετε αμέσως όσα περιέγραψα εγώ εδώ.Αν δεν ισχύει αυτό,καλό θα ήταν να εξετάσετε ξανά με μεγαλύτερη προσοχή το προηγούμενο project της M.a.s.k. που αφορά το PORTABLE EXECUTABLE FILE FORMAT.Τι?Δεν έχετε ΜΑΘΕΙ αυτές τις εκθέσεις? Και κοιτάτε το τρίτο Project? Θα χάσετε την μπάλα ρε σεις,που λέει και ο Γεωργίου :) Ας δούμε τώρα λίγο τον κώδικα: _text:00401000 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing
_text:00401000
_text:00401000 public start
_text:00401000 start:
_text:00401000 push 0
_text:00401002 push offset aTestForSurgeryOfTheExecutable ; "Test For Surgery Of The Executable !"
_text:00401007 push offset aSSSiXsSSSXXAQ___ ; "_U±U?U?¦ ???±U?UU?_U?-U? ?-?_ ??U..."
_text:0040100C push 0
_text:0040100E call MessageBoxA
_text:00401013 push 0
_text:00401015 call $+5
_text:0040101A jmp ds:ExitProcess
_text:00401020 ; [00000006 BYTES: COLLAPSED FUNCTION MessageBoxA. PRESS KEYPAD "+" TO EXPAND]
_text:00401026 align 200h
_text:00401026 _text ends
_text:00401026
  Βλέπετε για του λόγου το αληθές πως το πρόγραμμά μας έχει 26h bytes ως κώδικα όπως είδαμε πιο πριν.Ο κώδικας του προγράμματος βέβαια είναι κάτι παραπάνω από εμφανές τι κάνει.Διπλοκλικάρετε στο "call MessageBoxA" και δείτε το εξής: "jmp ds:__imp_MessageBoxA" Κλικάρετε ξανά 2 φορές στο imp_MessageBoxA και: _idata:00402008 ;
_idata:00402008 ; Imports from USER32.dll
_idata:00402008 ;
_idata:00402008 ; int __stdcall __imp_MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
_idata:00402008 extrn __imp_MessageBoxA:dword ; DATA XREF: MessageBoxAr
_idata:0040200C
_idata:0040200C
Πηγαίνουμε στο 402008.Πηγαίνοντας λίγο παραπάνω βλέπουμε τα attributes του δεύτερου section. Αυτά είναι: _idata:00402000 ; Section 2. (virtual address 00002000)
_idata:00402000 ; Virtual size : 00000092 ( 146.)
_idata:00402000 ; Section size in file : 00000200 ( 512.)
_idata:00402000 ; Offset to raw data for section: 00000600
_idata:00402000 ; Flags 40000040: Data Readable
_idata:00402000 ; Alignment : 16 bytes ?
Το section αυτό ξεκινάει από το 402000 και όπως σωστά καταλάβατε αφορά το import table του εκτελέσιμου.Για αυτό το λόγο δεν έχει executable as code attributes.Για όλα τα άλλα πλέον μπορείτε να αποφανθείτε μόνοι σας.Αλλιώς ξέρετε,pe format ;) Πίσω λοιπόν στο 402008 που βρίσκεται το IAT (Import Address Table) για το messagebox: _idata:00402008 extrn __imp_MessageBoxA:dword ; DATA XREF: MessageBoxAr Τι συμπεραίνουμε?Καταρχήν το section που περιέχει το import table λέγεται .idata .Ακόμα,στην διεύθυνση 402008h στην μνήμη,ή στο Offset(σχετική μετατόπιση) 608h στο αρχείο βρίσκεται ο δείκτης που δείχνει στο offset 2078h που τελικά δείχνει στο function MessageboxA της user32.dll library. Ας ξαναδούμε την συνάρτηση messageboxa: _idata:00402008 ; int __stdcall __imp_MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
 
  Από εδώ βλέπουμε ότι το messagebox έχει τέσσερις παραμέτρους,ενώ αυτές "περνάνε" με stdcall,που
σημαίνει ότι περνάνε σε στυλ C (με τον τρόπο που δηλώνονται οι συναρτήσεις στην C).Ακόμα βλέπουμε
πως το MessageBoxA επιστρέφει μία Integer τιμή και συγκεκριμένα 0 στην επιτυχή εκτέλεση.Όπως και
πολλές c συναρτήσεις κάνουν συχνά(η main() για παράδειγμα).Όπως βλέπετε λοιπόν το IDA τα φανερώνει
όλα(όταν δεν είναι encrypted το πρόγραμμα...)Ας πάμε πίσω στο 401000 για να δούμε και τα άλλα
Options του IDA.


ΕΙΣΑΓΩΓΗ ΣΧΟΛΙΩΝ ΣΤΟΝ ΚΩΔΙΚΑ

  
_text:00401000                 push    0   ; Εδώ ξεκινάνε οι παράμετροι του MessageBox

  Έστω ότι θέλουμε να κάνουμε αυτό το σχόλιο στην διεύθυνση 401000.Πάμε σε αυτή την διεύθυνση και
πατάμε τον χαρακτήρα ";" που βρίσκεται στο πληκτρολογιό μας δίπλα από το "L".Εμφανίζεται το 
παράθυρο σχολίων που μας επιτρέπει να εισάγουμε το σχόλιο μας.Πατώντας ΟΚ αυτό καταχωρείται.

ΑΛΛΑΓΗ ΜΕΤΑΞΥ BYTES/WORDS/DWORDS K.A. ΣΤΟΝ ΚΩΔΙΚΑ Οποιαδήποτε στιγμή μπορούμε να δούμε τον κώδικα του IDA μεταφρασμένο σε definitions των Bytes, Words κ.α.Ας πάρουμε την γραμμή: _text:0040100E call MessageBoxA Επιλέξτε την κάνοντας Highlight και με δεξί κλικ επιλέξτε "UnDefine".Τώρα βλέπετε: _text:0040100E db 0E8h ; ϋ <- Βασικό call mem32 opcode
_text:0040100F db 0Dh ; <- Καθορισμός μετατόπισης για near call
_text:00401010 db 0 ;
_text:00401011 db 0 ;
_text:00401012 db 0 ;
Τώρα βλέπετε τα 5 Bytes του "call MessageBoxA" που ουσιαστικά είναι "call 401020".Είναι σημαντικό να γνωρίζετε πως μετεφράζονται τα opcodes μίας εντολής.Το byte 0e8h στην αρχή αναφέρεται σε call.Όταν το call είναι far το πρόγραμμα χρειάζεται να καθορίζει επ΄ακριβώς την διεύθυνση στην οποία πρέπει να μεταβεί,έχοντας κάποια Bytes ως 4010χχ για παράδειγμα σε αντίστροφη μορφή,κάπως έτσι: E8h,30h,20h,40h,00h <- CALL FAR PROC 402030h Αν το call είναι near τότε δεν χρείαζεται ο καθορισμός ολόκληρης της διεύθυνσης.Ένα call είναι near όταν η απόσταση που διανύει για να μεταφερθεί στην διαδικασία που θέλει να καλέσει είναι μικρότερη ή ίση με 255 bytes(0ffh bytes).Πως λοιπον καταλαβαίνει στην περίπτωσή μας το πρόγραμμα που πρέπει να πηδήξει το call? Η απάντηση είναι ότι ελέγχει το 2ο Opcode.Είναι το 0dh εδώ.Τι λέει αυτό?Ότι από το byte Που τελειώνει η εντολή μας(στην διεύθυνση 401013h) αν προσθέσουμε 0dh bytes θα πάρουμε την διεύθυνση αυτού του call,δηλαδή 401020h.Για όλα τα υπόλοιπα απευθυνθείτε στο art of assembly που αναφέρει λεπτομερώς το encoding των εντολών.Τώρα που φαίνονται τα bytes του κώδικα μπορείτε να τα μετατρέψετε σε words ή dwords κάνοντας δεξί κλικ και επιλέγοντας αυτό που θέλετε. Ίσως αναρωτιέστε γιατί υπάρχουν τέτοια πράγματα στο IDA και που βοηθούν αλλά όσοι έχετε "παίξει" με Packers και smc κώδικα σίγουρα καταλαβαίνετε γιατί υπάρχουν όλα αυτα. ΠΑΡΕΜΒΑΣΗ ΣΤΟΝ ΚΩΔΙΚΑ - ΔΗΜΙΟΥΡΓΙΑ ΠΡΩΤΟΤΥΠΩΝ Θέλετε να φτιάχνετε τα δικά σας πρότυπα για να ξεχωρίζετε τις συναρτήσεις με τον δικό σας τρόπο? Ας πάρουμε για παράδειγμα το messagebox.Σε αυτό χρειάζεται να περάσουμε 4 παραμέτρους.Ας φτιάξουμε το δικό μας πρότυπο για το Messagebox.Έφτιαξα ένα παρακάτω: _text:0040100E ; int __cdecl MESSABOXATSI(int param1,char *param2,char *param3,int param4)
_text:0040100E MESSABOXATSI proc near
_text:0040100E
_text:0040100E param1 = dword ptr 4
_text:0040100E param2 = dword ptr 8
_text:0040100E param3 = dword ptr 0Ch
_text:0040100E param4 = dword ptr 10h
_text:0040100E
_text:0040100E call MessageMAN
_text:0040100E MESSABOXATSI endp
Πως λέγεται στα κρητικά το messagebox? MessageBoxATSI,μωρε !!! Πλάκα κάνω φίλοι Κρητικοί ;) Δημιουργείτε πρότυπα επιλέγοντας "Create function" με δεξί κλικ στον Highlighted κώδικα που θα χρησιμοποιηθεί στο πρότυπο.Τότε εμφανίζεται ένα "proc near" και ένα "endp" που σηματοδοτούν την έναρξη και το τέλος του procedure μας.Κάνοντας "rename" αλλάζουμε το όνομά του.Κλικάροντας στο "set function type" μπορείτε να βάλετε κάτι σαν το σχόλιο που έβαλα παραπάνω για το messagebox: _text:0040100E ; int __cdecl MESSABOXATSI(int param1,char *param2,char *param3,int param4) Ότι δηλαδή παίρνει 2 integer παραμέτρους και 2 char pointers ενώ επιστρέφει ακέραιο.Έτσι εμφανίζεται και η μετατόπιση που θα έχουν όταν περαστούν στην στοίβα: _text:0040100E param1 = dword ptr 4
_text:0040100E param2 = dword ptr 8
_text:0040100E param3 = dword ptr 0Ch
_text:0040100E param4 = dword ptr 10h
Η param1 ας πουμε είναι η τελευταία παράμετρος που περνάμε(μην ξεχνάτε __cdecl) και άρα βρίσκεται πάνω πάνω στην στοίβα σε απόστασταση esp+4 από το παρόν esp καραχωρητή την στιγμή που Pushάρεται. Καταλαβαίνετε,λοιπόν,ότι η param4 είναι η ΠΡΩΤΗ παράμετρος που pushάρεται στην στοίβα.Κάνοντας δεξί κλικ και "hide" κρύβεται το function μας και κάνοντας "unhide" επανέρχεται. "EDIT" MENU ITEM Ας πουμε τώρα λίγα πράγματα για τα λοιπά εργαλεία που κρύβει το IDA στα menu items του.Θα αφήσουμε τελευταίο το FILE item καθώς περιέχει τα IDC αρχεία για τα οποία θα μιλήσω εκτενώς προς το τέλος του βοηθήματος καθώς είναι ΕΞΑΙΡΕΤΙΚΑ χρήσιμα και ενδιαφέροντα.Φυσικά όσα έχουν αναφερθεί ή είναι ευκόλως ενοούμενα,όπως το "begin selection" δεν θα τα περιγράψω.Στο "edit" menu item συναντάμε το "declare struct var".Τα structs ή οι λεγόμενες δομές είναι κάτι παραπλήσιο με τις κλάσεις,μόνο που δεν έχουν μεθόδους παρά μόνο μεταβλητές-μέλη.Το πρόγραμμά μας δεν έχει κάποια δομή,αλλά αν είχε θα μπορούσαμε εδώ να του προσθέσουμε μία καινούρια μεταβλητή-μέλος.To ASCII μας επιτρέπει να μετατρέψουμε μία τιμή,π.χ. 61h στο ascii ισότιμο του,το "a".Η επιλογή "array" μας επιτρέπει να μετατρέψουμε μια σειρά δηλώσεων σε ένα πίνακα ισότιμων θέσεων. Π.χ : db 0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 14 dup (0) ; για όσους προγραμματίζουν σε assembly Το "operand type" μας επιτρέπει να αλλάξουμε πράγματα που αφορούν την εμφάνιση των τιμών στο IDA, όπως την αλλαγή του συστήματος αρίθμησης κ.α. τέτοια που ουσιαστικά δεν μας ενδιαφέρουν ιδιαίτερα. Επιπλέον τα "comments" τα είδαμε νωρίτερα,ενώ με την επιλογή "segment" Καλύτερα να μην παίζετε αν δεν ξέρετε τι κάνετε.Να πως δείχνει ένα segment που ξεκινά από την διεύθυνση 0x401000 και τελειώνει στην διεύθυνση 0x401010 ενώ έχει δεκαεξαδική βάση αριθμών(και ονομάζεται bellucci ;): bellucci:400F00 bellucci segment byte public '' use16
bellucci:400F00 assume cs:bellucci
bellucci:400F00 ;org 400F00h
bellucci:400F00 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing
bellucci:400F00 db 6Ah ; j
bellucci:400F01 db 0 ;
bellucci:400F02 db 68h ; h
bellucci:400F03 db 0 ;
bellucci:400F04 db 30h ; 0
bellucci:400F05 db 40h ; @
bellucci:400F06 db 0 ;
bellucci:400F07 db 68h ; h
bellucci:400F08 db 25h ; %
bellucci:400F09 db 30h ; 0
bellucci:400F0A db 40h ; @
bellucci:400F0B db 0 ;
bellucci:400F0C db 6Ah ; j
bellucci:400F0D db 0 ;
bellucci:400F0E db 0E8h ; u
bellucci:400F0F db 0Dh ;
bellucci:400F0F bellucci ends Στις δομές και τις συναρτήσεις ήδη αναφερθήκαμε.Δεν πρόκειται επίσης να αναφερθώ στο Patch του IDA καθώς πολλές φορές δεν μου επέτρεπε το "produce" ενός exe file,οπότε μάλλον είναι καλύτερα να αλλάζετε τα προγράμματά σας με hex-editor.Το ίδιο συμβαίνει και με το "other" καθώς οι αλλαγές με τα custom operands μπορούν να αποβούν καταστροφικές αν δεν έχετε σοβαρή εμπειρία για το τι ακριβώς και με ποιο τρόπο μπορείτε να κάνετε κάτι στον κώδικα.Στα Plugins υπάρχουν κάποια μικρά προγραμματάκια,ξεχωριστά από το IDA που κάνουν διάφορες ψιλολειτουργείες,αν φυσικά τα έχετε λάβει μαζί με το IDA. "JUMP-SEARCH-VIEW" MENU ITEMS Νομιζω ότι τα 2 πρώτα Menu items δεν χρειάζονται καθόλου περιγραφή.Χρησιμεύουν απλώς για να μεταφερθούμε από ένα σημείο σε ένα άλλο,είτε είναι Label είτε είναι διεύθυνση.Με το search μπορούμε να βρούμε κάποιο σημείο μέσα στο πρόγραμμά μας,όπως κάποιες εντολές ή κάποιο κείμενο ας πούμε.Το "view->open subviews" μπορούμε να δούμε το πρόγραμμά μας σε διαφορετικές μορφές,όπως disassembly,ή hex dump ενώ παράλληλα μπορούμε να δούμε τα strings,τα enumerated variables του προγράμματος(αν υπάρχουν),τα segments,libraries κ.α.Το κομμάτι "graphs" είναι ένα από τα ΠΟΛΥ ενδιαφέροντα κομμάτια του IDA.Εδώ το IDA είναι ικανό να δημιουργήσει ένα flow chart(διάγραμμα ροής) του κανονικού προγράμματος που είναι μία πιο κατανοητή μορφή του προγράμματος ειδικότερα για όσους έχουν ασχοληθεί με ψευδοκώδικα ή ακόμα σωστότερα ψευτοκώδικα.Στο "toolbars" βεβαίως μπορούμε να ανοίξουμε τα bars που θέλουμε να είναι εμφανή στον disassembler,ενώ το calculator είναι εμφανές ότι κάνει κάποιες γρήγορες μετατροπές για εμάς.Τα "print segment register" και "print internal flags" κάνουν ακριβώς αυτό που λένε.Εμφανίζουν στο κάτω μέρος του IDA τα segment registers και Internal flags του προγράμματος.Τα παρακάτω αναφέρθηκαν ήδη... "OPTIONS" MENU ITEMS Τα options του IDA αφορούν την εξωτερική εμφάνισή του στον χρήστη(χρώματα,γραμματοσειρές κ.α.). Μπορείτε να αλλάξετε ακόμα το στυλ που εμφανίζονται οι μεταβλητές και το πέρασμά τους σε συναρτήσεις ανάλογα με τον τρόπο που θέλετε.Γενικότερα,εκτός από τα χρώματα και τις γραμματοσειρές θα έλεγα ότι δεν χρειάζεται να πειράξετε κάτι άλλο.Αυτό που θα ήθελα να επισημάνω τελειώνοντας τα menu items είναι ότι αυτό που θα πρέπει κατά την γνώμη μου να έχετε πολύ υπόψη σας όταν κάνετε cracking με το IDA,είναι να αλλάζετε κάποια calls σε πιο εμφανή ονόματα και να βάζετε σχόλια που θα σας βοηθούν στην κατανόηση και συντήρηση της λειτουργίας του κώδικα χωρίς αντικειμενοστραφή πηγαίο κώδικα :) Ένα ΠΟΛΥ ΠΟΛΥ χρήσιμο ακόμα πλεονέκτημα του IDA είναι ότι από την στιγμή που ένα reference μετανομαστεί θα έχει το ΙΔΙΟ ΟΝΟΜΑ σε οποιοδήποτε σημείο αναφέρεται στον κώδικα! IDA's FLIRT SIGNATURES AND IDC SCRIPTS: ADVANCED TOPICS Τα FLIRT signatures του IDA δεν είναι τίποτα άλλο από βιβλιοθήκες που βοηθούν στην πιο "ανθρώπινη" ανάλυση κώδικα γραμμένου σε "άσχημες" γλώσσες όπως Borland VCL components.Αυτές οι βιβλιοθήκες αναγνωρίζουν τα δομικά στοιχεία της κάθε γλώσσας και εμφανίζουν τα ονόματα κάποιων διαδικασιών κ.α. Αν έχετε κάτι τέτοιο κατεβάστε τα από το Internet και χρησιμοποιήστε τα. Οι περισσότεροι ξέρετε τι είναι τα scripts.Για όσους το αγνοούν πρέπει να πω ότι είναι προγράμματα που αυτοματοποιούν κάποιες διαδικασίες.Τα έχετε δει ως robots σε μερικά mirc κανάλια ή ως aliases στα options του mirc.Στο IDA είναι βασισμένα στην c και λειτουργούν όπως οι συναρτήσεις.Είναι ΕΞΑΙΡΕΤΙΚΑ ΧΡΗΣΙΜΑ και για αυτό το λόγο έφτιαξα ένα που θα αυτοματοποιήσει μία διαδικασία. Ας υποθέσουμε ότι έχουμε το πρόγραμμα αυτό και θέλουμε να φτιάξουμε έναν εσωτερικό decryptor που να xorάρει κάθε byte του προγράμματος με τον αριθμό 3ch ώστε να τα επαναφέρει στην σωστή τους μορφή.Θέλουμε δηλαδή να κάνουμε Self Modifying Code.Για να γίνει αυτό πρέπει πρώτα να κάνουμε xor τα bytes που θέλουμε για να είναι έτοιμα για το xor του decryption.Αν,λοιπόν,έχουμε έτοιμο τον κώδικα γιατί να μην φτιάξουμε ένα IDC script που θα φτιάχνει τα Bytes όπως θέλουμε? Θα φτιάξουμε δηλαδή μία συνάρτηση που θα υλοποιεί αυτό το πράγμα και θα την αποθηκεύσουμε σε ένα αρχείο *.IDC.Αλλά πριν το κάνουμε αυτό επιτρέψτε μου να σας εξηγήσω την γλώσσα IDC: 1)Όλες οι μεταβλητές της γλώσσας scripts IDC δηλώνονται ως auto.Π.χ. : auto metavliti; // Υπάρχει βέβαια ο κλασσικός c τελεστής,το ";" 2)Οι συναρτήσεις της γλώσσας IDC είναι 2 ειδών: α) Built-in συναρτήσεις β) User-defined συναρτήσεις α) Όπως κάθε σχεδόν γλώσσα προγραμματισμού και η IDC έχει έτοιμες συναρτήσεις,όπως για παράδειγμα η AddHotkey,οι οποίες κάνουν κάποια πράγματα για λογαριασμό του χρήστη.Όλες αυτές περιγράφονται στο help file του IDA. β) Ακόμα,υπάρχουν οι συναρτήσεις που δημιουργεί ο χρήστης.Αυτές πρέπει να είναι της μορφής: static func(arg1,arg2,arg3)
{
statements ...
} 3) Τα statements στην IDC scripting language είναι γνωστά από την C: if (expression) statement
if (expression) statement else statement
for ( expr1; expr2; expr3 ) statement
while (expression) statement
do statement while (expression);
break;
continue;
return <expr>;
return; the same as 'return 0;'
{ statements... }
; (empty statement) Βλέπετε,λοιπόν,ότι η γλώσσα αυτή μοιάζει εξαιρετικά με την C.Λίγο πειραματισμό χρειάζεται μόνο. Ας φτιάξουμε τώρα το πρόγραμμα που ανέφερα πριν: (xor3ch.idc)


static crypt(start_add,end_add)
{
auto buffer;
for (start_add ; start_add<=end_add ; start_add++)
{
buffer=Byte(start_add);
buffer=buffer^0x3c;
PatchByte(start_add,buffer);
}
}


  Νομίζω πως για όσους γνωρίζουν c ή c++ το πρόγραμμα αυτό είναι πολύ απλό.Επιτρέξτε μου να εξηγήσω 
τι γίνεται εδώ.Η συνάρτηση crypt() είναι μία συνάρτηση user-defined που αναλαμβάνει να κάνει αυτό
που θέλουμε.Να κάνει αυτόματα δηλαδή το decryption ενός κομμάτι κώδικα στο IDA.Η μεταβλητή start_add
που περνάται ως παράμετρος αναφέρεται στο rva από το οποίο θα ξεκινήσει το encryption.Αντίστοιχα η
end_add αναφέρεται στο τελικό rva όπου το decryption θα σταματήσει.Αυτές οι 2 παράμετροι καθορίζονται
από τον χρήστη όταν τρέξει το IDC script.Έπειτα δηλώνεται μια μεταβλητή buffer,που είναι ουσιαστικά
μία τοπική μεταβλητή που θα κρατάει τα bytes για αλλαγή κάθε φορά.
  Αρχικά υπάρχει ένας βρόχος for που με έναρξη από την start_add και μέχρις ώτου αυτή να γίνει ίση
με την end_add,αυξάνει την start_add κατά ένα σε κάθε επανάληψη.Εσωτερικά τίθεται η μεταβλητή
buffer ίση με την επιστροφή της συνάρτησης Byte(address_RVA).Η συνάρτηση αυτή είναι built-in
στο IDC και αναλαμβάνει να επιστρέψει το opcode(byte) που αντιστοιχεί σε κάποιο RVA στο IDA.Έπειτα
το byte αυτό που έχει πάει στο Buffer xorάρεται με την τιμή 0x3c (δηλαδή 3ch).Τελικά χρησιμοποιείται
η συνάρτηση PatchByte(address_RVA,byte_to_patch) που αυτό που κάνει είναι να patchάρει στο IDA 
αλλάζοντας το byte που αντιστοιχεί στο address_RVA με αυτό που έχει περαστεί ως δεύτερη παράμετρος
ονόματι byte_to_patch.Οπότε καταλαβαίνετε πως αυτό το loopάκι xorάρει όλα τα bytes που βρίσκονται
ανάμεσα στις διευθύνσεις start_add και end_add με το 3ch.
  Το πρόγραμμά μας είναι έτοιμο για εκτέλεση.Πατήστε F2 στο IDA και φορτώστε τον στον εσωτερικό
translator του IDA επιλέγοντάς το.Έπειτα πατήστε SHIFT+F2 και καλέστε την συνάρτηση με τις εξής
παραμέτρους:

crypt(0x401000,0x40101a);

Βλέπετε πως ο κώδικας στο block 401000h - 40101ah άλλαξε και έγινε:

.text:00401000                 public start
.text:00401000 start proc near
.text:00401000 push esi ; uType
.text:00401002 push esp ; lpCaption
.text:00401007 push esp ; lpText
.text:0040100C push esi ; hWnd
.text:0040100E aam 31h
.text:00401013 push esi
.text:00401015 aam 3Ch
.text:0040101A retn
.text:0040101A start endp ; sp = -8
  Πατήστε ξανά SHIFT+F2 και εκτελέστε ξανά την συνάρτηση crypt με τις ίδιες παραμέτρους.Τα bytes 
τώρα αποκρυπτογραφούνται και επανέρχονται στην αρχική τους μορφη όπως ηταν αναμενόμενο...


IDA's Configuration Files (ida.cfg + idagui.cfg)


  Το IDA εκτός από όλα τα άλλα έχει και ένα configuration file το οποίο αξίζει να μελετήσετε.Από 
εκεί μπορείτε να φτιάξετε τα settings του IDA που ταιριάζουν στο γούστο σας.Αυτά αφορούν από το
πως φαίνεται το IDA σε γραφικό περιβάλλον μέχρι το πως αλληλεπιδρά με τον χρήστη.Πολλά από αυτά τα
settings δεν χρειάζονται ιδιαίτερη εως και καμμία αλλαγή,οπότε θα μου επιτρέψετε να περιγράψω αυτά
που είναι απαραίτητα και έχω αλλάξει και εγώ στο IDA.
  Ανοίξτε το αρχείο αυτό που βρίσκεται στο root directory του IDA και πηγαίντε σε αυτό το σημείο:




//-------------------------------------------------------------------------
//
// General parameteres for all processors
// (processor specific parameters are below)
//
//-------------------------------------------------------------------------

PACK_DATABASE = 0 // 0 - don't pack at all
// 1 - pack database (store)
// 2 - pack database (deflate)
CREATE_BACKUPS = NO // Create database backups

CHECK_MANUAL_ARGS = YES // Check equality of manual operands
// entered by Alt-F1

//------------------------------------------------------------------------------------------------------


  Δεν ξέρω για εσάς αλλά προσωπικά δεν θέλω default επιλογή να σώζονται τα databases από κάθε 
πρόγραμμα που ανοίγω στο IDA.Οπότε άλλαξα το PACK_DATABASE από 1 σε 0.Έπειτα ας δούμε τα
Text representations:



//-------------------------------------------------------------------------
//
// Text representation
//
//-------------------------------------------------------------------------

OPCODE_BYTES = 4// don't display bytes of instruction/data
INDENTION = 10 // Indention of instructions
COMMENTS_INDENTION = 40 // Indention of short comments
MAX_TAIL = 16 // Tail depth (used to gather xref info)
MAX_XREF_LENGTH = 80 // Maximal length of line with cross-references
MAX_DATALINE_LENGTH = 70 // Data directives (db,dw, etc):
// max length of argument string
SHOW_AUTOCOMMENTS = NO // Display comments for every instruction
// Advanced users will turn this off
// Please note that there is another definition
// for IBM PC below
SHOW_BAD_INSTRUCTIONS = YES// Don't bother about instruction lengthes
SHOW_BASIC_BLOCKS = NO // Generate an empty line at the end of a basic block
SHOW_BORDERS = YES // Borders between data/code
SHOW_EMPTYLINES = YES // Generate empty line to make disassembly more readable
SHOW_LINEPREFIXES = YES // Show line prefixes (like 1000:0000)
SHOW_VARIABLE_MARKS = NO // Show asterisks in the line prefix for addresses marked as variable
SHOW_SEGMENTS = YES // Show segments in addresses
USE_SEGMENT_NAMES = YES // Show segment names instead of numbers
SHOW_REPEATABLE_COMMENTS= YES // Show repeatable comments (disabling this increases IDA speed)
SHOW_SP = NO // Show stack pointer at the start of lines
SHOW_SUSPICIOUS = NO // Show <void> marks (the red/orange color is bright enough)
SHOW_XREFS = 2 // Show 2 cross-references (the rest is accessible by Ctrl-X)
SHOW_XREF_FUNC = YES // Show function offsets in xrefs
SHOW_XREF_TYPES = YES // Show xref type marks
SHOW_XREF_VALUES = YES // If not, xrefs are displayed as "..."
SHOW_SEGXREFS = YES // Show segment part of addresses in cross-references
SHOW_SOURCE_LINNUM = YES // Show source line numbers
SHOW_ASSUMES = YES // Generate 'assume' directives
SHOW_ORIGINS = YES // Generate 'org' directives
USE_TABULATION = YES // Use '\t' in output files

DEL_CODE_COMMENTS = YES // Delete a comment attached to an instruction
// when the instruction is deleted
MAX_ITEM_LINES = 5000 // Maximum number of lines for one item (one instruction or data)


 


  To OPCODE_BYTES καθορίζει αν θα φαίνονται τα opcodes του κώδικα σε κάθε εντολή.Αρχικά ήτανε 0,
πριν το αλλάξω σε 4.Το 4 σημαίνει ότι ο μέγιστος αριθμός bytes που μπορούν να φαίνονται σε κάθε
γραμμή είναι 4.Αν μία εντολή έχει 4+ byte opcodes,τότε τα υπολοιπόμενα bytes πηγαίνουν στην 
επόμενη γραμμή.Χρήσιμο είναι ακόμα και το COMMENTS_INDENTION με το οποίο καθορίζεται η απόσταση
των εντολήων από τα hex opcodes.Όλα τα υπόλοιπα δεν παίζουν ιδιαίτερα σημαντικό ρόλο θα έλεγα,
αλλά μπορείτε να αλλάξετε ο,τιδήποτε κατά βούληση.
  Από τα ASCII strings & names θα έλεγα ότι αξίζει η παρακάτω αλλαγή:


ASCII_PREFIX            = "STR!"           // This prefix is used when a new
// name is generated Αν θέλετε να βλέπετε "str_" και όχι "a" για κάθε string του προγράμματος.Θα έλεγα ότι αυτές είναι οι σημαντικές αλλαγές του αρχείου.Υπάρχει,όμως ένα εξίσου σημαντικό αρχείο,το "idagui.cfg" που είναι υπεύθυνο για τα hotkeys και το gui(graphical user interface) του ida.Ανοίξτε το και αλλάξτε ό,τι θέλετε.Νομίζω ότι είναι παραπάνω από εμφανές πως αλλάζουν τα hotkeys,έτσι?

ΑΠΟΨΕΙΣ ΚΑΙ ΑΝΤΙΓΝΩΜΙΕΣ :)

 

  Πριν αρχίσω να χρησιμοποιώ ΣΧΕΔΟΝ ΑΠΟΚΛΕΙΣΤΙΚΑ το IDA θεωρούσα ότι το WinDasm είναι ό,τι μπορεί 
κανείς να ζητήσει από έναν disassembler και φυσικά έκανα τεράστιο λάθος.Το IDA είναι πραγματικά
αυτό που ισχυρίζεται.INTERACTIVE DISASSEMBLER.Αλληλεπιδρά με τον χρήστη,δέχεται πληροφορίες,αντιδρά
με τέτοιο τρόπο,θαρρείς και του έχει προστεθεί artificial-intelligence.Αρκεί να μπορέσει κάποιος
να βγάλει έξω την δύναμη του.Τα IDC files βοηθούν πολύ σε αυτό το σκοπό.Δοκιμάστε να γράψετε κάποια
από αυτά μόνοι σας με την βοήθεια των built-in συναρτήσεων.Δεν είναι ιδιαίτερα δύσκολο και βοηθάει
πολύ στον αυτοματισμό των διαφόρων διαδικασιών.Τα FLIRT signatures αναγνωρίζουν τους compilers και
παράγουν πιο κατανοητή μορφή του disassembly listing.Τα IDS files μπορούν να χρησιμοποιηθούν για 
comments σε κώδικα(αν και δεν έχουν ιδιαίτερη σημασία θεωρώ προσωπικά).
  



Interactive DisAssembler vs Win32Dasm : Συγκριτικά...

 

  Το WinDasm θα έλεγα ότι είναι πραγματικά ένας γρήγορος και εύκολος disassembler που είναι καλύτερο 
να χρησιμοποιούμε όταν ΔΕΝ θέλουμε να εμβαθύνουμε στον κώδικα ενός προγράμματος.Είναι ΠΟΛΥ πιο γρήγορο
στο SEARCH από το IDA και βεβαίως φορτώνει ένα πρόγραμμα πολύ γρηγορότερα από το IDA καθώς δεν κάνει
την λεπτομερή ανάλυση του IDA.Επίσης παρέχει έναν built-in debugger,ο οποίος βεβαίως δεν είναι ό,τι
καλύτερο.Έχει εύκολη GUI πλοήγηση,αλλά έχει ταυτόχρονα και μεγάλη στατικότητα.
  Το IDA από την άλλη είναι αργό.Είναι,όμως,εξαιρετικά περιγραφικό στο disassembling.ΕΠΙΤΡΕΠΕΙ ΤΗΝ
ΑΛΛΑΓΗ ΤΩΝ ΟΝΟΜΑΤΩΝ,ΚΑΤΙ ΠΟΥ ΕΙΝΑΙ ΠΟΛΥ ΠΟΛΥ ΠΟΛΥ ΣΗΜΑΝΤΙΚΟ.Έχει δύσκολο Inteface και χρειάζεται
ώρες ασχολίες για να το μάθει κανείς καλά.Κάτι που το κάνει και πιο γοητευτικό αφού δεν είναι εύκολα
προσπελάσιμο(το ίδιο που συμβαίνει και με τις γυναίκες :) Μπορεί να "μιλήσει" κανείς μαζί του μέσω
των IDC scripts.
  Με δύο λόγια:



WinDasm για γρηγοράδα και ευκολία και IDA για εμβάθυνση και ανάλυση.


  Αυτά για το IDA.Θα ήθελα να γράψω και άλλα ειλικρινά,αλλά μάλλον θα πρέπει να σταματήσω εδώ,καθώς
ήδη το βοήθημα έχει αποκτήσει μεγάλο,μέγεθος.Κλίνοντας να πω πως πραγματικά το IDA είναι ένα 
πρόγραμμα που αξίζει να αγοράσει κανείς παρόλο που είναι αρκετά ακριβό.Και καλή εξάσκηση !!!



ΠΡΟΣΟΧΗ 
Φυσικά δεν χρειάζεται καν να σας θυμίσω πως το βοήθημα αυτό είναι αυστηρά για 
εκπαιδευτικούς σκοπούς και για την οποιαδήποτε λάθος χρήση τους ο 
δημιουργός του δεν φέρει καμία ευθύνη. Αν θέλετε έτοιμα cracks υπάρχουν
πολλά άλλα μέρη στο internet, εδώ παρέχουμε μόνο γνώση.

 

BACK HOME