<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Victor Gonzalez</title>
    <description>The latest articles on DEV Community by Victor Gonzalez (@m0nkeydev).</description>
    <link>https://dev.to/m0nkeydev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3571256%2F8eee6608-2b28-4f04-9ef8-6afb3b1236a3.jpg</url>
      <title>DEV Community: Victor Gonzalez</title>
      <link>https://dev.to/m0nkeydev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/m0nkeydev"/>
    <language>en</language>
    <item>
      <title>Guía de Reversing para vftables/vptr y RTTI en x64</title>
      <dc:creator>Victor Gonzalez</dc:creator>
      <pubDate>Fri, 17 Oct 2025 14:50:33 +0000</pubDate>
      <link>https://dev.to/m0nkeydev/guia-de-reversing-para-vftablesvptr-y-rtti-en-x64-1p69</link>
      <guid>https://dev.to/m0nkeydev/guia-de-reversing-para-vftablesvptr-y-rtti-en-x64-1p69</guid>
      <description>&lt;p&gt;Sup reversers&lt;/p&gt;

&lt;p&gt;En este post desglosaremos qué son las funciones virtuales, cómo se implementan usando &lt;strong&gt;vpointers (punteros virtuales)&lt;/strong&gt; y &lt;strong&gt;vftables (tablas de funciones virtuales)&lt;/strong&gt;, y cómo el compilador nos permite identificar tipos de objetos en tiempo de ejecución a través de &lt;strong&gt;RTTI (RunTime Type Information)&lt;/strong&gt;. Lo más importante es que veremos cómo identificar y analizar todo esto en nuestra herramienta favorita: &lt;strong&gt;IDA Pro&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  El Layout de un Objeto en Memoria: La Base de Todo
&lt;/h2&gt;

&lt;p&gt;Antes de hablar de punteros y tablas virtuales, entendamos cómo se ve un objeto simple en memoria.&lt;/p&gt;

&lt;p&gt;Imagina esta clase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// compilado con cl.exe /d1reportSingleClassLayoutDog x64&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;breed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;bark&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En memoria, una instancia de &lt;code&gt;Dog&lt;/code&gt; es súper simple. Es solo un bloque contiguo que contiene sus variables miembro, en el orden en que fueron declaradas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;++
| age (4 bytes)   |
++
| breed (16 bytes)|
++
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No hay nada más. Las funciones como &lt;code&gt;bark()&lt;/code&gt; no se almacenan en cada objeto; existen en una única ubicación en la sección &lt;code&gt;.text&lt;/code&gt; del binario. Cuando llamas a &lt;code&gt;dog_instance.bark()&lt;/code&gt;, el compilador ya sabe en tiempo de compilación la dirección exacta de la función &lt;code&gt;Dog::bark()&lt;/code&gt;, por lo que la llamada es directa.&lt;/p&gt;

&lt;h2&gt;
  
  
  La Magia del Polimorfismo: Funciones Virtuales, VPTR y VTABLE
&lt;/h2&gt;

&lt;p&gt;Aquí es donde la cosa se pone interesante. El polimorfismo permite que una clase derivada reimplemente un método de su clase base.&lt;/p&gt;

