论OD最原始的用途------找程序BUG
今天說說OD調試器原作者開發該軟件的初衷,找程序BUG。當然這款軟件現在主要用來做程序破解和寫外掛,都是利用了OD方便快捷的逆向程序的好處。最近在看紅狼遠控源碼,Gh0st,老地再也不能老的東西了,不過我認為,老不老不是關鍵,關鍵是我們能從中學到很多東西,不想聽我閑BB可以直接看正文,從網上下載了一個Gh0st3.6的源碼,源碼是VC6寫的,有三個工程,如下:
?
其中svchost是主木馬,編譯出來是個dll,install是個加載器,就是把這個dll做成個服務在被控機器上,gh0sht是個控制端。由于VC編寫調試閱讀C++不太方便,我把他移植到了VS2010,把svchost編譯成了一個exe,這樣很方便調試,閱讀作者源代碼,他大概也是這樣做的,一開始svchost是個exe,后來改變成了dll,里面有宏進行控制,還有main函數。一開始只移植到vs2010不改變dll為exe,程序完美運行,被控端成功上線,美滋滋。注意被控端不能是xp以上的版本,xp可以的,因為xp以上的版本安裝服務和以前略有不同。把svchost改變成exe時費了一番功夫,一運行程序就崩潰,搞得我很郁悶。下面進入正題:
1.崩潰現象
?
這個問題是必現的,并且每次都崩潰到?DWORD?dwExitCode?=SOCKET_ERROR;
SOCKET_ERROR是個值為-1的宏,每次都發生訪問沖突,源碼就在這里,可依然沒有辦法,把錯誤信息貼入到度娘上看看,收效不大,這該怎么下手,
?
2.OD定位奔潰原因
看到桌面的OD圖面索性打開試試吧,其實一開始心里并沒有底,注意,OD有個查看源碼的工能,可快速的匹配C++和反匯編代碼,找到源碼位置雙擊就可以進入到該源碼所在匯編位置了。
?
找到上面崩潰那句代碼如下圖,并且上OD運行到這里,
?
匯編代碼:mov dword ptr ss:[ebp-0x22C],-0x1
看看ebp的值為0難怪會崩潰,ebp寄存器一般與堆棧相關,那就看下ebp什么時候突然變為0,經過一步一步走,發現執行下面這句匯編代碼時ebp變為了0,
那就調試這個call,看看ebp為什么變為0,跟進去這個call看了下,
一開始進入,直接push ebp,最后pop ebp,典型的寄存器保護嘛,容易理解,我們看到這個時候ebp是004FFAE4,在執行pop ebp之前我們再看下,
?
這個時候堆棧最頂部是個0,接下來ebp就變為了0,這是典型的堆棧溢出
?
3.找到崩潰位置
知道是堆棧溢出了,并且找到是一塊溢出的,就好找位置了,用OD重新調試一下程序,走到剛剛那個call,執行一下push ebp,然后雙擊堆棧地址,并且鎖定它,就看那句的代碼將這塊內存覆蓋,
?
一步一步走發現執行下面這句代碼,導致了ebp在堆棧中覆蓋,
?
那我們就看下源代碼吧,9成確定是這個函數原作者沒有用好,看了下代碼如下:
const char chOpt = 1; // True // Set KeepAlive 開a啟?保饋?活?機ú制?, 防え?止1服務?端?產ú生Θ?死à連?接ó if (setsockopt(m_Socket, SOL_SOCKET, SO_KEEPALIVE, (char *)&chOpt, sizeof(chOpt)) == 0) { // 設Θ?置?超?時骸?詳ê細?信?息¢ tcp_keepalive klive; klive.onoff = 1; // 啟?用?保饋?活? klive.keepalivetime = 1000 * 60 * 3; // 3分?鐘ó超?時骸?Keep Alive klive.keepaliveinterval = 1000 * 5; // 重?試?間?隔?為a5秒? Resend if No-Reply WSAIoctl ( m_Socket, SIO_KEEPALIVE_VALS, &klive, sizeof(tcp_keepalive), NULL, 0, (unsigned long *)&chOpt, 0, NULL ); }看了下這個API,第7個參數類型是LPDWORD,原作者定義了一個const char chOpt =1;然后強制轉換,怪不得會進行溢出。
?
4.解決辦法,
把 const char chOpt =1; 改為 unsigned long chOpt =1; 就可以了,沒有必要加const的,這個函數會修改這個值,這道問題不大,關鍵是是long型。
?
5.最后感悟
不知道VC6編譯時為什么不會崩潰,不知道安裝成服務就不會崩潰,慢慢找不崩潰的原因吧。最后,C++強制轉換這種東西最好還是不要用滴,很容易出事,出了事很難查。
?
?
?
總結
以上是生活随笔為你收集整理的论OD最原始的用途------找程序BUG的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OD 调试带启动参数的程序
- 下一篇: Gh0st 3.6 存在的BUG及修改方