我正在寻找一种算法和/或代码片段,以在稳定的数据流上提供单遍算法,该算法可以检测字节码或操作码的有效序列。

没有可用的PE32,ELF或Mach0标头信息。因此,下面的入口点,偏移量,段或节信息都没有。

我想认为ARM比英特尔更难。 br />

评论

“检测字节码或操作码的有效序列”-定义有效。

有效,也许我已经滥用了这个词。 “可执行的操作码序列”(或字节码)如何?

倾向于说“不”。这是什么流-它可以在指令中间开始吗?直到ret指令(或者其他CPU的等效指令)之前,都必须是有效的代码吗?它可以以调用结尾还是跳转到其他地方的终止代码?如果遇到无效指令,是否可以从头开始在一个字节后重新启动扫描并再次进行测试?

我正在考虑在字节边界上使用4状态锁存器以获取有效的操作码流检测器。也许我们可以在3种状态下“为音乐命名”?

这里有个疯狂的主意,但是您不能将这个流馈送到您正在使用的特定体系结构的仿真器中吗?

#1 楼

首先,ARM比Intel更容易,因为它具有固定的指令长度,(如果我没记错的话)要求指令以2或4对齐,并且由于其哈佛体系结构而对任意代码自修改的能力有限。 />
我想说的是,没有这样的算法,在一般情况下,这样的算法是不可能的,例如,由于可能的代码自我修改以及在常规代码中使用异常和陷阱,流程,因此达到预期结果的唯一通用方法是仿真。

其余的答案取决于所需算法的更精确定义,目标体系结构和序列的有效性。

#2 楼

我认为没有找到搜索字节码的最佳算法...除非您对数据流有其他了解,例如以base 64编码,等等。

可以要做的就是查看是否有过多的NOP字节(0x90,x86),但是如果真的想要,他们可以找到用不同的操作码来等效于NOP字节的方法。

评论


哦,NOP雪橇。太具体了。也许,有足够的操作数可用于关联操作码,不是吗?

–约翰·格林
2015年8月1日在2:08



我同意这太具体了。我将上面的内容作为评论,但是显然,关于谁可以发表评论有一些不可思议的规则。我的意思是,如果您有无数的免费cpu周期,则可以在每个字节处反汇编操作码,看看是否会导致任何奇怪的syscall或shell执行。然后标记以进行进一步分析

–Viktor
2015年8月1日在2:10