统计所有可能的变化(端口标志regs中断异常..等)并将其写入数组(以查看和比较)。它计算操作码的长度…等。
可能存在这样的标准测试,例如测试任何给定的处理器。也没有特别需要"神奇的发现"的未记录的特性,你可以在网上找到。
您没有提到要针对的处理器类型。这个答案是从x86的角度来看的,但可能在其他架构中也会有类似的任务。
首先,是什么限制了你编写和运行这样一个程序?如果您在计算机上具有根访问权限(在x86术语中可以运行ring0代码),则可以执行以下操作:
- 钩子所有必要的中断(或者你可以钩子所有中断)。
- 生成指令
- 将指令代码写入内存(指令长度可能不同)。
- 在指令之后写入
jmp
,call
,int
或int3
(在x86处理器中,在其他体系结构中指令会有所不同)。 - 跳转到指令,它被执行或引起中断。如果它被执行,在它之后,您将跳转或调用处理代码。如果它引起了一个中断,检查
cs:ip
从堆栈(知道在什么地址的指令失败),你在哪个中断等,然后跳转或调用处理代码。
然后,在处理代码中,将所有需要的数据(我想至少是所有寄存器)发送到某个外部端口,然后在另一台计算机上将所有数据存储在磁盘上。
- 然后生成下一条指令
- 跳到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
当然你也需要相当大的存储空间