是否有可能编写所有十六进制操作码的测试,收集统计数据以发现未记录的特性



统计所有可能的变化(端口标志regs中断异常..等)并将其写入数组(以查看和比较)。它计算操作码的长度…等。

可能存在这样的标准测试,例如测试任何给定的处理器。也没有特别需要"神奇的发现"的未记录的特性,你可以在网上找到。

您没有提到要针对的处理器类型。这个答案是从x86的角度来看的,但可能在其他架构中也会有类似的任务。

首先,是什么限制了你编写和运行这样一个程序?如果您在计算机上具有根访问权限(在x86术语中可以运行ring0代码),则可以执行以下操作:

  1. 钩子所有必要的中断(或者你可以钩子所有中断)。
  2. 生成指令
  3. 将指令代码写入内存(指令长度可能不同)。
  4. 在指令之后写入jmp, call, intint3(在x86处理器中,在其他体系结构中指令会有所不同)。
  5. 跳转到指令,它被执行或引起中断。如果它被执行,在它之后,您将跳转或调用处理代码。如果它引起了一个中断,检查cs:ip从堆栈(知道在什么地址的指令失败),你在哪个中断等,然后跳转或调用处理代码。

然后,在处理代码中,将所有需要的数据(我想至少是所有寄存器)发送到某个外部端口,然后在另一台计算机上将所有数据存储在磁盘上。

  1. 然后生成下一条指令
  2. 跳到3,除非你已经处理了所有的指令。

然而,在x86的情况下,允许的最大指令长度是15字节。256^15 = 1.33 * 10^36。宇宙的年龄是~4.339 * 10^17秒。假设一个10.0 GHz的单核处理器,每个时钟恰好有一条指令(尝试并报告它),您将需要超过300万个这样的处理器来在比宇宙当前年龄更短的时间内测试所有15字节的指令:

(256^15)/(10*10^9)/(4.339*10^17) = 306344317

当然你也需要相当大的存储空间

最新更新