軟件測試-二進制插樁

 

關鍵詞:插樁,軟件測試

 

 

二進制插樁作用

1.        程序運行時攔截,在運行時向程序注入我們自己的代碼。

2.        調試程序

3.        Tracing and logging, 分析函數調用關係圖,api覆蓋數據。

4.        提取數據,從程序中提取一些感興趣的關鍵data。

5.        改變程序行爲,如程序打補丁,模擬數據(emulation)。

 

一般二進制插樁方法

  •  LD_LIBRARY_PRELOAD

LD_PRELOAD設置一個動態庫路徑,該動態庫會在其他庫(包括the C runtime, libc.so)之前加載。下面可以使程序ls使用我們自己編寫的malloc ()

$ LD_PRELOAD=/path/to/my/ libmalloc.so  /bin/ls

  •  替換動態庫

編寫攔截函數,加載原來系統的動態庫。

 

 

二進制插樁方法

注入指令(inject)

         函數地址查找,插入和移除插樁,調用原始函數地址(寫回原指令,並刷新cache)。

        

注入動態庫

補丁(patch)

 

符號查找

Proc文件,/proc/<PID>/maps

ELF文件,符號段裏面查找符號。

計算絕對地址,相對地址+基址(Symbol address + base address)

 

插樁開發

內存泄漏check動態庫

使用我們自己的malloc hook程序的malloc調用。

/* lcheck() is for memory leak check; its code is not shown
 here */
void lcheck(void);
void* malloc(size_t size)
{
    static void* (*my_malloc)(size_t) = NULL;

    if (!my_malloc)
    my_malloc = dlsym(RTLD_NEXT, "malloc");  /* returns the object reference for malloc */
    void *p = my_malloc(size);               /* call malloc() using function pointer my_malloc */ 
    printf("malloc(%d) = %p\n", size, p);
    lcheck();                                /* calling do_your_stuff function */
    printf("returning from shared object...\n");
    return p;
}
void lcheck(void)
{
    printf("displaying memory leaks...\n");
    /* do required stuff here */
}

編譯和執行

 

gcc -shared -Wl,--no-as-needed -ldl -fPIC prog2.c -o libprog2.so 
LD_PRELOAD=/home/wuchao/sbox/kernel/hook/libprog2.so  /bin/ls

 

Intel  pin工具

         從intel網站下載pin-2.13-65163-gcc.4.4.7-linux.tar.gz

         解壓後就可以使用。

         編譯pintool工具

$ cd source/tools/ManualExamples
$ make strace.test

檢查ls程序

pin-2.13-65163-gcc.4.4.7-linux$ ./pin -t source/tools/ManualExamples/obj-ia32/strace.so -- /bin/ls

$ cat ./strace.out 
0xb77b5f92: 45(0x0, 0xb77c0ff4, 0x0, 0xb779f000, 0x9, 0xb779f414)returns: 0x9f59000
0xb77b7caf: 33(0xb77ba0e5, 0x0, 0xb77c0ff4, 0xb779f1f4, 0x4, 0xbf831138)returns: 0xffffffff
0xb77b7d61: 192(0x0, 0x2000, 0x3, 0x22, 0xffffffff, 0x0)returns: 0xb6063000
0xb77b7caf: 33(0xb77b9d96, 0x4, 0xb77c0ff4, 0xb77b9d96, 0xb77c1c14, 0xbf8312a8)returns: 0xffffffff
0xb77b7b72: 5(0xb77ba081, 0x80000, 0x0, 0xb77c189c, 0xb77c1b00, 0x1)returns: 0x4
0xb77b7afb: 197(0x4, 0xbf830c40, 0xb77c0ff4, 0xb77c189c, 0x4, 0x1)returns: 0x0




發佈了37 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章