Jump to content
Sign in to follow this  
Baggelis

Βοήθεια Για Crypter Σε C++

Recommended Posts

Προσπαθούμε με ένα φίλο μου να φτιάξουμε ένα crypter για εκπαιδευτικούς λόγους. Αρχικά θέλουμε να κάνει crypt ένα executable σε windows έτσι ώστε να γίνεται unditectable από antivirus και στο runtime.. Δεν χρειάζονται δηλαδή anti reversing tricks ακόμα. Έχουμε φτιάξει ήδη τον κώδικα που κάνει το encrypt, αρχικά με ένα απλό xor και τώρα προσπαθούμε να φτιάξουμε το stub. Δεν μπορούμε όμως να καταλάβουμε πως να κάνουμε το stub στην πράξη, δηλαδή πως να ενσωματωθούν τα crypted bytes στο στο stub και πως θα τα κάνει αργότερα το stub decrypt.

Επίσης, για να είναι undetactable στο runtime χρειάζεται να γίνεται decrypt μία μία η κάθε εντολή και μετά να εκτελείται, σωστά;

Σας ευχαριστώ προκαταβολικά.

Share this post


Link to post
Share on other sites

Προσπαθούμε με ένα φίλο μου να φτιάξουμε ένα crypter για εκπαιδευτικούς λόγους. Αρχικά θέλουμε να κάνει crypt ένα executable σε windows έτσι ώστε να γίνεται unditectable από antivirus και στο runtime.. Δεν χρειάζονται δηλαδή anti reversing tricks ακόμα. Έχουμε φτιάξει ήδη τον κώδικα που κάνει το encrypt, αρχικά με ένα απλό xor και τώρα προσπαθούμε να φτιάξουμε το stub. Δεν μπορούμε όμως να καταλάβουμε πως να κάνουμε το stub στην πράξη, δηλαδή πως να ενσωματωθούν τα crypted bytes στο στο stub και πως θα τα κάνει αργότερα το stub decrypt.

Επίσης, για να είναι undetactable στο runtime χρειάζεται να γίνεται decrypt μία μία η κάθε εντολή και μετά να εκτελείται, σωστά;

Σας ευχαριστώ προκαταβολικά.

 

Ρίξε μία ματιά εδώ

Share this post


Link to post
Share on other sites

πέρασαν περίπου 2 χρόνια που έφτιαξα τον crypter που (τον έδωσε ο pr0n πιο πάνω) και έχει καιρό να ασχοληθώ με windows γενικά .. έτσι δεν θα μπορώ να σου πω αναλυτική περιγραφή για το πως θα το κάνεις.. μπορώ να σου πω απλή θεωρία και 2-3 πράγματα που πρέπει να λάβεις υπόψη..

αρχικά πρέπει να δεις πως είναι το structure του PE, σε αυτό θα σε βοηθήσουν αρκετά reversing tutorials που εξηγούν το PE.. και για ευκολία του προγραμματισμού να φτιάξεις τα structs που θα χρειαστείς για να περνάς τα δεδομένα (εγώ δεν το έκανα έτσι και ούτε έχω όρεξη να το φτιάξω σωστά πλέον).. επίσης τα struct αυτά αν θυμάμαι καλά υπάρχουν και στο windows.h έτοιμα αλλά αν θες να γίνετε compile και σε linux τότε φτιάξε τα δικά σου.. τώρα το stub μπορείς να το τοποθετήσεις στο τέλος του .text στο οποιο υπάρχει code gave, αν δεν το χωράει μπορείς να μεγαλώσεις τον χορό αλλάζοντας σωστά κάποιες τιμές του structure (πρέπει να το ψάξεις λίγο αυτό)... κάτι άλλο πιο εύκολο είναι να φτιάξεις ένα νέο section στο τέλος του file που θα είναι μέσα το stub (μπορεί να έχει οτιδήποτε όνομα ή μπορείς να το ονομάσεις .text και το αρχικό .text να το ονομάσεις σε κάτι άλλο)..

μετά θα πρέπει να αλλάξεις το entry point του executable και να βλέπει στην αρχή του stub, έτσι θα τρέξει αυτό στην αρχή, το stub θα κάνει decrypt τα sections και θα κάνει jump στο παλιό entry point για να αρχίσει να δουλεύει το πρόγραμμα κανονικά..

για να μπόρει όμως να αλλάξει την μνήμη το stub τότε πρέπει στα sections είτε να προσθέσεις στα flags του να είναι writable, είτε να καλέσεις ένα system call στην αρχή του stub που θα αλλάξει τα permissions του memory (δεν ξέρω το όνομα του syscall για windows)..

