我是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
谢谢!
答案 0 :(得分:1)
那么是什么阻止你完成你设计的代码?您将地址的每个字节加载到EAX中。
有一点需要注意,翻译蚕食你不能只添加48.这适用于0 - 9
,但它不会显示' A - F` (10到15)正确。因此,一个简单的选择是查找表。定义一个16字节的字符串,并使用半字节值作为索引:
HEXDIGITS db "0123456789ABCDEF"
然后,为每个半字节值索引到此表。
如果您不介意预先做一些劳动,您可以生成与00
到FF
对应的256个值,并简化您的_cast
例程每个字节而不是每个半字节。我不确定这是否符合更容易的条件,因为它需要输入更多字符,但是因为你要将地址的每个字节的工作减少到更快,所以它会更快第四个(从8个指令到2个)。