从程序存储器中反汇编x指令

时间:2018-08-01 16:32:54

标签: c++ debugging winapi disassembly

我正在为Windows x86平台开发简单的调试器,仅用于测试。除了代码反汇编外,我已经实现了几乎所有我需要的功能。我决定使用udis86库,但这对我而言并不重要。

在0x86-0x64体系结构中,任何一条指令最多只能有15个字节的长度,因此 我如何从例如0x4000bcda那里获得10条指令?

我有以下代码。

void disassembly(HANDLE hProcess, DWORD address) 
{
  BYTE buffer[15];   
  SIZE_T bytes_read;

 GetProcessMemory(hProcess, (LPBYTE) address, buffer, sizeof(buffer),   &bytes_read);
}

当GetProcessMemory函数没有失败时,应在缓冲区中填充数据。

但是我不能认为缓冲区包含固定数量的指令。可能是一,二或其他。

也许您对应该如何实施有任何想法?

这是我当前的解决方案:

SIZE_T bytes_read;
BYTE buffer[4096];


if (!ReadProcessMemory(hProcess, (LPBYTE)address, buffer, sizeof(buffer), &bytes_read)) {
    std::cout << "Cannot read process memory -> dissasembly." << std::endl;

    return;
}
printf("Address : %#010x\n", address);
std::cout << "Disassembled code: " << std::endl;
ud_t ud_obj;

ud_init(&ud_obj);
ud_set_input_buffer(&ud_obj, buffer, sizeof(buffer));
ud_set_mode(&ud_obj, 64);
ud_set_syntax(&ud_obj, UD_SYN_INTEL);

int counter = 0;
int instructionAmount = 10;

while (ud_disassemble(&ud_obj)) {
    printf("\t%s\n", ud_insn_asm(&ud_obj));

    counter++;

    if (counter == instructionAmount) {
        break;
    }
}

它基本上可以工作,但在我看来这不是一个好的解决方案,并且可能会导致错误

1 个答案:

答案 0 :(得分:0)

您说每条指令的最大字节为15,并且您想读取10条指令,因此15 x 10 =150。这就是在调用ReadProcessMemory时应该读取的内存量。

但是指令不会消耗那么多的内存,一旦您将该内存读入本地缓冲区,您将必须读取每个从buffer [0]开始的指令,对其进行解码,获取其长度,并索引到下一条指令,对指令进行解码,直到解码的指令数达到10。继续,您解码的所有指令的总长度代表10条指令的缓冲区中的最后一个字节。

每次迭代时,您都必须增加指令计数器和单独的字节数。