1. Акция на весь декабрь! Получай оплату х2 за уникальные статьи, объемом от 200 слов, если в заголовке темы и теле статьи присутствует слово Python
    Скрыть объявление

Чтение дампа памяти (ассемблер)

Тема в разделе "Другие", создана пользователем puks, 21 янв 2010.

  1. puks

    puks Lotus team
    Lotus team

    Регистрация:
    3 фев 2007
    Сообщения:
    1.967
    Симпатии:
    16
    В одном руководстве приведен следующий пример.

    Sample C Source Code:
    void MyStack(long overLength)
    {
    char myArray1[32]="This is array1";
    char myArray2[32]="This is array2";
    char myArray3[32]="This is array3";
    long arrayLength=32;
    char * buffer=(char *)0x12345678;
    long bufferLength=arrayLength;
    DWORD dw1=10;
    DWORD dw2=11;
    DWORD dw3=12;
    static DWORD dwStatic=100;
    bufferLength=arrayLength;
    buffer=new char[bufferLength];
    memmove((void*) 0xfffffff1,(void*) 0xfffffff2,15);
    delete buffer;
    }
    Sample Stack Trace:
    ############################################################
    ### PASS 2 : FATAL THREAD with STACK FRAMES 1/2 [mhmstand:0aac:0dc4]
    ### FP=0012f47c, PC=10014202, SP=0012f474, stksize=8
    Exception code: c0000005 (ACCESS_VIOLATION)
    ############################################################
    # ---------- Top of the Stack ----------
    # 0012f474 02100210 0012f55c 0012f55c 100037e8 |....\...\....7..|
    [ 1] 0x10014202 myDLL.memmove (fffffff1,fffffff2,f,12f6bc)
    # 0012f47c 0012f55c 100037e8 fffffff1 fffffff2 |\....7..........|
    # 0012f48c 0000000f 0012f6bc 02100210 7ffdf000 |................|
    # 0012f49c cccccccc cccccccc cccccccc cccccccc |................|
    # 0012f4ac cccccccc cccccccc cccccccc cccccccc |................|
    # 0012f4bc cccccccc cccccccc cccccccc cccccccc |................|
    # 0012f4cc cccccccc cccccccc cccccccc cccccccc |................|
    # 0012f4dc cccccccc 00392140 0000000c 0000000b |....@!9.........|
    # 0012f4ec 0000000a 00000020 00392140 00000020 |.... ...@!9. ...|
    # 0012f4fc 73696854 20736920 61727261 00003379 |This is array3..|
    # 0012f50c 00000000 00000000 00000000 00000000 |................|
    # 0012f51c 73696854 20736920 61727261 00003279 |This is array2..|
    # 0012f52c 00000000 00000000 00000000 00000000 |................|
    # 0012f53c 73696854 20736920 61727261 00003179 |This is array1..|
    # 0012f54c 00000000 00000000 00000000 00000000 |................|
    [ 2] 0x100037e8 myDLL.MyStack (400,12fa3c,2100210,7ffdf000)
    # 0012f55c 0012f8d4 10002d6f 00000400 0012fa3c |....o-......<...|
    # 0012f56c 02100210 7ffdf000 cccccccc cccccccc |................|

    ==================================================================
    Насколько я понял, ассемблер заносит данные по принципу младшие разряды в младшие адреса, старшие разряды - в старшие. Например,

    This = 54 68 69 73 - Двойное слово, 54 68 - старший разряд/слово, 69 73 - младший разряд/слово. Каждое слово тоже делится на старший и сладший разряды/байты. В итоге получаем 73 69 68 54 , что и наблюдаем в коде.

    Но я не вижу, что это правило распространяется на числа, указатели, адреса памяти. Например,

    ========
    long arrayLength=32;
    long bufferLength=arrayLength;

    00000020
    ========

    DWORD dw1=10; 0000000a
    DWORD dw2=11; 0000000b
    DWORD dw3=12; 0000000c

    memmove((void*) 0xfffffff1,(void*) 0xfffffff2,15);
    fffffff1 fffffff2 0000000f
    ========

    Спасибо за помощь.
     
  2. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    указатели, адреса памяти - с ними вроде как очевидно, т.к. в асме такого понятия вообще как-бы и нет, то в итоге в виде вместо адресов ставится прямой переход(jmp) на конкретный адрес в памяти (который в регистрах хранить и незачем, он просто прочитается из файла), который подставляется при компиляции.. А насчет чисел..хм.. Должны расставлятся..
    ПС.
    Я дилетант) На истину не претендую
     
  3. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Это Little endian форма записи, свойственная x86 процессорам. На Мотороловских контроллерах принята Big endian форма записи, т.е. наоборот. Ну это так, для общего развития

    Добавлено: А memmove копирует память побайтно, т.е. сохраняя порядок следования байт
     
  4. puks

    puks Lotus team
    Lotus team

    Регистрация:
    3 фев 2007
    Сообщения:
    1.967
    Симпатии:
    16
    Это оказалось очень полезным. Спасибо.


    Хорошо. Но получается, что видя дамп памяти нельзя понять содержание, так как данные заносятся по-разному. Правильно?

    А как с числами, почему они заносятся не как текст?

    А как можно увидеть как сишная программа переведена в асемблеровские команды?
     
  5. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    При компиляции можно создавать файлы с асмовым кодом. Настройка зависит от используемых среды/компилятора.

    А какая конечная цель анализа?
     
  6. puks

    puks Lotus team
    Lotus team

    Регистрация:
    3 фев 2007
    Сообщения:
    1.967
    Симпатии:
    16
    На практике проверить какой код и стэки получаются в разных ситуациях.
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Это понятно... А дальше что? Хотите сравнить быстродействие/занимаемую память?
     
  8. puks

    puks Lotus team
    Lotus team

    Регистрация:
    3 фев 2007
    Сообщения:
    1.967
    Симпатии:
    16
    Да нет. Особенно глубоко копать не надо.

    Все примеры и их разбор нужен для обучения анализа дампов крэша Domino.
     
Загрузка...

Поделиться этой страницей