正在學習 DynamoRIO ,爲了方便後面的同學入門,特寫了這一個系列的博客,主要通過分析 DynamoRIO 自帶例子的源碼 來帶領大家入門。
要明白DynamoRIO 的工作機制,看文檔是必不可少的:
首先是配置問題:文檔鏈接(http://dynamorio.org/docs/page_deploy.html#win_deploy)
一般情況下,在學習階段,我們不需要去特殊配置環境變量什麼的,直接下載 DybamoRIO 的 release 版本。我們寫好 客戶端 的 .c 文件後,使用 cmake 來調用 DynamoRIO 庫進行編譯。編譯完成後,直接使用 drrun.exe 去加載客戶端 並運行目標程序。
這裏我主要說一下cmake 的問題,至於如何使用 drrun.exe 可以自己看文檔。
DynamoRIO Release 發行版裏 有這樣一個文件夾: DynamoRIO-Windows-7.0.17873-0\cmake,cmake文件夾裏存放的是一堆以 .cmake結尾的文件,這些是cmake 的配置文件,主要是用於第三方庫的配置。也就是說,當我們使用 DynamoRIO 作爲第三方庫時,就需要這些配置文件裏的信息 來幫助我們進行編譯與鏈接。那麼如何使用呢?
這裏我給一個 CMakeLists.txt 文件,CMakeLists.txt 是 cmake 的編譯配置文件,cmake根據該文件的信息來組織目標項目。
cmake_minimum_required(VERSION 2.6)
if (NOT "${DynamoRIO_DIR}" STREQUAL "")
project(bbsize)
set(output_dir "${PROJECT_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${output_dir}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${output_dir}")
find_package(DynamoRIO)
if (NOT DynamoRIO_FOUND)
message(FATAL_ERROR "DynamoRIO package required to build")
endif (NOT DynamoRIO_FOUND)
# 下面的是我們需要修改的部分:
add_library(bbcount SHARED bbcount.c)
configure_DynamoRIO_client(bbcount)
use_DynamoRIO_extension(bbcount drmgr)
use_DynamoRIO_extension(bbcount drreg)
use_DynamoRIO_extension(bbcount drx)
endif ()
大家使用時需一部分的內容,add_library 是我們要生成的客戶端,bbconut 是項目名,bbcount.c 是源文件。
drmgr, drreg, drx 是使用的 extension。
所以使用時只需要把 bbcount 改成對應的客戶端名, 把 extension 名修改爲我們使用的extension。
要編寫 CMakeLists.txt 需要一定的cmake 的基礎,可以看一下 cmake 的官方文檔。
然後再命令行使用:
mkdir build
cd build
cmake -DDynamoRIO_DIR=C:\Users\Mr.wang\Documents\WIN_AFI\test\DynamoRIO-Windows-7.0.17873-0\cmake ..
cmake --build . --config Release
這幾行命令會編譯我們的客戶端,不過我們需要安裝一下 vs 用來作爲編譯器和鏈接器。
這裏只是簡單的描寫一下配置問題,如果有不會的可以查閱文檔 或在 下方留言。