Domanda

Al momento sto analizzando un programma che ho scritto in assembly e stavo pensando di trasferirsi po 'di codice in giro per il montaggio. Ho una procedura che accetta un argomento, ma non sono sicuro se viene passato sulla pila o di un registro.

Quando ho aperto il mio programma in IDA Pro, la prima riga della procedura è:

ThreadID= dword ptr -4

Se mi passa il mouse il cursore sopra la dichiarazione, la seguente appare anche:

ThreadID dd ?
 r db 4 dup(?)

, che vorrei assumere sarebbe puntare a una variabile di stack?

Quando ho aperto lo stesso programma in OllyDbg tuttavia, in questo posto sulla pila v'è un grande valore, che sarebbe incompatibile con qualsiasi parametro che avrebbe potuto essere superato, mi porta a credere che sia passato in un registro.

Qualcuno mi può punto nella giusta direzione?

È stato utile?

Soluzione

Il modo in cui gli argomenti vengono passati a una funzione dipende convenzione di chiamata . La convenzione di default di chiamata dipende dalla lingua, compilatore e l'architettura.

Non posso dire nulla di certo con le informazioni che hai fornito, tuttavia, non si deve dimenticare che i debugger a livello di assemblaggio come OllyDbg e disassemblatori come IDA spesso utilizzano euristica di decodificare il programma. Il modo migliore per studiare il codice generato dal compilatore è quello di istruire per scrivere elenchi di assemblaggio. La maggior parte dei compilatori hanno la possibilità di farlo.

Altri suggerimenti

Si tratta di una variabile locale di sicuro. Per le nostre argomentazioni cercano [ESP + XXX] valori. nomi IDA quelli [esp + arg_XXX] automaticamente.

.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

E convenzione fastcall come è stato illustrato in commento sopra utilizza registri per passare argomenti. Scommetto su Microsoft o compilatore GCC in quanto sono più ampiamente utilizzati. Allora date un'occhiata ECX, EDX registra prima.

  

Microsoft o GCC [2] __fastcall [3]   convenzione (alias __msfastcall) passa   i primi due argomenti (valutati   da sinistra a destra), che rientrano in ECX e   EDX. argomenti rimanenti sono spinti   nello stack da destra a sinistra.    http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top