回 帖 发 新 帖 刷新版面

主题:[原创]程序中,用堆栈来构造结构的方法

程序中,用堆栈来构造结构的方法

一个结构:

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 转帖请保留

回复列表 (共1个回复)

沙发

楼主好人,向楼主学习。。。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册