Assembly 无法理解函数的反汇编
我已经将下面的简单函数分解成这个函数,但有几点我不理解。如果人们能帮助我,我会很高兴的 这是我正在分解的函数:Assembly 无法理解函数的反汇编,assembly,x86,disassembly,Assembly,X86,Disassembly,我已经将下面的简单函数分解成这个函数,但有几点我不理解。如果人们能帮助我,我会很高兴的 这是我正在分解的函数: int foo(int a, int b, int c){ int t = 4; int t2 = 5; int t6 = 6; t = b; t2 = c; return (a *= t6); } 我使用以下参数从主函数调用它: foo(2,3,4); 这就是功能分解成的: .text:004013BE ; _DWOR
int foo(int a, int b, int c){
int t = 4;
int t2 = 5;
int t6 = 6;
t = b;
t2 = c;
return (a *= t6);
}
我使用以下参数从主函数调用它:
foo(2,3,4);
这就是功能分解成的:
.text:004013BE ; _DWORD __cdecl foo(int, int, int)
.text:004013BE public __Z3fooiii
.text:004013BE __Z3fooiii proc near ; CODE XREF: _main+2Dp
.text:004013BE ; _main+5Cp
.text:004013BE
.text:004013BE var_C = dword ptr -0Ch
.text:004013BE var_8 = dword ptr -8
.text:004013BE var_4 = dword ptr -4
.text:004013BE arg_0 = dword ptr 8
.text:004013BE arg_4 = dword ptr 0Ch
.text:004013BE arg_8 = dword ptr 10h
.text:004013BE
.text:004013BE push ebp
.text:004013BF mov ebp, esp
.text:004013C1 sub esp, 10h
.text:004013C4 mov [ebp+var_4], 4
.text:004013CB mov [ebp+var_8], 5
.text:004013D2 mov [ebp+var_C], 6
.text:004013D9 mov eax, [ebp+arg_4]
.text:004013DC mov [ebp+var_4], eax
.text:004013DF mov eax, [ebp+arg_8]
.text:004013E2 mov [ebp+var_8], eax
.text:004013E5 mov eax, [ebp+arg_0]
.text:004013E8 imul eax, [ebp+var_C]
.text:004013EC mov [ebp+arg_0], eax
.text:004013EF mov eax, [ebp+arg_0]
.text:004013F2 leave
.text:004013F3 retn
.text:004013F3 __Z3fooiii endp
- 加载函数的局部变量时 (var_c,var_8,var_4)ESP指针被减10小时,十进制16,堆栈内存中的每个变量都是四个字节,我有三个局部变量-因此ESP指针应该被减12(0Ch),为什么它会被减16
- 程序的返回地址保存在哪一点?旧的ESP如何?何时保存
leave
指令将EBP
移动到ESP
,从而恢复堆栈指针
我更担心这些多余的代码。结果已在
EAX
中。为什么要这样移动它?代码段是正确的,一个4字节的变量从0读到3,所以最后一个变量从0H读到10h。这仍然是不正确的,因为在堆栈帧的开头,ebp和esp指向同一地址,例如,假设adress是0x48h,当堆栈向下移动时,第一个变量将是0x48h(0x48h到0x44h)第二个变量将是(0x44h到0x40h)第三个变量将是(0x40h到0x3Ch)。从(0x3Ch到0x38h)会发生什么?您忘记了返回地址位于堆栈顶部aka[esp]
。同样,这仍然没有意义,因为返回地址位于EBP之上(位于当前EBP上方的上一个基准指针上方)我同意,但这是编译器的体系结构。不幸的是,我不明白,在分解了许多类似的程序之后,我明白了这确实是分配给当前堆栈帧的内存的一部分,无论如何,这实际上可以用作安全cookie,不确定。
sub esp, 10h
mov [ebp+arg_0], eax
mov eax, [ebp+arg_0]