2010-12-04 4 views
2

Je regarde un dump de code d'IDA pro. Il ya une fonction qui, comme cette mise en page:Que se passe-t-il ici: v5 = * (_ Byte *) (this + 4)?

garbled_name(int this... 
    unsigned int v5 ; 
    v5 = *(_Byte *)(this + 4); 
    ... 

Ce que je suis vraiment curieux de savoir, c'est ce que fait exactement le '+ 4'? Est-ce un ajout ou quelque chose d'autre?

Merci

+2

peut-être 'MOVZX eax, byte ptr [ecx + 4]' sera plus facile à comprendre. – ruslik

Répondre

2

Le code prend l'entier 'this', ajoute 4 à lui, le convertit en un pointeur vers un octet, puis définit 'v5' à la valeur de l'octet à cette adresse.

+0

Vous devriez mentionner que "ajouter 4 à" signifie qu'il avance de quatre fois la taille de l'objet, donc si vous avez une classe de 1000 octets, il déplacera 4000 octets vers l'avant. – EboMike

+0

@EboMike non, dans ce cas, il ajoute juste 4 (c'est «void this») – ruslik

+0

Argh, IDA Pro. J'échoue à la compréhension de la lecture. Encore. – EboMike

1

Il est une référence au cinquième octet depuis le début de l'objet. Selon le compilateur qui a généré ce code, il s'agit probablement de l'élément dans l'ordre des classes qui se trouve au cinquième octet dans l'instance de l'objet.

+0

en fait, il devrait être le cinquième .. – Jack

+0

@Jack: Oui, merci. – wallyk

+0

aucun problème mate :) – Jack

0

EDIT: Soupir, j'ai raté la partie "IDA Pro". Je vais juste laisser ceci ici pour la valeur de divertissement, au cas où quelqu'un se demande ce que "this + 4" fait en code C++ normal.

"this + 4" prend votre pointeur actuel, avance de quatre fois sa taille. Ensuite, il jette cela à un pointeur octet et le lit.

Considérez ceci:

struct A { 
    void foo(); 

    int x; 
    int y; 
}; 

sizeof (A), sur un système 32 bits, est très probablement 8 octets.

A myArray[8]; 
A *pA = myArray; 

maintenant des points à pA & myArray [0].

pA++; 

maintenant des points Pa à & monTableau [1], à savoir qu'il déplacé vers l'avant 8 octets.

void A::foo() { 
    A *pA = this + 4; 
} 

Si vous appelez cela sur & myArray [0], il pointera vers & myArray [4], à savoir 32 octets plus loin sur la route.

2

C'est juste une fonction membre d'une classe C++, this étant un pointeur vers l'objet. Cette signature de l'objet est probablement:

class some_class { 
    int i; // int, void*, short, anything with sizeof() <= 4, and it's not char. 
       // It also can be absent if it's a virtual class (AFAIK it's compiler dependend) 
    unsigned char c; // or c[N] 
    ... 
}; 

Le code en question est:

some_class::some_fn(...){ 
    unsigned int v5 = c; // or c[0] 
    ... 
}; 
Questions connexes