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

puks

Lotus Team
03.02.2007
1 921
56
BIT
14
В одном руководстве приведен следующий пример.

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

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

vital

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

European

Насколько я понял, ассемблер заносит данные по принципу младшие разряды в младшие адреса, старшие разряды - в старшие. Например,
Это Little endian форма записи, свойственная x86 процессорам. На Мотороловских контроллерах принята Big endian форма записи, т.е. наоборот. Ну это так, для общего развития

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

puks

Lotus Team
03.02.2007
1 921
56
BIT
14
Это Little endian форма записи, свойственная x86 процессорам. На Мотороловских контроллерах принята Big endian форма записи, т.е. наоборот. Ну это так, для общего развития

Это оказалось очень полезным. Спасибо.


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

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

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

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

European

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

А какая конечная цель анализа?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!