签名扩展/提取半字节

时间:2014-10-27 16:42:26

标签: assembly

我是Assembly的初学者,我写了一个非常简单的程序,它将使用Win32 API在Windows 7中显示MessageBox。我想修改它,以便MessageBox中的文本是当前的EIP,好吧,使用call + pop技巧“捕获”。

但MessageBox lpText的参数将参数读取为ASCII,因此将其值00401005(捕获的EIP值)输入将变为垃圾,因为它尝试将其作为ASCII字符串读取。

所以我的想法是使用LODSB获取每个字节并提取所述字节的每个半字节并将它们扩展为字节,因此我最终得到一个8字节的字符串。然后我只需要为每个值添加48以将它们变成ASCII,但我有点卡住了。而且我想知道是否有人知道做这种提取的任何技巧?

虽然远未完成,但如果它有帮助,这里是代码

[BITS 32]

EXTERN _MessageBoxA@16

SECTION .text
    GLOBAL _Main

_Main:
    call _Cast

    push 0x0
    push title
    push eax
    push 0x0
    call _MessageBoxA@16

    ret 0x10

_Cast:
    mov esi, esp
    mov ecx, 8

    loop:
        xor eax, eax
        lodsb

        ; logic goes here

        dec ecx 
        jnz loop

    ret

SECTION .data

    title db "hello",0

SECTION .bss

    buffer resb 8

谢谢!

1 个答案:

答案 0 :(得分:1)

那么是什么阻止你完成你设计的代码?您将地址的每个字节加载到EAX中。

  • 将值保存在堆栈中
  • 处理高半字节(蒙版和右移,翻译,然后显示或存储)
  • 弹出值
  • 处理低半字节(掩码,翻译,然后显示或存储)
  • 重复。

有一点需要注意,翻译蚕食你不能只添加48.这适用于0 - 9,但它不会显示' A - F` (10到15)正确。因此,一个简单的选择是查找表。定义一个16字节的字符串,并使用半字节值作为索引:

 HEXDIGITS db "0123456789ABCDEF"

然后,为每个半字节值索引到此表。

如果您不介意预先做一些劳动,您可以生成与00FF对应的256个值,并简化您的_cast例程每个字节而不是每个半字节。我不确定这是否符合更容易的条件,因为它需要输入更多字符,但是因为你要将地址的每个字节的工作减少到更快,所以它会更快第四个(从8个指令到2个)。