стековый кадр

Discussion in 'Реверсинг' started by ShkiperLol, 6 Nov 2010.

  1. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Здраствуйте,у меня вопрос поповоду стекового кадра.А точнее поповоду переменных которые в нем находяться.
    Есть две переменные char a[20];char b[20];
    Открываю ехе через Ida.

    Ида показывает такое:
    .text:00401360 var_28 = dword ptr -28h
    .text:00401360 s = byte ptr -14h

    var_28 ето переменная b.28-это начало ее положение в стековом кадре.s это переменная а,ее местоположение начинаеться с 14.

    Скрин содержимого стека:
    [​IMG]

    Скажите пожалуйста,почему var_28 ,она же переменная b занимает 16 байт в стековом кадре а не 19?Куда делось 3 байта?
     
  2. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    А функция верно в ida распозналась (начало, конец)? Программа то интерактивная, ждет сотрудничества с пользователем а не тупо автоматом все делает за него. Переменные используются в коде ? Не забываем что компилятор временами оптимизирует код. Надо все учитывать по возможности
     
  3. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Да используються.Вот полній код.
    Code:
    #include <iostream.h>
    extern "C" __declspec(dllexport) Mes();
     Mes()
     {
      cout<<"Root"<<"\n";
      Sleep(INFINITE);
     }
    buf()
     {
     char a[10];
     char b[10];
     int i=0;
     int t;
     t=(int)&b;
     cout<<"B"<<"\n";
       for(i;i<sizeof(b);i++)
        {
       cout<<hex<<"."<<t<<"  "<<"b"<<dec<<"["<<i<<"]"<<"\n";
       t++;
       }
       cout<<"end b"<<"\n";
       cout<<"A"<<"\n";
        t=(int)&a;
        i=0;
       for(i;i<sizeof(a);i++)
        {
       cout<<hex<<"."<<t<<"  "<<"a"<<dec<<"["<<i<<"]"<<"\n";
       t++;
       }
       cout<<"end a"<<"\n";
       printf("A:");gets(&a[0]);
       printf("B:");gets(&b[0]);
       cout<<"A:"<<a<<"\n";
     }
    int main(int argc, char* argv[])
    {  buf();
       cout<<"main"<<"\n";
    
       Sleep(5000);
    
            return 0;
    }
    
    
     
  4. fluffylion

    fluffylion Member

    Joined:
    22 Feb 2010
    Messages:
    55
    Likes Received:
    10
    Reputations:
    0
    Почему b должна занимать 16 байт? В первом посте вы писали, что определяете два массива по 20 байт - char a[20] и char b[20].

    По скрину - IDA все правильно распознала. В стеке располагаются два массива по 20 байт.
     
  5. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    я уже все понял.dd-4 байта,db-1 байт итого получиться 20 байт.Я просто незнал что dd 4 байта занимает.И щитал только db.