2011-05-09 1 views
4

Voici ce que je veux réaliser. J'ai identifié une classe que j'ai définie comme une structure pour stocker des données de classe. L'une des méthodes de la classe utilise class-field comme si c'était un pointeur sur vtable.Est-il possible dans IDA Pro d'effectuer un décalage de champ struct vers vtable qui est défini dans le segment .data?

int __thiscall SignOn(struc_4 *this) 
{ 
    v1 = this; 
    if (!v1->vtable_40194AE0) 
    return E_UNEXPECTED; 
    v1->field_3E8 = 0; 
    if (!sub_686F7193(v1)) 
    return (*(*v1->vtable_40194AE0 + 12))(v1->vtable_40194AE0, 0, 0); // sub_40128EEE 
} 

Comme vous pouvez le voir, il appelle la 3ème fonction de vtable. En exécution j'identifiais que vtable_40194AE0 pointe vers tableau dans la section .data qui ressemble à ce

off_40194AE0 dd offset InternalQueryInterface 
       dd offset AddRef 
       dd offset Release 
       dd offset sub_40128EEE ; 3 
       dd offset sub_40128F8C 
       dd offset sub_4012C2E2 ; 5 

Est-il possible de dire en quelque sorte que l'IDA vtable_40194AE0 pointe toujours à VTABLE à 0x40194AE0 appel ainsi donné dans le pseudo-code ressemblera à

return vtable_40194AE0->sub_40128EEE(v1->vtable_40194AE0, 0, 0); 

?

J'ai essayé de mettre vtable_40194AE0 de la structure pour être « décalage défini par l'utilisateur », mais il ne permet pas :(

Merci beaucoup!

Répondre

0

A ma connaissance, non. IDA struct ne sont que à condition de rendre le processus de visualisation des données démontées plus facile. le plus que vous pouvez faire est des commentaires sur le site d'appel afin d'identifier la fonction virtuelle réelle étant fenêtre appelée.

5

Bien sûr, il est possible!

Ouvrir « Structures », trouvez votre classe ct (struc_4 dans votre cas) et ouvrez-le (s'il s'est effondré). Sélectionnez le champ vtable (il doit être à la première place), appuyez sur Y et entrez la déclaration de type comme un pointeur vers vtable struct dans la fenêtre ouverte (vtable_40194AE0 * dans votre cas). C'est tout.

+0

Salut! vtable_40194AE0 n'est pas une structure dans mon cas. C'est un nom d'un champ de structure struc_4. – expert

1

Vous pouvez faire une structure représentant le vtable, déclarer des types C de ses champs avec Y (à taper des pointeurs de fonction) et faire le décalage dans le call [ecx+12] un décalage de cette structure avec T. De cette façon, l'IDA reconnaîtra les arguments de l'appel. Dans la structure représentant la classe, définissez le type de champ vtable comme pointeur sur la structure vtable, puis si vous avez de la chance, decompiler mettra les choses ensemble et placera le nom du champ de structure vtable dans l'appel au lieu de un décalage.

Questions connexes