我正在尝试编写一个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);
}
}
答案 0 :(得分:3)
不确定。但这并不简单。你必须建立一个部分反汇编程序。使用x86指令参考。将指令解析为部分:可选前缀字节,操作码,mod / R / M,缩放/索引/基数。这足以决定指令必须有多长时间。
有一些反汇编程序库可以为您执行此操作。请参阅示例Udis86及其有关函数ud_insn_len
的文档。但是还有其他一些库选项。