有没有办法在C ++中的地址获取指令的总字节数?

时间:2017-11-27 04:12:15

标签: c++ assembly

我正在尝试编写一个NOP组装指令的函数。目前我有NOPing指令,但我必须手动输入指令大小......

如果我可以将它提供给地址,那将是很好的,并且通过一些魔法,它能够计算该指令的总字节数...

例如...... 在下面的OllyDBG装配线中...指令大小为6(我用指示字节加粗)。

  

02235FF3 3B86 B8020000 CMP EAX,DWORD PTR DS:[ESI + 2B8]

这是我现在的功能......

void NOP(
    DWORD_PTR FromAddress,
    const int size)
{
    for (int i = 0; i < size; i++)
    {
        WriteProcessMemory(GetCurrentProcess(), (LPVOID)(FromAddress + i), "\x90", size, NULL);
    }
}

我想这会变成这样的......

void NOP(
    DWORD_PTR Address)
{
    int TotalBytes = MagicFunctionToGetInstructionByteSizeFromAddress(Address);

    for (int i = 0; i < TotalBytes; i++)
    {
        WriteProcessMemory(GetCurrentProcess(), (LPVOID)(FromAddress + i), "\x90", size, NULL);
    }
}

1 个答案:

答案 0 :(得分:3)

不确定。但这并不简单。你必须建立一个部分反汇编程序。使用x86指令参考。将指令解析为部分:可选前缀字节,操作码,mod / R / M,缩放/索引/基数。这足以决定指令必须有多长时间。

有一些反汇编程序库可以为您执行此操作。请参阅示例Udis86及其有关函数ud_insn_len的文档。但是还有其他一些库选项。