0000237zIx1Btibo.es.srt
Este video es la parte 2 del mismo ejercicio de reverse engineering. El enfoque está en reconstruir los tres objetos de MyClass y el método entrada (input del usuario).
Objeto MyClass — ubicación en memoria:
Los tres objetos no están en el mismo lugar:
obj1 → heap (creado con new)obj2 → stackobj3 → sección .data (objeto estático/global)Constructor y copia:
El constructor retorna this en RAX, y ese retorno se asigna a una variable que es esencialmente una copia del puntero (MyClass*). Se renombró como _copy para diferenciarlo del original.
Método entrada (input):
Cada objeto pasa por esta función que hace lo siguiente en orden:
"Ingresar tu nombre y password" + un contador (entero que va de 1 a 3), usando operator<< con cout.user (string) con operator>> desde cin.password (entero) con operator>>.El layout del objeto en memoria tiene: user (string), password (int), 4 bytes de padding, y stream2.
Comportamiento del compilador (inlining):
Para obj1, el compilador llama normalmente a entrada. Para obj2 y obj3, inlinea todo el cuerpo de la función directamente en main en vez de hacer un call. El presentador menciona que esto es una optimización cuestionable del compilador porque explota el tamaño del ejecutable sin beneficio claro.
vtable y namespacing:
Se renombró la función en la vtable de MyClass como MyClass::entrada para que quede correctamente dentro del namespace de la clase. También se identificó un bug en IDA/Ghidra donde operator<< con templates se muestra con un nombre incorrecto (parte del template se confunde con el nombre de la función), por lo cual se abrió un ticket.