【问题标题】:Does anybody know what this C++ inline assembly does?有人知道这个 C++ 内联汇编是做什么的吗?
【发布时间】:2013-10-07 11:01:07
【问题描述】:

我在一个名为DM2 的开源Windows 工具中看到了以下代码。

#define OEP_ASM __asm jmp OEP \
__asm _emit 0x5B __asm _emit 0x66 __asm _emit 0x6C \
__asm _emit 0x79 __asm _emit 0x66 __asm _emit 0x61 \
__asm _emit 0x6E __asm _emit 0x63 __asm _emit 0x79 \
__asm _emit 0x26 __asm _emit 0x57 __asm _emit 0x65 \
__asm _emit 0x69 __asm _emit 0x72 __asm _emit 0x64 \
__asm _emit 0x5D __asm _emit 0x00 __asm OEP: 

没有 cmets 并且在互联网上搜索我仍然不明白这是做什么的?! MSDN 只是告诉我这会将字节插入代码中。这么多我明白,但我不明白这些字节的作用,它看起来不像指令。

谁能解释一下,或者至少指出我正确的方向,插入字节实际上做了什么?

【问题讨论】:

  • 您可能需要检查生成的代码以查看这些指令是什么。或阅读英特尔参考表。
  • 检查生成的代码是什么意思?
  • 编译它,并检查目标文件中的实际代码。然后至少你可以看到实际的指令,而不仅仅是十六进制数字。 如何 这样做取决于您使用的编译器。对于 Linux/OSX,您可以使用例如od command。在带有 Visual Studio 的 Windows 上,它可能有自己的程序来加载目标文件。

标签: c++ assembly inline-assembly


【解决方案1】:

确实这不是代码,它只是一个字符串。出于混淆目的,可能会像这样发出。

$ echo $'\x5B\x66\x6C\x79\x66\x61\x6E\x63\x79\x26\x57\x65\x69\x72\x64\x5D'
[flyfancy&Weird]

或者它可能必须嵌入到代码部分中,而内联 asm 不提供这样做的方法。另请注意,第一条指令跳过了整个字符串。

【讨论】:

  • 知道了...猜猜它是一种涂鸦标签,很好。让我困惑了一段时间:-)
【解决方案2】:

它只是一个嵌入到代码中的以 null 结尾的 ASCII 字符串 [flyfancy&Weird](正如评论所暗示的那样)。 jmp OEP 指令跳过该字符串。

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 2021-03-09
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    相关资源
    最近更新 更多