Assembly 符号扩展/提取半字节
我是汇编的初学者,我编写了一个非常简单的程序,可以在Windows7中使用Win32 API显示MessageBox。我想修改它,这样MessageBox中的文本就是当时的EIP,嗯,使用call+pop技巧“捕获” 但是MessageBox lpText的参数将参数读取为ASCII,因此向其提供值00401005(捕获的EIP值)将在其尝试将其读取为ASCII字符串时变成垃圾 所以我的想法是使用LODSB获取每个字节,提取每个字节的半字节,并将其扩展为字节,最后得到一个8字节的字符串。然后我只需要在每个值上加48,将它们转换成ASCII,但我有点卡住了。我想知道是否有人知道做这种提取的诀窍 虽然还远未完成,但如果代码有帮助的话,下面是代码Assembly 符号扩展/提取半字节,assembly,Assembly,我是汇编的初学者,我编写了一个非常简单的程序,可以在Windows7中使用Win32 API显示MessageBox。我想修改它,这样MessageBox中的文本就是当时的EIP,嗯,使用call+pop技巧“捕获” 但是MessageBox lpText的参数将参数读取为ASCII,因此向其提供值00401005(捕获的EIP值)将在其尝试将其读取为ASCII字符串时变成垃圾 所以我的想法是使用LODSB获取每个字节,提取每个字节的半字节,并将其扩展为字节,最后得到一个8字节的字符串。然后我只
谢谢 那么是什么阻止你完成你设计的代码呢?您正在将地址的每个字节加载到EAX中
- 将值保存在堆栈上
- 处理高半字节(掩码和右移、平移、显示或存储)
- 弹出值
- 处理低半字节(屏蔽、转换、显示或存储)
- 重复一遍
0-9
,但不能正确显示“A-F”(10到15)。因此,一个简单的选择是查找表。定义一个16字节的字符串,并使用半字节值作为索引:
HEXDIGITS db "0123456789ABCDEF"
然后,针对每个半字节值,索引到此表中
如果您不介意提前做一些工作,您可以通过
FF
生成对应于00
的256个值,并通过查找每个字节而不是每个半字节来简化\u cast
例程。我不确定这是否更容易,因为它需要输入更多的字符,但它会更快,因为您正在将地址的每个字节的工作减少到第四个字节(从8条指令减少到2条指令)。哦,伙计,我没想到不移动低字节,这是我的主要问题。谢谢你,迈克!好问题。我刚刚意识到这实际上是行不通的。它将显示“0”至“9”正常,但在“A-F”上失败。。所以,你需要一种不同的方法。我会更新答案的!
HEXDIGITS db "0123456789ABCDEF"