&lt;p&gt;Considera este ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;makeSound&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* Sonido genérico de animal */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cat&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;makeSound&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* "Meow!" */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;makeSound&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* "Woof!" */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si tenemos un puntero de tipo &lt;code&gt;Animal*&lt;/code&gt;, puede apuntar a un objeto &lt;code&gt;Animal&lt;/code&gt;, &lt;code&gt;Cat&lt;/code&gt; o &lt;code&gt;Dog&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;Animal* pAnimal = new Cat();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Cuando llamamos a &lt;code&gt;pAnimal&amp;gt;makeSound()&lt;/code&gt;, ¿cómo sabe el programa que debe ejecutar la versión de &lt;code&gt;Cat&lt;/code&gt; y no la de &lt;code&gt;Animal&lt;/code&gt;? La respuesta está en las &lt;strong&gt;funciones virtuales&lt;/strong&gt; y su implementación a través del &lt;code&gt;vptr&lt;/code&gt; y la &lt;code&gt;vftable&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  ¿Qué son el VPTR y la VTABLE?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VTABLE (Virtual Function Table):&lt;/strong&gt; Por cada clase que tiene al menos una función virtual (o hereda de una que la tiene), el compilador crea una tabla estática de punteros a funciones. Esta es la "tabla de funciones virtuales" o &lt;code&gt;vftable&lt;/code&gt;. Cada entrada en esta tabla es la dirección de una de las funciones virtuales de esa clase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VPTR (Virtual Pointer):&lt;/strong&gt; Cuando se crea una instancia de un objeto de una clase con funciones virtuales, el compilador añade un miembro "oculto" al objeto. Este miembro es un puntero, llamado &lt;code&gt;vptr&lt;/code&gt;, que apunta a la &lt;code&gt;vftable&lt;/code&gt; correspondiente a la clase del objeto. En x64, este puntero tiene 8 bytes y &lt;strong&gt;siempre se encuentra al principio del layout del objeto&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El layout de nuestro objeto &lt;code&gt;Cat&lt;/code&gt; ahora se ve así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;++  &amp;lt; Puntero al objeto (this)
|   vptr (8 bytes)           | &amp;gt; apunta a la vftable de Cat
++
|   ... otros miembros ...   |
++
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La &lt;code&gt;vftable&lt;/code&gt; de &lt;code&gt;Cat&lt;/code&gt; se vería así en memoria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dirección de la VTABLE de Cat:
++
| &amp;amp;Cat::makeSound                 | &amp;gt; Puntero a la implementación de Cat
++
| ... otros punteros virtuales ...|
++
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ¿Cómo funciona una llamada virtual en ensamblador (x64)?
&lt;/h3&gt;

&lt;p&gt;Cuando el código hace &lt;code&gt;pAnimal&amp;gt;makeSound()&lt;/code&gt;, el ensamblador generado hace lo siguiente:&lt;/p&gt;

&lt;p&gt;Obtiene la dirección del objeto (&lt;code&gt;pAnimal&lt;/code&gt;). En x64, el puntero &lt;code&gt;this&lt;/code&gt; se pasa por el registro &lt;code&gt;RCX&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lee el &lt;code&gt;vptr&lt;/code&gt; que está al inicio del objeto: &lt;code&gt;MOV RAX, [RCX]&lt;/code&gt;. Ahora &lt;code&gt;RAX&lt;/code&gt; contiene la dirección de la &lt;code&gt;vftable&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Llama a la función correcta usando un offset en la &lt;code&gt;vftable&lt;/code&gt;. Si &lt;code&gt;makeSound&lt;/code&gt; es la primera función virtual, el offset es 0: &lt;code&gt;CALL [RAX + 0]&lt;/code&gt;. Si es la segunda, sería &lt;code&gt;CALL [RAX + 8]&lt;/code&gt;, y así sucesivamente.&lt;/p&gt;

