未经连接,哪来地址?
关于高址结尾结尾还是低址结尾,Intel采用后者。体验:
程序中,用堆栈来构造结构的方法[原创]
一个结构:
S struct
SSize db 01
Rsed db 02
Count dw 0304h
BufAddr dd 05060708h
Num dq 090A0B0C0D0E0F10h
S ends
我们来看一下上面的结构其数据在内存中的实际情况,请大家体会,80X86的低址低字节结尾:
eds:xxxxxxxx:01 02 04 03 08 07 06 05 10 0F 0E 0D 0C 0B 0A 09 ;Hex进制
假如我们使用堆栈来构造这个结构,应该如何做呢?
我们使用16位和32位混合压栈的方式,来构造一个结构。为了清晰,我们使用寄存器压栈,不使用立即数压栈。
假设:堆栈指针ESP=00000000h,EDS=ESS——注意,这很重要,不过保护模式下FLAT模式,是自然相等的。
;构造Num
mov eax,090A0B0Ch
push eax ;执行完,ESP=FFFFFFFCh
mov eax,0D0E0F10h
push eax ;执行完,ESP=FFFFFFF8h
;构造BufAddr
mov eax,05060708h
push eax ;执行完,ESP=FFFFFFF4h
;构造Count
mov ax,0304h
push ax ;执行完,ESP=FFFFFFF2h
;构造Rsed和SSize,注意低址低字节
mov ax,0201h
push ax ;执行完,ESP=FFFFFFF0h
;
mov esi,esp ;用当前ESP装填ESI,很关键,想想为什么:)
lea esp,[esi+16] ;猜猜这句?呵呵——新加,不过要注意?
现在,我们来看这段程序执行完毕后,内存中ESI起始的16字节的内容:
eds:FFFFFFF0:01 02 04 03 08 07 06 05 10 0F 0E 0D 0C 0B 0A 09 ;Hex进制
是不是已经通过堆栈构造了一个数据结构了?
这就是堆栈巧妙使用技术之一,其实呢,WIN32 API都是利用堆栈传递参数,这里只是让大家清晰80X86的低址低字节。
新加的一句是释放掉所构造的数据包,所以一定在数据包使用完毕之前,不要执行此句,否则一旦有指令压栈,数据包就被破坏了。
编程论坛 汇编语言专区 cnhanxiao [转载请保留]
[[it] 本帖最后由 cnhanxiao 于 2008-10-17 09:01 编辑 [/it]]