Προς το περιεχόμενο

Assembly


or30n

Προτεινόμενες αναρτήσεις

Δημοσ.
Κι εγώ δεν καταλαβαίνω σε τι θα σε βοηθήσει η assembly από τη στιγμή που έχεις το source.

 

Εαν εχω το source του παιχνιδιου πως μπορω να το χρησιμοποιησω ετσι ωστε να εχω το τελικο *.exe?(Δηλαδη το GameServer.exe που ανοιγω με ollydbg και ειναι σε asm)

Οσους εχω ρωτησει που ασχολουντε με το coding στο συγκεκριμενο παιχνιδι μου ειπαν να ξερω asm lang.Τι γινετε τωρα,οταν ανοιγα το αρχειο Gameserver.exe σε ollydbg μου εβγαζε τον κωδικα σε assembly.Τωρα που εχω το source του παιχνιδιου μπορω να το ανοιξω με visual studio c++ 2008 express edition.Αν ομως δεν εχω το source θα πρεπει να το "πειραξω" μεσα απο ollydbg.Το παιχνιδι εχει αρκετες διαφορετικες version και δεν βγαινουν παντα με το source τους.Οποτε εαν εγω εχω π.χ. την τελευταια εκδοση και παιζω και υπαρχει ενα bug τοτε θα πρεπει μεσα απο asm και ollydbg να το φτιαξω.Γιαυτο ψαχνω να βρω ενα ebook για αρχη σχετικα με asm lang και μετα αγοραζω και ενα βιβλιο για πιο προχωρημενα πραγματα.

Δημοσ.

Από τη στιγμή που υπάρχει source code σε C++ σημαίνει ότι γίνεται compilation για να προκύψουν τα exe και dll. Άρα πρέπει να ξέρεις και τα "τερτίπια" του compiler για να βγάλεις άκρη μέσα στον κώδικα assembly ο οποίος πιθανότατα θα έχει τεράστια έκταση.

 

Και στην τελική δεν έχει νόημα να σκαλίζεις την assembly, το bug το φτιάχνεις στο source σε C++ και ξανακάνεις compilation.

 

Είναι απίθανο να έχει αλλάξει θεμελιακά το source code από version σε version. Μια version μπορεί να περιέχει ασήμαντες αλλαγές σε σχέση με την προηγούμενη, οπότε και αν έχεις source για μια version πίσω του προγράμματος μπορείς να βρεις αφενός πώς το σχεδίασαν κι αφετέρου πού πρέπει να επέμβεις για να αλλάξεις ότι θες. Μετά μόλις αποκτήσεις το source μιας επόμενης version, θα ξέρεις πιο γρήγορα πού να επέμβεις και πάλι.

Δημοσ.

Εαν εχω το source του παιχνιδιου πως μπορω να το χρησιμοποιησω ετσι ωστε να εχω το τελικο *.exe?(Δηλαδη το GameServer.exe που ανοιγω με ollydbg και ειναι σε asm)Μεσω Dev-C++ γινετε?

Δημοσ.

Θεωρητικά κάνεις compilation του source σε C++ με ένα κατάλληλο compiler για το λειτουργικό σύστημα που έχεις.

 

Πρέπει να έχεις όμως κι άλλα πράγματα πέρα από το source code, π.χ. τις βιβλιοθήκες που χρησιμοποιεί το source code για να γίνει το compilation.

 

Το .exe αρχείο είναι δυαδικό αρχείο που περιέχει εκτελέσιμο κώδικα και δεδομένα. Το ollydbg μετατρέπει δυαδικό κώδικα σε assembly και έχει κάποια κριτήρια με τα οποία ξεχωρίζει αν πρόκειται για εκτελέσιμο κώδικα ή δεδομένα, και τα παρουσιάζει ανάλογα.

 

Η assembly δεν είναι στην πραγματικότητα γλώσσα, είναι ένα "avatar" του δυαδικού κώδικα (που θα περάσει στον συγεκριμένο επεξεργαστή). Π.χ. αντί να γράφεις στη σειρά δυαδικά ή δεκαεξαδικά ψηφία γράφεις το λεγόμενο mnemonic. Οτιδήποτε μοιάζει με μεταβλητές μέσα στην assembly θα μετατραπεί άμεσα σε αριθμό. Γι' αυτό η assembly δεν είναι μονοσήμαντα ορισμένη αλλά εξαρτάται από τον επεξεργαστή που δουλεύεις.

Δημοσ.
Θεωρητικά κάνεις compilation του source σε C++ με ένα κατάλληλο compiler για το λειτουργικό σύστημα που έχεις.

 

Πρέπει να έχεις όμως κι άλλα πράγματα πέρα από το source code, π.χ. τις βιβλιοθήκες που χρησιμοποιεί το source code για να γίνει το compilation.

 

