Vai argumentos para uma função ser passados ??na pilha ou num registo?
-
13-09-2019 - |
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?
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