1. 程式人生 > >windbg檢測控制代碼洩露(可定位到具體程式碼)

windbg檢測控制代碼洩露(可定位到具體程式碼)

1、用c++寫一個控制代碼洩露的樣例程式:

#include "stdafx.h"
#include <windows.h>
voidfun1(void);
voidfun2(void);
voidfun3(void);
voidfun4(void);
intmain(intargc, char* argv[])
{
while(1)
{
fun1();
fun2();
Sleep(100);
}
return 0;
}
voidfun1(void)
{
fun3();
}
voidfun2(void)
{
fun4();
}
voidfun3(void)
{
HANDLE hEvent;
hEvent = CreateEvent(NULL,TRUE,TRUE,NULL);
CloseHandle(hEvent);
}
void
fun4(void)
{
HANDLE hEvent2;
hEvent2 = CreateEvent(NULL,TRUE,TRUE,NULL);//這裡只打開但是沒關閉控制代碼
}

程式碼非常簡單,明眼人一看就能看出哪裡有問題,那麼程式編譯後用windbg怎麼調出來呢?

2、windbg除錯

1)找到windbgs安裝目錄下的gflags.exe工具,該工具可用來開啟windows自帶的一些除錯選項,具體gflags.exe的詳細使用可以檢視windbg幫助;

這裡我們設定勾上application verifiwer,該工具主要可用來對程式做一些穩定性的檢測,本次除錯主要用於儲存棧的相關資訊。同時設定stack backtrace即棧的大小為10.

2)執行windbg,開啟第一步編譯的程式,並使其跑起來;此時你檢視工作管理員中的控制代碼資訊,會發行相應程序控制代碼一直在增加。

3)windbg用ctrl+break命令中斷程序執行,用!htrace -enable命令開啟控制代碼檢測;htrace提供了進行控制代碼相關檢測的命令,可檢視windbg幫助。

同時用g命令讓程式執行。

4)再次中斷程序,使用!htrace -snapshot命令,獲得此時程序控制代碼的映象。並再次讓程式執行。

5)第三次中斷程序執行,我們再使用!htrace -diff命令獲得當前控制代碼狀態與第4步 snapshot映象控制代碼的差異;

我們可以發現:新增很多開啟的控制代碼,平常情況下這些開啟的控制代碼有可能不是洩露,需要具體分析,但是本次示例程式太簡單,所以剛好所有開啟的控制代碼都屬於洩露的。

6)我們使用lsa 傳遞指定位置對應的程式碼,lsa handlew2!fun4+0x0000002e

到這裡,我們就找到了洩露控制代碼的函式。