επίσης.. αν θυμάμαι καλά τα sections .rsrc .rdata και .idata δεν μπορούν να γίνουν crypt.. το .idata συγκεκριμένα μπορεί (το έχω κάνει στο δικό μου) αλλά πρέπει να γράψεις ένα νέο .idata δικό σου που θα κάνει load τα LoadLibrayA και GetProcAddress, τα οποια θα χρησιμοποιήσεις για να κάνεις load το παλιό .idata (μετά που θα το κάνεις decrypt εννοείτε) ..

 

τώρα όσο για το undetectable.. τα καλά antivirus (πχ nod32) θα κάνει detect το file σου.. η μόνη μέθοδος για να αποφύγεις το detection είναι να κάνεις obfuscate το code του stub σου και να μην χρησιμοποιήσεις μόνο encryption αλλά να το έχεις με συνδυασμό άλλων τεχνικών anti-reversing, όπως nanomites (το χρησιμοποιεί το armadillo αυτό)

 

αυτά είναι όσα θυμάμαι, πλέον ασχολούμαι μόνο με linux έτσι δεν μπορώ να βοηθήσω σε κάτι άλλο..

το μόνο tutorial που μπορώ να σου δώσω είναι για ELF binary infection (το ELF είναι για UNIX και διάφορα άλλα OS) στο οποίο δεν θα σε βοηθήσει σε πράξη, αλλά σε θεωρία και ιδέες.. ίσος βρεις κάτι παρόμοιο για PE στο ίδιο site που υπάρχει το tutorial που δίνω..

 

http://vxheavens.com/lib/vsc01.html

 

PS: ο code του crypter μου είναι λίγο χάλια μαύρα.. ελπίζω να βγεις από μέσα ;p (δεν είχα καθόλου καλό programming style τότε)

Edited by oblique

Share this post


Link to post
Share on other sites

Εδώ έχει ένα παράδειγμα και το κάνει με ένα recource που ενσωματώνει στο stub. Είναι αυτή τεχνική που μπορεί να χρησιμοποιηθεί; Θα κάνει δηλαδή το εκτελέσιμο undetectable;

Για να είναι runtime undetectable έχω δει κάτι runPE αλλά δεν έχω καταλάβει ακριβώς τι είναι και το google δεν με βοηθάει... υπάρχει τρόπος να γίνοναται decrypt μία μία οι εντολές και μετά να εκτελούνται;;

 

 

 

Αν έχω καταλάβει σωστά, αυτό είναι διαφορετική τεχνική από αυτή του oblique. Τον κώδικα σου oblique δυσκολεύομαι αρκετά να τον κατανοήσω.

Thisea ευχαριστώ για τα λινκ. Eίναι βέβαια και αυτά αρκετά advanced αλλά πιστεύω να βγάλω άκρη.

 

 

Share this post


Link to post
Share on other sites

το link που έδωσες εξήγα πως μπορείς να φτιάξεις ένα server (πχ για trojan, keylogger κτλ) που θα του περνάς τα settings στο executable με ένα builder.. δεν έχει σχέση με αυτό που θες..

 

για να μπορείς να το κανεις decrypt το κάθε instruction η μόνη μέθοδος που μπορώ να σκεφτώ είναι να φτιάξεις ένα child του process.. και ο parent θα κάνει decrypt μονο το μέρος που χρειάζεται το child.. dld ο parent θα χρησιμοποιά syscalls για debugging για να ελέγξει την τοποθεσία και να κάνει το ανάλογο decrypt..αυτό πιστεύω είναι πολύ πιο advance από τον απλό crypter που έφτιαξα.. άποψη μου είναι πρώτα να κανεις το απλό και μετά βλέπεις το runtime detection..

 

EDIT:

το runPE που λες είναι userland exec για windows που έφτιαξε κάποιος.. και αυτό είναι μια καλή μέθοδος γενικά..

Edited by oblique

Share this post


Link to post
Share on other sites

θα σου πρότεινα να μην κάτσεις να μπλέξεις με parent και child processes, το armadillo χρησιμοποιεί τέτοιες τεχνικές αλλά για άλλο σκοπό και όχι για να κρύψει κάτι από κάποιο anti-virus.

Μπορείς να έχεις encrypted ανεξάρτητα το ενα από το άλλο κάποια κομμάτια κώδικα και το καθένα να γίνεται decrypt όποτε το χρειάζεσαι κατά την εκτέλεση του stub σου.

 