Το .exe αρχείο είναι δυαδικό αρχείο που περιέχει εκτελέσιμο κώδικα και δεδομένα. Το ollydbg μετατρέπει δυαδικό κώδικα σε assembly και έχει κάποια κριτήρια με τα οποία ξεχωρίζει αν πρόκειται για εκτελέσιμο κώδικα ή δεδομένα, και τα παρουσιάζει ανάλογα.

 

Η assembly δεν είναι στην πραγματικότητα γλώσσα, είναι ένα "avatar" του δυαδικού κώδικα (που θα περάσει στον συγεκριμένο επεξεργαστή). Π.χ. αντί να γράφεις στη σειρά δυαδικά ή δεκαεξαδικά ψηφία γράφεις το λεγόμενο mnemonic. Οτιδήποτε μοιάζει με μεταβλητές μέσα στην assembly θα μετατραπεί άμεσα σε αριθμό. Γι' αυτό η assembly δεν είναι μονοσήμαντα ορισμένη αλλά εξαρτάται από τον επεξεργαστή που δουλεύεις.

 

Αχα.Να ρωτησω κατι αλλο εγω τωρα.Εαν μαθω να προγραματιζω σε γλωσσα c++ θα μου ειναι πιο ευκολο να μαθω μετα assembly η να παω κατευθειαν σε assembly?

Δημοσ.

Μάλλον πρέπει να μάθεις και τα δύο.

 

Η assembly εξαρτάται από τον επεξεργαστή ενώ η C++ διατηρεί ένα επίπεδο ανεξαρτησίας από τον επεξεργαστή. Οπότε με την assembly θα μάθεις αναγκαστικά (και ουσιαστικά) την αρχιτεκτονική ενός συγκεκριμένου επεξεργαστή, ενώ με τη C++ θα μάθεις προγραμματισμό που είναι ανεξάρτητος από αυτήν.

 

Πάντως ο gcc (που είναι C compiler) που έχουν τα linux εξάγει και κώδικα assembly, έτσι π.χ. το πρόγραμμα σε C

 

>
#include<stdio.h>
void main()
{
printf("give this man an example.");
}

 

στην assembly του επεξεργαστή μου θα είναι

 

>
.file	"test.c"
.section	.rodata
.LC0:
.string	[b]"give this man an example."[/b]
.text
.globl main
.type	main, @function
main:
[b]	leal	4(%esp), %ecx
andl	$-16, %esp
pushl	-4(%ecx)
pushl	%ebp
movl	%esp, %ebp
pushl	%ecx
subl	$4, %esp
movl	$.LC0, (%esp)
call	printf
addl	$4, %esp
popl	%ecx
popl	%ebp
leal	-4(%ecx), %esp
ret[/b]
.size	main, .-main
.ident	"GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section	.note.GNU-stack,"",@progbits

 

όπου τα bolded (νομίζω τα πήρα όλα όσα πρέπει) είναι η ουσία, δηλαδή οι instructions + data που πηγαίνουν στον επεξεργαστή, τα άλλα είναι στην πράξη "διευκολύνσεις" για αναγνωσιμότητα.

Δημοσ.
Μάλλον πρέπει να μάθεις και τα δύο.

 

Η assembly εξαρτάται από τον επεξεργαστή ενώ η C++ διατηρεί ένα επίπεδο ανεξαρτησίας από τον επεξεργαστή. Οπότε με την assembly θα μάθεις αναγκαστικά (και ουσιαστικά) την αρχιτεκτονική ενός συγκεκριμένου επεξεργαστή, ενώ με τη C++ θα μάθεις προγραμματισμό που είναι ανεξάρτητος από αυτήν.

 

Πάντως ο gcc (που είναι C compiler) που έχουν τα linux εξάγει και κώδικα assembly, έτσι π.χ. το πρόγραμμα σε C

 

>
#include<stdio.h>
void main()
{
printf("give this man an example.");
}

 

στην assembly του επεξεργαστή μου θα είναι

 

>
.file	"test.c"
.section	.rodata
.LC0:
.string	[b]"give this man an example."[/b]
.text
.globl main
.type	main, @function
main:
[b]	leal	4(%esp), %ecx
andl	$-16, %esp
pushl	-4(%ecx)
pushl	%ebp
movl	%esp, %ebp
pushl	%ecx
subl	$4, %esp
movl	$.LC0, (%esp)
call	printf
addl	$4, %esp
popl	%ecx
popl	%ebp
leal	-4(%ecx), %esp
ret[/b]
.size	main, .-main
.ident	"GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section	.note.GNU-stack,"",@progbits

 

όπου τα bolded (νομίζω τα πήρα όλα όσα πρέπει) είναι η ουσία, δηλαδή οι instructions + data που πηγαίνουν στον επεξεργαστή, τα άλλα είναι στην πράξη "διευκολύνσεις" για αναγνωσιμότητα.

 

Σε ευχαριστω πολυ για τις απαντησεις σου.Αν ξανα εχω αλλη απορια θα γραψω.Με βοηθησες αρκετα.Εχω αρχισει ηδη με c++ και ειμαι σε καλο δρομο (ασ πουμε).

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...