Ida, проверка принадлежности функции классу
Как узнать принадлежит ли функция какому нибудь классу или нет, на примере начала данной функции из графа:
var_60= qword ptr -60h
var_58= qword ptr -58h
var_50= qword ptr -50h
var_48= qword ptr -48h
var_40= qword ptr -40h
var_38= qword ptr -38h
var_30= qword ptr -30h
var_28= qword ptr -28h
var_20= qword ptr -20h
arg_0= qword ptr 10h
arg_8= qword ptr 18h
arg_10= qword ptr 20h
arg_18= dword ptr 28h
arg_20= dword ptr 30h
arg_28= qword ptr 38h
arg_30= qword ptr 40h
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, 2D78h
call j__alloca_probe
sub rsp, rax
lea rbp, [rsp+60h]
mov rdi, rsp
mov ecx, 0B5Eh
mov eax, 0CCCCCCCCh
Ответы (1 шт):
Функция просто выполняется. Ассембер не знает, что такое класс. Компилятор языка более высокого уравня (например, C++), генерирует фунцию, первым параметром которой является указатель на объект класса. Он используется для доступа к членам класса.
Проследите за использованием rcx в функции, вы увидите чтение/запись по адресам [rcx+class_member_offset]. При этом нельзя определить, это C++ или нет, с таким же успехом это может быть функция C с указателем на структуру.
В приведенном примере rcx сохраняется по адресу [rsp-8+arg_0]. Посмотрите, где еще в функции используется arg_0. Это тоже доступ к членам класса.
В дебагере вы можете посмотреть объект класса в памяти, начиная с адреса [rcx]. Это начальные навыки хакера. Пригодится также при отладке оптимизированного кода.