Πάντως να ξέρεις ότι πολλά anti-virus είναι ιδιαίτερα ευαίσθητα σε self-modifying code και πιθανά να κάνουν detect το stub σου.

 

Η καλύτερη λύση είναι να χρησιμοποιήσεις obfuscation ώστε κρύψεις το stub σου από τα κλασικά signatures σχετικά με self-modifying code.

 

Πέρα από junk bytes, μπορείς να χρησιμοποιήσεις ακολουθίες από εντολές που στην ουσία δεν κάνουν τίποτα, όπως add eax,ebx και μετά λίγο πιο κάτω ή αμέσως μετά, ανάλογα με το τι κάνεις, sub eax,ebx.

 

Επίσης, μπορείς να χρησιμοποιήσεις instructions permutations, με άλλα λόγια αντί να χρησιμοποιείς κατευθείαν μια εντολή για ένα συγκεκριμένο σκοπό, να κάνεις το ίδιο χρησιμοποιώντας άλλες εντολές που στην ουσία κάνουν το ίδιο.

 

Για παράδειγμα αντί να κάνεις xor eax,eax μπορείς να κάνεις...

 

push 0

pop eax

 

ή

 

push eax

mov [esp],0

pop eax

 

κτλ..κτλ...για διάφορες εντολές.

Edited by H_T_P

Share this post


Link to post
Share on other sites

Προσπαθώ να βρω πως να γράψω τα νέα sections στο εκτελέσιμο και διαβάζω τον κώδικα του oblique. Βλέπω ότι χρησιμοποιεί την fwrite και την fseek. Ξέρω ότι μπορώ να ψάξω και μόνος αλλά αν μπορείτε να μου εξηγείσετε σύντομα πως χρησιμοποιούνται αυτές οι συναρτήσεις για το συγκεκριμένο σκοπό, πιστεύω θα με βοηθήσετε αρκετά.

 

Επίσης, το stub πρέπει να το γράψω αναγκαστικά σε asm και μετά να το βάλω στον κώδικα;;

Share this post


Link to post
Share on other sites

Προσπαθώ να βρω πως να γράψω τα νέα sections στο εκτελέσιμο και διαβάζω τον κώδικα του oblique. Βλέπω ότι χρησιμοποιεί την fwrite και την fseek. Ξέρω ότι μπορώ να ψάξω και μόνος αλλά αν μπορείτε να μου εξηγείσετε σύντομα πως χρησιμοποιούνται αυτές οι συναρτήσεις για το συγκεκριμένο σκοπό, πιστεύω θα με βοηθήσετε αρκετά.

 

Επίσης, το stub πρέπει να το γράψω αναγκαστικά σε asm και μετά να το βάλω στον κώδικα;;

 

Εξαρτάται τι θες ακριβώς να κάνεις. Μπορείς να χρησιμοποιήσεις windows APIs (αν θες να είναι μόνο συμβατό με windows), προκειμένου να πάρεις όλες τις απαραίτητες πληροφορίες από το PE header, αλλά και για να προσθέσεις το καινούριο section και φυσικά να αλλάξεις το OEP ώστε να δείχνει στο stub σου.

 

Σχετικά με το stub, η καλύτερη λύση είναι να το γράψεις κατευθείαν σε asm διότι ο κώδικας θα είναι μικρότερος και επιπλέον έτσι κ αλλιώς θα πρέπει να τον έχεις σε ένα πίνακα από bytes που θα αντιστοιχούν στις εντολές που θες να κάνεις inject, συνεπώς μπορείς να το γράψεις δοκιμαστικά στην μνήμη ενώ κάνεις debug ένα πρόγραμμα με τον olly και στην συνέχεια να κάνεις binary copy το stub σου.

 

Check this

Edited by H_T_P

Share this post


Link to post
Share on other sites

Βλέπω ότι χρησιμοποιεί την fwrite και την fseek. Ξέρω ότι μπορώ να ψάξω και μόνος αλλά αν μπορείτε να μου εξηγείσετε σύντομα πως χρησιμοποιούνται αυτές οι συναρτήσεις για το συγκεκριμένο σκοπό, πιστεύω θα με βοηθήσετε αρκετά.

 

με το fseek πηγαίνεις σε μια συγκεκριμένη position στο file και το fwrite γράφεις στο position που βρίσκεσαι μέσα στο file...

τα χρησιμοποίησα για να περάσω τα sections και το machine language (δηλαδή τα bytes που δημιουργεί ο assembler από την asm) μέσα στο νέο file..

το link που έδωσε ο HTP θα σε βοηθήσει πολύ στο θέμα..

Share this post


Link to post
Share on other sites
Sign in to follow this  

×