接下来的项目要用到DynamoRIO,从今天开始学习,接下来把学习过程学到的知识和遇到的问题和大家分享一下,也作为备忘。
DynamoRIO下载地址:点击打开链接
还要用到的cmake下载地址:cmake下载地址
蛋疼的是,使用cmake还需要其他编译器(不知道我理解的对不对,看网上的资料和自己实践都是,没有安装其他编译器的机器上运行时总会提示找不到cl),例如vs,gcc等,所以没有其他编译器的就先安装编译器吧。
(一)、DynamoRIO介绍:
DynamoRIO是一个运行时代码控制系统(runtime code manipulation system),支持程序运行时对程序的任一部分进行修改。DynamoRIO给你对运行时代码流的完全控制,而且,修改不局限于trampoline insertion。DynamoRIO可以用于创建多种用途的动态工具,例如程序分析、插装、优化和翻译等等。
上面是在DynamoRIO的文档中翻译过来的,其实我现在用到的只是程序运行过程中信息的收集,所有现在先写与项目相关的部分,以后再写更复杂的使用。
我目前用到的功能其实就是利用DynamoRIO提供的api编写一个c文件,将其编译成dll文件后,DynamoRIO根据其中的规则收集我们感兴趣的信息,比如call列表等。刚开学学习的时候可以利用samples文件夹中的例子来学习使用方法,比如我用的就是其中的instrcalls.c,可以收集所有的call调用函数列表。
(二)、Windows下的使用
根据DynamoRIO的文档,我们需要先修改一堆的配置,但是根据我的实践其实目前还不需要,只需要做以下简单的几步就可以体验到使用DynamoRIO的效果。
1.下载并安装cmake。cmake是用来编译写好的c文件的,需要使用cmake来将c文件编译成dll,不能用其他的编译器,因为DynamoRIO中有专门给cmake编译使用的规则。可以使用解压即可使用的绿色版,只是需要手动将cmake中bin文件夹的路径添加到系统环境变量里。
2.下载并配置DynamoRIO。下载好后解压,然后把bin32文件夹的路径添加到环境变量中。(和上面的cmake一样,都是在path中添加)。
3.配置好后,先使用cmake将写好的c文件编译成dll文件。这里我们用的是samples里的instrcalls.c,其实可以把samples里的所有c文件都编译了,随意选用一个来实验。使用以下命令来编译(在命令行窗口中,我的DynamoRIO文件存放在c盘根目录下,所以需要根据你存放DynamoRIO的路径进行修改):
cd c:\DynamoRIO
mkdir build
cd build
cmake -DDynamoRIO_DIR=c:\DynamoRIO\cmake c:\DynamoRIO\samples
稍等片刻,出现以下画面:
4.接下来,manul上写的是用这个命令:make instrcalls来最终编译成instrcalls.dll文件。但是我的环境中不行(用gcc等编译器的应该可以)。所以我就打开vs2010-->文件-->项目/解决方案-->c:\DynamoRIO\build\instrcalls.vcxproj,点击生成-->生成解决方案,完成生成,可在c:\DynamoRIO\build\bin文件夹中找到所有的dll文件。
5.接着,我们生成DynamoRIO的client,用记事本做例子。其实就是在用DynamoRIO打开notepad.exe的时候加载instrcalls.dll,利用dll中的规则生成log文件,这个例子中log文件包含所有的call调用。用以下命令:
drrun.exe -root c:\DynamoRIO -c c:\DynamoRIO\build\bin\instrcalls.dll -- notepad
注意:以上所有命令中空格都不可多不可少,错一点都会导致程序无法正确运行,所以实验的时候可以直接复制界面上的命令。
6.点击关闭notepad之后,可以进入c:\DynamoRIO\build\bin文件夹中查看log文件,如下图:
这两个txt文件都是调用的call,因为我们要的是所有的call调用,所以文件会很大。可以根据自己的需求编写c文件,生成dll后按照以上方法载入。
希望对大家有帮助,虽然DynamoRIO现在使用的人应该很少很少,论文我都没见多少篇,更别说公司用了,不过最起码也能作为一个我的备忘吧。