&lt;p&gt;Esta indirección a través de la tabla es lo que permite que el mismo código de llamada (&lt;code&gt;pAnimal&amp;gt;makeSound()&lt;/code&gt;) ejecute diferentes funciones dependiendo del tipo real del objeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analizando VTables en IDA Pro
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Carga tu binario en IDA.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encuentra el constructor de la clase.&lt;/strong&gt; A menudo, los constructores son fáciles de identificar porque es donde se inicializa el &lt;code&gt;vptr&lt;/code&gt;. Busca una instrucción como esta (asumiendo que &lt;code&gt;RCX&lt;/code&gt; es el puntero &lt;code&gt;this&lt;/code&gt; al nuevo objeto):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;```
LEA RAX, const Cat::`vftable' ; Carga la dirección de la vftable en RAX
MOV [RCX], RAX              ; Escribe la dirección en el primer campo del objeto (el vptr)
```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Navega a la VTable.&lt;/strong&gt; Haz doble clic en el nombre de la &lt;code&gt;vftable&lt;/code&gt; (ej. &lt;code&gt;Cat::&lt;/code&gt;vftable'&lt;code&gt;). IDA te llevará a la sección de datos (&lt;/code&gt;.rdata&lt;code&gt;o&lt;/code&gt;.data`) donde está definida.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inspecciona la VTable.&lt;/strong&gt; Verás una lista de punteros (&lt;code&gt;DQ&lt;/code&gt;  Define Quadword, para 8 bytes). Estos son los punteros a las funciones virtuales. IDA es lo suficientemente inteligente como para resolverlos y mostrarte los nombres de las funciones.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;![IDA VTABLE](https://i.imgur.com/O8ZzYhL.png)
*(Ejemplo visual de cómo se ve una vtable en IDA)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Analiza una llamada virtual.&lt;/strong&gt; Busca en el código lugares donde se use el &lt;code&gt;vptr&lt;/code&gt;. Verás el patrón &lt;code&gt;[REG_THIS]&lt;/code&gt;, &lt;code&gt;[REG_VTABLE]&lt;/code&gt;, &lt;code&gt;CALL&lt;/code&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;```
MOV RAX, [RCX]   ; RCX tiene el puntero al objeto. RAX ahora tiene el vptr.
CALL [RAX+8]     ; Llama a la segunda función virtual de la tabla.
```
Si ves esto, ¡felicidades! Has encontrado una llamada a una función virtual.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Identificación de Tipos: RTTI y el "Puntero Layout ID" en MSVC++
&lt;/h2&gt;

&lt;p&gt;He mencionado &lt;code&gt;PUNTERO LAYOUT ID&lt;/code&gt; y &lt;code&gt;latitud T de MSVC++&lt;/code&gt;. Estos no son términos estándar, pero apuntan directamente a una característica crucial: &lt;strong&gt;RunTime Type Information (RTTI)&lt;/strong&gt;. RTTI es el mecanismo que C++ utiliza para permitir la identificación de tipos de objetos durante la ejecución (por ejemplo, para &lt;code&gt;dynamic_cast&lt;/code&gt; y &lt;code&gt;typeid&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;En MSVC++, la información de RTTI está ingeniosamente vinculada a la &lt;code&gt;vftable&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  El &lt;code&gt;CompleteObjectLocator&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Justo &lt;em&gt;antes&lt;/em&gt; de la &lt;code&gt;vftable&lt;/code&gt; en la memoria, MSVC++ coloca un puntero a una estructura llamada &lt;strong&gt;&lt;code&gt;_RTTICompleteObjectLocator&lt;/code&gt;&lt;/strong&gt;. Podemos pensar en esta estructura como la "cédula de identidad" del objeto.&lt;/p&gt;

&lt;p&gt;La &lt;code&gt;vftable&lt;/code&gt; que vimos antes en realidad se ve así en memoria:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
++&lt;br&gt;
| &amp;amp;RTTICompleteObjectLocator      |  &amp;lt; En vftable[1]&lt;br&gt;
++&lt;br&gt;
| &amp;amp;Class::virtual_func_1          |  &amp;lt; Comienzo real de la vftable (vftable[0])&lt;br&gt;
++&lt;br&gt;
| &amp;amp;Class::virtual_func_2          |&lt;br&gt;
++&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Este &lt;code&gt;CompleteObjectLocator&lt;/code&gt; es la clave para todo. Su estructura es algo así:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;cpp&lt;br&gt;
struct _RTTICompleteObjectLocator {&lt;br&gt;
    DWORD signature; // Siempre '1' en x64, '0' en x86.&lt;br&gt;
    DWORD offset;    // Offset del vptr dentro del objeto.&lt;br&gt;
    DWORD cdOffset;  // Offset del constructor.&lt;br&gt;
    _RTTITypeDescriptor* pTypeDescriptor; // ¡La joya! Puntero a la descripción del tipo.&lt;br&gt;
    _RTTIClassHierarchyDescriptor* pClassHierarchy; // Describe la herencia.&lt;br&gt;
};&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;El campo más importante para nosotros es &lt;code&gt;pTypeDescriptor&lt;/code&gt;. Este puntero nos lleva a otra estructura que contiene el nombre de la clase.&lt;/p&gt;
&lt;h3&gt;
  
  
  Analizando RTTI en IDA Pro
&lt;/h3&gt;

&lt;p&gt;Este es el proceso para identificar manualmente el tipo de un objeto del que solo tienes un puntero:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encuentra el &lt;code&gt;vptr&lt;/code&gt; del objeto.&lt;/strong&gt; Ya sea en un registro (&lt;code&gt;RCX&lt;/code&gt;, &lt;code&gt;RDX&lt;/code&gt;...) o en la pila.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ve a la &lt;code&gt;vftable&lt;/code&gt;.&lt;/strong&gt; Sigue el puntero. &lt;code&gt;MOV RAX, [RCX]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encuentra el &lt;code&gt;CompleteObjectLocator&lt;/code&gt;.&lt;/strong&gt; El puntero a esta estructura está en &lt;code&gt;[RAX  8]&lt;/code&gt; (un QWORD antes del inicio de la vftable).&lt;br&gt;
    &lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
    MOV RAX, [RCX]   ; RAX = &amp;amp;vftable&lt;br&gt;
    MOV RDX, [RAX8] ; RDX = &amp;amp;CompleteObjectLocator&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decodifica el nombre.&lt;/strong&gt; IDA hace esto automáticamente la mayor parte del tiempo. Si sigues el puntero en &lt;code&gt;pTypeDescriptor&lt;/code&gt; (el cuarto campo del &lt;code&gt;CompleteObjectLocator&lt;/code&gt;), llegarás a una estructura &lt;code&gt;TypeDescriptor&lt;/code&gt;. A partir de un cierto offset dentro de ella, encontrarás el nombre "mangled" (decorado) de la clase, como &lt;code&gt;.?AVCat@@&lt;/code&gt;. IDA a menudo lo decodifica y lo muestra como un comentario: &lt;code&gt;'class Cat'&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;![IDA RTTI](https://i.imgur.com/eJd4fJp.png)
*(Ejemplo visual de cómo IDA muestra la información de RTTI)*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Beneficio práctico en Reversing:&lt;/strong&gt;&lt;br&gt;
Imagina que estás analizando un malware orientado a objetos. Ves una llamada virtual: &lt;code&gt;CALL [RAX+10h]&lt;/code&gt;. No sabes qué función se está ejecutando. Pero si puedes identificar el objeto, puedes usar RTTI para saber que es, por ejemplo, de la clase &lt;code&gt;HttpConnection&lt;/code&gt;. Ahora sabes que esa llamada virtual probablemente es algo como &lt;code&gt;send_data&lt;/code&gt; o &lt;code&gt;receive_data&lt;/code&gt;, lo que te da un contexto invaluable.&lt;/p&gt;

&lt;p&gt;Entender cómo el compilador de C++ implementa estas características es una skill muy importante para el analista de software.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VPTR y VTABLE&lt;/strong&gt; son el corazón del polimorfismo. Recuerda: el &lt;code&gt;vptr&lt;/code&gt; está al inicio del objeto y apunta a la &lt;code&gt;vftable&lt;/code&gt;. Las llamadas virtuales usan este puntero para encontrar la función correcta.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RTTI&lt;/strong&gt; es la libreta de identidad de los objetos. En MSVC++, está vinculada a la &lt;code&gt;vftable&lt;/code&gt; a través del &lt;code&gt;CompleteObjectLocator&lt;/code&gt;, que se encuentra justo antes de la tabla.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La próxima vez que veas un &lt;code&gt;CALL [RAX+offset]&lt;/code&gt; en IDA, no te asustes. Sigue los punteros, busca la &lt;code&gt;vftable&lt;/code&gt;, inspecciona el RTTI.&lt;/p&gt;

&lt;p&gt;Happy reversing.&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>reversing</category>
      <category>ida</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
