甚麼是IsDebuggerPresent?它有甚麼功用?
想必對學資安的人一定不陌生,所以小弟解說錯了還請指正
IsDebuggerPresent它無所不在也不一定會被使用到,
因為它隸屬於KERNEL32.DLL,所以你就算不使用這個函式,
它一樣會出現只不過沒被呼叫,IsDebuggerPresent的功能
就是判斷有沒有其他程式在調試這個程式,是一個早期的
防逆向函式,不過現在大多數設計人員也不太會使用到它了,
所以我就拿來當基礎教學。
所以呢!我今天要做一個簡單的使用教學和繞過方法,
本文章用於學術,拿來做壞事的可別推卸責任喔!!!!!!
使用工具 X64DBG 和 visual studio 2017
先打開visual studio 2017
點選檔案 -> 新增 -> 專案
選擇C++
C++主控台
按下確定後創建好一個新專案!
會變成差不多這樣(檔名不一定相同)
然後我們先在標頭加入 iostream標頭檔
加入using namespace std;
然後我們需要知道IsDebuggerPresent的標頭檔是什麼?
所以請跳到神奇的連結查找 ,就會發現它是Windows.h和WinBase.h
所以我選擇使用Windows.h
把它加到程式碼上,打上 #include <Windows.h>
就可以使用函式了!!
接下來程式碼的部分就做個簡單測試用就好
好了後點選建置 ->建置方案
好了後就去它的資料夾找Release的不要選Debug的
打開它後會變這樣
現在我們開啟X64DBG 32位元版(以系統管理員執行)
點選檔案 - > 附加 或是 ALT+A後會變這樣
找到你從Release開啟的檔案並附加
等它加載後會到一個中斷點(可能會根圖不一樣)
這時我們直接點選符號
你會看到這個簡單的程式就用了許多的DLL了,不過不要慌張
我講過IsDebuggerPresent它隸屬於Kernel32.dll,所以我們在左下角的搜尋
查找Kernel32,然後右下角的搜尋查找IsDebuggerPresent
Kernel32
IsDebuggerPresent
你會發現有兩個IsDebuggerPresent 位址
我們直接兩個都下斷點
點選它 右建->斷點 斷點後位址那邊會呈現紅色
而另一個無法,原因是什麼呢?我就不做解釋因為那已經超過這篇教學範圍ㄏㄏ
然後回到CPU 點選執行
直到它跳到我們斷點的位址
然後直接往右下角的視窗看
會發現它這邊的第一格等同於斷點那邊,不過呢這邊更詳細的告訴你
發這個訊號的位址式000B1016(你們看到的可能不一樣),所以呢!
我們去尋找這個位址,快捷鍵是ctrl + G ,把你找到的位址打上
按下確定後會到這邊
test eax,eax 這段很重要喔! test 就是bool的判斷一種,
TEST 和 AND 大同小異,但TEST結果不改變暫存器,只會改變旗標,
在我們高階語言 bool 只有 0 跟 1 這邊也是一樣,
我們先來看左邊(隱藏FPU)
eax 呈現在0的狀態,也就是說 test eax,eax 這段意思就是
如果eax不等於0,就會觸發IsDebuggerPresent,
如果我不做更改執行下去來看看,請按執行的快捷鍵 F9
它會跳回我們下的斷點,不用理它馬上再回到000B1016位址觀看FPU
它被換成了 0FB18D90 !!!!!!!!!!!!!!!!!!!!!!!!
來看看測試程式的字串
跑出了發現異常!!!!
這邊可以確定是因為這個原因觸發的,所以我們現在先把X64DBG解除附加
快捷鍵是 ctrl + alt + f2再來看看測試程式
很好! 它又變回正常使用了!
接下來我們來繞過這個函式吧! 先把X64DBG附加回去,一樣要
到我先前做的地方下斷點,如果有就不用,然後一樣找右下角新的位址,
找到後一樣尋找位址跳到這個畫面
接下來該怎麼做呢????
test eax,eax 這邊是判斷要回傳為0,所以啊我們要讓它永遠變成判斷0,我們先看到FPU
我們可以發現EDX參數也是0
所以我把 test eax,eax修改程 test eax,edx
按執行或F9,它會跑到我們之前下斷點的地方,請取消斷點在執行一次
然後觀看測試程式碼
冰果!!!!現在它沒有被偵測到了!!這樣簡單就防止偵測調試器了!
簡單的教學到此結束~~