在微内核中,很多有趣的功能不是通过传统的函数调用发生的,而是通过单独实体之间的消息传递发生的。

是否存在这样的OS体系结构通常用于实现消息传递的结构?有没有一种有条理的方法可以在拆装时对其进行标记,以使遵循消息路径和遵循调用堆栈一样容易?

#1 楼

我不认为我会反汇编任何微内核,但是“消息传递”在至少两类程序中很常见:Win32 GUI(基于Win32和MFC的原始程序)和Objective-C可执行文件。

在两种情况下,您都具有某种中央调度程序(或多个例程),它们可以接收消息并将其转发给某些收件人,这些收件人可以在当前程序的内部或外部。

可以注册收件人动态(在Win32中为RegisterClass),或者可以以某种静态方式(Objective-C类元数据或MFC的消息处理程序表)指定。对于调度程序,让我们考虑一下Win32的SendMessage。它具有参数hWndMsg(以及其他参数)。第一个指定收件人。您可能能够跟踪它的来源,然后只需查找对应于该窗口的类注册,并检查其窗口过程是否处理此特定消息。我想您可以在注释中标记“转到窗口过程0x35345800”或类似记录以跟踪该呼叫。使用MFC,您需要找到该类的消息表并查找相应的处理程序。

使用Objective-C,objc_msgSend接受接收对象和选择器来执行。如果可以追溯对象,则可以检查对象是否具有该名称的选择器。或者,也可以在程序中检查所有使用此名称的选择器。同样,一旦找到它,请发表评论。

因此,可以将类似的方法扩展到所有其他消息传递系统-查找收件人,然后在调度程序调用的地方检查哪些系统可能会处理它,并检查处理程序。有时甚至不需要真正地做第一部分-如果消息ID /名称足够唯一,则可以通过搜索找到处理程序。

一个有点相关的问题正在使用C ++和虚函数,但又被另一个问题覆盖。


我刚刚记得另一种不使用调用堆栈的程序。使用连续传递样式的语言,通常以某种功能语言编写。格雷格·辛克莱尔(Greg Sinclair)写了一篇非常有趣的论文,内容涉及拆解“鸡”的恐惧-语言计划的实现。他的网站已关闭,但幸运的是Archive.org保留了副本。其中的一句话:


对于逆向工程师,Continuation Passing Style就是我们所知的平民化的结束。


评论


各种OS上的各种IPC也使用类似的方法。例如。 Windows上的RPC和LPC。哎呀,Windows内核模式下的IRP也不能在这里分类吗?

– 0xC0000022L♦
13 Mar 23 '13 at 0:05

确实,IRP是另一种可能性!

–伊戈尔·斯科钦斯基♦
13年3月23日在3:17