繁体   English   中英

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

[英]Is there any way to get the total bytes of an instruction at an address in C++?

我正在尝试编写一个将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);
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM