ida начало функции в графе
Когда ida преобразует функцию в графы, то в большинстве функции начинаются примерно так:
var_230= byte ptr -230h
var_210= qword ptr -210h
var_1FC= dword ptr -1FCh
var_1D8= byte ptr -1D8h
var_E8= byte ptr -0E8h
var_BC= byte ptr -0BCh
var_98= byte ptr -98h
var_68= byte ptr -68h
var_38= qword ptr -38h
var_28= qword ptr -28h
var_20= qword ptr -20h
var_18= qword ptr -18h
arg_0= qword ptr 10h
arg_8= qword ptr 18h
arg_10= qword ptr 20h
arg_18= dword ptr 28h
arg_20= qword ptr 30h
mov [rsp-8+arg_18], r9d
mov [rsp-8+arg_10], r8
mov [rsp-8+arg_8], rdx
mov [rsp-8+arg_0], rcx
push rbp
push rdi
mov eax, 1048h
call j__alloca_probe
sub rsp, rax
lea rbp, [rsp+60h]
mov rdi, rsp
mov ecx, 412h
mov eax, 0CCCCCCCCh
rep stosd
mov rcx, [rsp+1050h+arg_8]
mov [rbp+0FF0h+var_A8], 0FFFFFFFFFFFFFFFEh
mov rax, cs:__security_cookie
xor rax, rbp
кроме того что var_число это локальные переменные, ну и arg это аргументы я понимаю, но как мне понять где из этих аргументов this ? Почему вхождение аргументов идет прям в функции, а не перед ней? Как понять почему именно в эти регистрах находятся аргументы? И кто нибудь сможет прокомментировать по строчно что здесь происходит?
Ответы (1 шт):
В ассемблере 64 бита, когда вызывется функция, стек выглядит следующим образом:
...
parameter 5 [rsp+40] (optional)
r9 home [rsp+32]
r8 home [rsp+24]
rdx home [rsp+16]
rcx home [rsp+8]
return address [rsp]
Код:
mov [rsp-8+arg_18], r9d
mov [rsp-8+arg_10], r8
mov [rsp-8+arg_8], rdx
mov [rsp-8+arg_0], rcx
сохраняет первые 4 параметра функции (rcx, rdx, r8, r9) в home area. Это освобождает регистры для текущего пользования, параметры могут быть считаны из home area.
Почему в коде используется [rsp-8+...], в данном контексте непонятно. Но адреса получаются правильные. Возможно, дальше в функции устанавливается rbp = rsp - 8 (rsp на момент вызова), и все адреса пишутся относительно rbp.
Если это не статический метод класса, то this в регистре rcx.