Pergunta

Atualmente estou analisando um programa que eu escrevi na montagem e estava pensando em mudar algum código em torno da montagem. Eu tenho um procedimento que leva um argumento, mas eu não tenho certeza se ele é passado na pilha ou um registo.

Quando abro o meu programa em IDA Pro, a primeira linha no procedimento é:

ThreadID= dword ptr -4

Se eu colocar o meu cursor sobre a declaração, a seguir também será exibida:

ThreadID dd ?
 r db 4 dup(?)

que eu diria que apontaria para uma variável de pilha?

Quando abro o mesmo programa em OllyDbg no entanto, neste local na pilha há um grande valor, que seria inconsistente com qualquer parâmetro que poderia ter sido passado, levando-me a acreditar que ele é passado num registo.

Alguém pode me apontar na direção certa?

Foi útil?

Solução

Os argumentos maneira são passados ??para uma função depende da função convenção de chamada . A convenção de chamada padrão depende da linguagem, compilador e arquitetura.

Eu não posso dizer nada com certeza com a informação fornecida, no entanto você não deve esquecer que os depuradores de nível de montagem como OllyDbg e disassemblers como IDA muitas vezes usam heurísticas para a engenharia reversa do programa. A melhor maneira de estudar o código gerado pelo compilador é instruir-lo para escrever listagens de montagem. A maioria dos compiladores tem uma opção para fazer isso.

Outras dicas

É uma variável local com certeza. Para conferir argumentos procurar valores [ESP + XXX]. nomes IDA aqueles [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 convenção fastcall como foi descrito no comentário acima usa registros para passar argumentos. Eu apostaria em compilador Microsoft ou GCC, como são mais amplamente utilizado. Então confira ECX e EDX registros em primeiro lugar.

Microsoft ou GCC [2] __fastcall [3] convenções (AKA) __msfastcall passes os dois primeiros argumentos (avaliadas esquerda para a direita) que se encaixam em ECX e EDX. Restantes argumentos são empurrados na pilha da direita para a esquerda. http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top