В одном руководстве приведен следующий пример.
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
========
Спасибо за помощь.
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
========
Спасибо за помощь.