主题:[原创]程序中,用堆栈来构造结构的方法
程序中,用堆栈来构造结构的方法
一个结构:
S struct
SSize db 01
Rsed db 02
Count dw 0304h
BufAddr dd 05060708h
Num dq 090A0B0C0D0E0F10h
S ends
我们来看一下上面的结构其数据在内存中的实际情况,[color=008080][color=0000FF][color=FF0000]请大家体会,80X86的低址低字节结尾[/color][/color][/color]:
EDS:xxxxxxxx:01 02 04 03 08 07 06 05 10 0F 0E 0D 0C 0B 0A 09 ;Hex进制
假如我们使用堆栈来构造这个结构,应该如何做呢?
我们使用16位和32位混合压栈的方式,来构造一个结构。为了清晰,我们使用寄存器压栈,不使用立即数压栈。
假设:堆栈指针ESP=00000000h,[color=0000FF]EDS=ESS——注意,这很重要,不过保护模式下FLAT模式,是自然相等的[/color]。
;构造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,很关键,想想为什么:)
[color=FF0000]lea esp,[esi+16] ;猜猜这句?呵呵——新加,不过要注意?[/color]
现在,我们来看这段程序执行完毕后,内存中EDS: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 转帖请保留
一个结构:
S struct
SSize db 01
Rsed db 02
Count dw 0304h
BufAddr dd 05060708h
Num dq 090A0B0C0D0E0F10h
S ends
我们来看一下上面的结构其数据在内存中的实际情况,[color=008080][color=0000FF][color=FF0000]请大家体会,80X86的低址低字节结尾[/color][/color][/color]:
EDS:xxxxxxxx:01 02 04 03 08 07 06 05 10 0F 0E 0D 0C 0B 0A 09 ;Hex进制
假如我们使用堆栈来构造这个结构,应该如何做呢?
我们使用16位和32位混合压栈的方式,来构造一个结构。为了清晰,我们使用寄存器压栈,不使用立即数压栈。
假设:堆栈指针ESP=00000000h,[color=0000FF]EDS=ESS——注意,这很重要,不过保护模式下FLAT模式,是自然相等的[/color]。
;构造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,很关键,想想为什么:)
[color=FF0000]lea esp,[esi+16] ;猜猜这句?呵呵——新加,不过要注意?[/color]
现在,我们来看这段程序执行完毕后,内存中EDS: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 转帖请保留