Question

J'analyse actuellement un programme je l'ai écrit dans l'assemblage et je songeais à déplacer autour du code dans l'assemblée. J'ai une procédure qui prend un argument, mais je ne sais pas si elle est passée sur la pile ou un registre.

Quand j'ouvre mon programme IDA Pro, la première ligne dans la procédure est:

ThreadID= dword ptr -4

Si je passe la souris mon curseur sur la déclaration, ce qui suit apparaît également:

ThreadID dd ?
 r db 4 dup(?)

que je suppose pointerait à une variable de la pile?

Quand j'ouvre le même programme en OllyDbg cependant, à cet endroit sur la pile il y a une grande valeur, ce qui serait incompatible avec un paramètre qui aurait pu être passé, me conduit à croire qu'il est passé dans un registre.

Quelqu'un peut-il me diriger dans la bonne direction?

Était-ce utile?

La solution

Les arguments façon sont passés à une fonction dépend de la fonction appelant convention. La convention d'appel par défaut dépend de la langue, le compilateur et l'architecture.

Je ne peux rien dire pour que les informations que vous avez fournies, mais vous ne devriez pas oublier que débogueurs niveau d'assemblage comme OllyDbg et désassemblé comme IDA utilisent souvent heuristiques pour désosser le programme. La meilleure façon d'étudier le code généré par le compilateur est de le charger d'écrire des listes de montage. La plupart des compilateurs ont une option pour le faire.

Autres conseils

Il est une variable locale à coup sûr. Pour vérifier des arguments chercher des valeurs [esp + XXX]. IDA noms les [esp + arg_XXX] automatiquement.

.text:0100346A sub_100346A     proc near               ; CODE XREF: sub_100347C+44p
.text:0100346A                                         ; sub_100367A+C6p ...
.text:0100346A
.text:0100346A arg_0           = dword ptr  4
.text:0100346A
.text:0100346A                 mov     eax, [esp+arg_0]
.text:0100346E                 add     dword_1005194, eax
.text:01003474                 call    sub_1002801
.text:01003474
.text:01003479                 retn    4
.text:01003479
.text:01003479 sub_100346A     endp

Et convention fastcall comme cela a été décrit dans le commentaire ci-dessus utilise des registres pour transmettre des arguments. Je serais prêt à parier sur le compilateur Microsoft ou GCC car ils sont plus largement utilisés. Donc, vérifiez ECX et EDX enregistre d'abord.

  

Microsoft ou GCC [2] __fastcall [3]   convention (aka __msfastcall) passe   les deux premiers arguments (évalués   de gauche à droite) qui se logent dans ECX et   EDX. arguments restants sont poussés   sur la pile de droite à gauche.    http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top