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

puks

Well-Known Member
Lotus team
03.02.2007
1 971
16
#1
В одном руководстве приведен следующий пример.

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
========

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

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#2
указатели, адреса памяти - с ними вроде как очевидно, т.к. в асме такого понятия вообще как-бы и нет, то в итоге в виде вместо адресов ставится прямой переход(jmp) на конкретный адрес в памяти (который в регистрах хранить и незачем, он просто прочитается из файла), который подставляется при компиляции.. А насчет чисел..хм.. Должны расставлятся..
ПС.
Я дилетант) На истину не претендую
 
04.09.2006
2 566
2
Минск
#3
Насколько я понял, ассемблер заносит данные по принципу младшие разряды в младшие адреса, старшие разряды - в старшие. Например,
Это Little endian форма записи, свойственная x86 процессорам. На Мотороловских контроллерах принята Big endian форма записи, т.е. наоборот. Ну это так, для общего развития

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

puks

Well-Known Member
Lotus team
03.02.2007
1 971
16
#4
Это Little endian форма записи, свойственная x86 процессорам. На Мотороловских контроллерах принята Big endian форма записи, т.е. наоборот. Ну это так, для общего развития
Это оказалось очень полезным. Спасибо.


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

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

А как можно увидеть как сишная программа переведена в асемблеровские команды?
 
04.09.2006
2 566
2
Минск
#5
А как можно увидеть как сишная программа переведена в асемблеровские команды?
При компиляции можно создавать файлы с асмовым кодом. Настройка зависит от используемых среды/компилятора.

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

puks

Well-Known Member
Lotus team
03.02.2007
1 971
16
#8
Это понятно... А дальше что? Хотите сравнить быстродействие/занимаемую память?
Да нет. Особенно глубоко копать не надо.

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