Windows环境下Pin(二进制动态插桩引擎)搭建
文章目錄
- 安裝包下載鏈接:
- 環(huán)境配置
- 編譯Pintool
- 報(bào)錯(cuò)1(無法打開包括文件:"xed-iclass-enum.h":No such file or directory):
- 報(bào)錯(cuò)2(若編譯時(shí)產(chǎn)生“XX模塊對(duì)SAFESEH映像是不安全的”報(bào)錯(cuò)):
- 報(bào)錯(cuò)3(若報(bào)錯(cuò)“無法解析的外部符號(hào)__fltused”):
- 報(bào)錯(cuò)4(NO STACK TRACE ACAILABLE):
- Pintool使用
- Pintool基本框架
安裝包下載鏈接:
https://software.intel.com/en-us/articles/pintool-downloads
環(huán)境配置
編譯Pintool
在source\tools\MyPintool目錄下有Intel提供的樣例代碼,需要用VS。打開MyPinTool.vcxproj,進(jìn)行生成解決方案:
報(bào)錯(cuò)1(無法打開包括文件:“xed-iclass-enum.h”:No such file or directory):
報(bào)錯(cuò)2(若編譯時(shí)產(chǎn)生“XX模塊對(duì)SAFESEH映像是不安全的”報(bào)錯(cuò)):
報(bào)錯(cuò)3(若報(bào)錯(cuò)“無法解析的外部符號(hào)__fltused”):
報(bào)錯(cuò)4(NO STACK TRACE ACAILABLE):
Pintool使用
pin32 -t .\MyPinTool.dll -o log.log -- cmd /c echo 123
log.log其中記錄了程序執(zhí)行的基本塊數(shù)目和指令數(shù)目。
附加到現(xiàn)有的程序
Pintool基本框架
int main(int argc,char *argv[]){//初始化PIN運(yùn)行庫//若是有參數(shù)-h,則輸出幫助信息,即調(diào)用Usage函數(shù)if(PIN_Init(argc,argv)){return Usage();}string filename=KnobOutputFile.Value();if(!filename.empty()){out=new std::ofstream(fileName.c_str());}if(KnobCount){TRACE_AddInstrumentFunction(Trace,0);// 注冊(cè)在執(zhí)行指令trace時(shí)會(huì)執(zhí)行的函數(shù)PIN_AddThreadStartFunction(ThreadStart,0);//注冊(cè)每個(gè)線程啟動(dòng)時(shí)會(huì)執(zhí)行的函數(shù)PIN_AddFiniFunction(Fini,0);//注冊(cè)程序結(jié)束時(shí)會(huì)執(zhí)行的函數(shù)}PIN_StartProgram(); //啟動(dòng)程序,該函數(shù)不會(huì)返回return 0;}Pintool會(huì)先執(zhí)行Pin_Init對(duì)Pin運(yùn)行庫進(jìn)行初始化,若是參數(shù)有-h或者初始化失敗報(bào)錯(cuò),則會(huì)輸出工具的幫助信息,即調(diào)用Usage.
隨后Pintool根據(jù)命令行輸入的參數(shù)初始化filaName變量,KnobOutputFile和KnobCount的定義如下:
KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE,"pintool","o","","specity file name for MyPinTool output");KNOB<BOOL> KnobCount(KNOB_MODE_WRITEONCE,"pintool","count","1","count instructions,basic blocks and threads in the application");;參數(shù)為o時(shí),會(huì)設(shè)置KnobOutputFile的值,默認(rèn)為空,參數(shù)為count時(shí),會(huì)設(shè)置KnobCount的值,默認(rèn)值為1。在KnobCount被設(shè)置的情況下,會(huì)注冊(cè)為3個(gè)插樁函數(shù),隨后調(diào)用PIN_StartProgram運(yùn)行被插樁的程序(PIN_StartProgram不會(huì)返回)
| 指令級(jí)插樁(instruction) | INS_AddInstrumentFunction | 執(zhí)行一條新指令 |
| 軌跡級(jí)插樁(trace) | TRACE_AddInstrumentFunction | 執(zhí)行一個(gè)新trace |
| 鏡像級(jí)插樁(image) | IMG_AddInstrumentFunction | 加載新鏡像時(shí) |
| 函數(shù)級(jí)插樁(routine) | RTN_AddInstrumentFunction | 執(zhí)行一個(gè)函數(shù)時(shí) |
總結(jié)
以上是生活随笔為你收集整理的Windows环境下Pin(二进制动态插桩引擎)搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDA反编译失败总结
- 下一篇: Androidstudio如何正确导入和