Assembly 符号扩展/提取半字节

Assembly 符号扩展/提取半字节,assembly,Assembly,我是汇编的初学者,我编写了一个非常简单的程序,可以在Windows7中使用Win32 API显示MessageBox。我想修改它,这样MessageBox中的文本就是当时的EIP,嗯,使用call+pop技巧“捕获” 但是MessageBox lpText的参数将参数读取为ASCII,因此向其提供值00401005(捕获的EIP值)将在其尝试将其读取为ASCII字符串时变成垃圾 所以我的想法是使用LODSB获取每个字节,提取每个字节的半字节,并将其扩展为字节,最后得到一个8字节的字符串。然后我只

我是汇编的初学者,我编写了一个非常简单的程序,可以在Windows7中使用Win32 API显示MessageBox。我想修改它,这样MessageBox中的文本就是当时的EIP,嗯,使用call+pop技巧“捕获”

但是MessageBox lpText的参数将参数读取为ASCII,因此向其提供值00401005(捕获的EIP值)将在其尝试将其读取为ASCII字符串时变成垃圾

所以我的想法是使用LODSB获取每个字节,提取每个字节的半字节,并将其扩展为字节,最后得到一个8字节的字符串。然后我只需要在每个值上加48,将它们转换成ASCII,但我有点卡住了。我想知道是否有人知道做这种提取的诀窍

虽然还远未完成,但如果代码有帮助的话,下面是代码


谢谢

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

  • 将值保存在堆栈上
  • 处理高半字节(掩码和右移、平移、显示或存储)
  • 弹出值
  • 处理低半字节(屏蔽、转换、显示或存储)
  • 重复一遍
有一个警告是,要翻译一小口,你不能只加48。这适用于
0-9
,但不能正确显示“A-F”(10到15)。因此,一个简单的选择是查找表。定义一个16字节的字符串,并使用半字节值作为索引:

 HEXDIGITS db "0123456789ABCDEF"
然后,针对每个半字节值,索引到此表中


如果您不介意提前做一些工作,您可以通过
FF
生成对应于
00
的256个值,并通过查找每个字节而不是每个半字节来简化
\u cast
例程。我不确定这是否更容易,因为它需要输入更多的字符,但它会更快,因为您正在将地址的每个字节的工作减少到第四个字节(从8条指令减少到2条指令)。

哦,伙计,我没想到不移动低字节,这是我的主要问题。谢谢你,迈克!好问题。我刚刚意识到这实际上是行不通的。它将显示“0”至“9”正常,但在“A-F”上失败。。所以,你需要一种不同的方法。我会更新答案的!
 HEXDIGITS db "0123456789ABCDEF"