有用于共享库动态分析的技术吗?例如,我知道DLL有一个入口点,但是如何调用其他导出的函数呢?我是否需要编写一个自定义的可执行文件来为我要分析的每个DLL调用导出?

评论

这个问题有点含糊。动态链接库具有与标准可执行文件相同的可执行文件头和结构。因此,可以像调试普通可执行文件一样调试它们。这可能比平时要复杂一些,因为要对其进行调试,必须将其加载到某个进程中,并且使之实现可能是微不足道的(即,如果它是作为其他程序的一部分加载的),或者可能需要做一些事情。一种常见的技术是使用OllyDbg的LoadDll之类的东西,或者编写一个小程序来加载DLL并手动调用有趣的导出。

好的我明白了!我只是想避免必须手动编写一些代码。我不知道OllyDbg的LoadDll。我还认为,如果有一个自动生成程序以加载DLL并调用导出并在参数上进行各种排列的工具,那将很酷。编辑:如果您发表评论是一个答案,我很乐意接受。

假设您有一个DLL,还有一个使用该DLL的应用程序,则可以创建一个代理DLL,该代理DLL允许您监视和调试从应用程序向原始DLL进行的每个调用。

#1 楼

动态链接库具有与标准可执行文件相同的可执行文件头和结构。因此,可以像调试普通可执行文件一样调试它们。这可能比平时要复杂一些,因为要对其进行调试,必须将其加载到某个进程中,并且使之实现可能是微不足道的(即,如果它是作为其他程序的一部分加载的),或者可能需要做一些事情。

常见的技术是使用OllyDbg的LoadDll之类的东西。链接的页面描述了直接在DLL中调用导出的一些示例。尽管OllyDbg可以巧妙地确定函数参数的数量,但您可能必须进行一些逆向工程才能弄清楚这些参数的类型。请参阅此最新问题,以获取有关如何执行此操作的一些建议。或者,您可以编写一个小程序来加载DLL并手动调用有趣的导出。这仍然受到需要了解如何与DLL接口的限制,但是与此同时,为了彻底对目标进行反向工程,可能需要此编程路径。即,也许您需要调用一些导出操作,以创建程序期望用作其他导出操作的输入的对象。 LoadDll很快就会变得很麻烦,编写该程序确实应该没有那么困难。

评论


也可以使用run32dll.exe加载它吗?我过去已经这样做过,以便监视将其加载到内存后的所有更改,但是不确定是否还可以调试它。

–布兰登·杨(Brandon Young)
13年5月31日在13:49

@Brandon如果确实需要,可以使用rundll32.exe进行加载和调试。您可以在Olly中打开rundll并提供正确的参数来执行此操作。然后在选项下,然后在事件选项卡中调试选项,选择在新模块上中断。通过选择“ E”按钮拉起已加载的模块,然后按F9直到列表中加载了DLL。现在右键单击,转储到CPU中,然后中断已知导出的入口点。取消选择调试选项,然后运行,理想情况下应达到BP。这种方法比IMO值得付出的努力更多,但要知道,有很多方法可以给猫皮:)

– Elias51
2013年6月1日11:39

#2 楼

另一种方法可能是使用IDA的AppCall功能:在IDA中为相关的导出功能定义了原型之后,可以在当前运行的进程的上下文中从IDA控制台菜单触发功能的执行。

您可以更多有关此功能的工作方式以及如何在hexblog相关文章中使用它的信息:http://www.hexblog.com/?p = 113。

#3 楼

DynamoRIO对于进行更深入的动态库分析非常有用。 DynamoRIO是一种动态二进制转换器,在x86和x86-64上都可以在Linux和Windows上使用。

要使用DynamoRIO分析DLL,您可以使用dr_register_module_load_eventdr_register_module_unload_event函数注册模块加载和卸载事件。分别。

您还可以注册事件,使您可以在执行指令之前对其进行操作。这些事件使您能够隔离从特定DLL执行的代码,并将自定义工具应用于该DLL。

#4 楼

第一个幼稚的想法是列出函数的符号,并将其用作二进制文件的入口点以反汇编每个函数。

然后,如果您正在寻找更高级的技术,则应该看看在IDA FLIRT签名上。这里有一个问题,我建议您看一下答案:什么是FLIRT签名?

评论


好吧,发问者确实询问过动态分析,而您的回答纯粹是从静态的角度来看的。

–滚轴
13年5月31日在7:46

发问者并没有真正很好地解释他想要什么,以及为什么他的问题只限于动态分析。

–恐怖
13年5月31日在8:25