-2

我的程序输出编码指令,如下所示:

0x81FB4300000090
0x69FC4300000090
0x81FC4300000090
0x69FD4300000090
0x81FD4300000090
0x69FE4300000090
0x81FE4300000090
0x69FF4300000090
0x81FF4300000090
0x00054400000090
0x01054400000090
0x02054400000090
0x03054400000090
0x08054400000090
0x09054400000090
0x0A054400000090
0x0B054400000090
0x10054400000090
0x11054400000090
0x12054400000090
0x13054400000090
0x18054400000090
0x19054400000090
0x1A054400000090
0x1B054400000090
0x20054400000090
0x21054400000090
0x22054400000090
0x23054400000090
0x28054400000090
0x29054400000090
0x2A054400000090
0x2B054400000090
0x30054400000090
0x31054400000090
0x32054400000090
0x33054400000090
0x38054400000090
0x39054400000090
0x3A054400000090
0x3B054400000090
0x40054400000090
0x41054400000090
0x42054400000090
0x43054400000090
0x44054400000090
0x45054400000090
0x46054400000090
0x47054400000090

上面的每一行都是独立的指令集,需要作为单独的程序进行反汇编。每行包含 7 个字节的指令。我可以直接将它们输出为二进制,***在这种情况下,每个7字节的块都需要单独反汇编。

在运行我的程序的 bash 脚本中,我想过滤掉包含静态跳转的行。

那么,如何将每一行与 stdin 分开?(我想做类似的事情./my_C_program | the_disassembler | grep loopne
我尝试了 objdump,但它拒绝/dev/stdin用作输入文件。

4

2 回答 2

1
time bash -c 'for i in $(cat insns.txt); do \
        echo ".quad $i" | \
        as --64 | \
        objdump --disassemble; \
    done'

在我的机器上花了 192 毫秒。永远不要假设你知道某事太慢了。

它们是一堆 nop 指令,后面有垃圾。它们的顺序是否错误?以十六进制写入时,最重要(最后一个)字节是第一个。

于 2016-11-19T17:45:06.147 回答
0

既然您说为每一行分叉一个反汇编程序太慢,您需要某种方法来分离一个反汇编程序输出流。

使用类似的东西取消十六进制转储您的输入xxd -r,并通过反汇编程序将其管道化,并将反汇编程序输出通过管道传输到 perl 程序或其他东西。或者只是 grep-with-context:grep -C8 loopne在找到匹配项时打印周围的 8 行。


为了帮助将输出分离回单独的记录:也许添加某种不会出现在任何行中的哨兵(如UD2指令)。既然您说序列可能不会在指令边界上结束,那么像哨兵这样的90 90 90 90 90 90 90 90 90 0F 0B人应该安全地吸收任何额外的字节。那是 9 个字节的 NOP,以防序列以查找 imm32 和 disp32 作为寻址模式的一部分的指令的开头结束。(还有第 9 次 NOP,因为我没有检查 0x90 作为 ModRM 或 SIB 字节的含义)。

如果您的序列都是相同的字节数,您可以使用它来查找地址范围。

顺便说一句,我建议使用 perl 之类的东西,以便轻松地将多行作为一个可以进行模式匹配的组。

如果您需要提高效率,则需要确保可以将一个反汇编程序流的输出分离回单独的块,否则您需要将反汇编程序嵌入到生成这些行的进程中(而不是将它们打印为 ASCII 字符串首先)。

没有完全通用的方法可以做到这一点也很快。你不能一边吃蛋糕一边吃。如果这是一个问题,您将不得不让数字生成程序更多地了解 x86 机器代码。


我可以看到的另一个选项是创建一个带有标记每个块开始的符号的目标文件,但这意味着在将每一行变成如下内容之后,通过汇编程序提供整个内容:

label1234: dq 0x11054400000090

这个选项看起来很糟糕,所以我没有尝试解决任何字节顺序问题。它可能会使用大量内存,因为大多数 x86 汇编器不是一次性的,并且可能不是为汇编大量数据而设计的,不需要选择短或长编码的跳转指令。

于 2016-11-18T21:06:49.433 回答