今天是30天,很開心地可以完賽了。不過在結束之前我想我得把更多的動態反逆向技術帶給大家,那就開始今天的主題吧
此次的程式與原始碼都放在 :
https://github.com/Dinlon5566/IT_Reverse_Engineering/tree/main/Dx30
這次還是會介紹兩個有關於 SEH
機制下的反逆向技術。
在篇章開始的時候有介紹過不同暫存器的功能,而這次要用到的是陷阱標誌( 下圖 TF
,第九個位置,Index=8 )。
當 TF
被設為 1 的時候,CPU 會進入逐步執行模式
。此時每執行一次指令,都會拋出 EXCEPTION_SINGLE_STEP
例外,然後 TF
會自動歸零。雖然他無法被應用程式修改,不過還是可以用 Stack 的方式改變。
這個方法可以與上一篇的 SEH
( 例外處裡 ) 方法結合來探測 Debugger。
那這次就直接來示範本方法的範例 :
#include <iostream>
#include <Windows.h>
void foundDebugger() {
MessageBox(0, L"Found Debugger", L"TF", 0);
}
int main()
{
printf("Start\n");
__asm {
// 設定 SEH
push handler
push DWORD ptr fs : [0]
mov DWORD ptr fs : [0] , esp
// 由於無法直接設置 TF,所以把 EFLAGS 抓出來後把第 9 bit 設為 1 再存進 EFLAGS
pushfd
// 0x100=100000000b
or dword ptr ss : [esp] , 0x100
popfd
// 這邊會觸發 TF 引發例外拋出。
nop
// 若是例外被處裡或是使用單步模式,就會跑來這邊。
call foundDebugger
mov eax, 0xFFFFFFFF
jmp eax
// 例外處裡器
handler :
mov eax, dword ptr ss : [esp + 0xc]
mov dword ptr ds : [eax + 0xb8] , offset normal_code
xor eax, eax
retn
// 移除 SEH
normal_code :
pop dword ptr fs : [0]
add esp, 4
}
MessageBox(0, L"SAVE", L"TF", 0);
}
用 ollyDbg 嘗試以 F9 直接執行程式,就可以看到當成是運行到 NOP 的時候就會觸發 Trap Flag
引發暫停。然後執行 call foundDebugger()
與 JMP
0xFFFFFFFF
導致非法存取。
這個東西是用來在 kernel mode
來拋出例外的指令,若是一般運行的話也會拋出例外;但特別的是在反編譯中會自動把下一條指令忽略掉。所以可以在這的地方插入一些可以判別編譯器的指令。
#include <iostream>
#include <Windows.h>
void foundDebugger() {
MessageBox(0, L"Found Debugger", L"TF", 0);
}
int main()
{
__asm {
// 載入 SEH
push handler
push DWORD ptr fs : [0]
mov DWORD ptr fs : [0] , esp
// 觸發例外
int 0x2d
// 如果執行這行會使 EAX 變成 1
mov EAX, 0x1
// SEH 後確認 EAX 的值
Continue:
cmp EAX,0x0
je normal_code
// 發現 Debuger
call foundDebugger
mov eax,0xFFFFFFFF
jmp eax
handler :
// 處裡例外
mov eax, dword ptr ss : [esp + 0xc]
mov dword ptr ds : [eax + 0xb8] , offset Continue
xor eax,eax // 設定 EAX=0
retn
normal_code :
// 移除 SEH
pop dword ptr fs : [0]
add esp, 4
}
printf("SAVE\n");
return 0;
}
這份程式如果使用 ollyDbg 會直接在觸發 INT 2D
的地方卡死,所以使用了 Visual Studio 的 Debug 工具來執行。可以看見 EAX
被設為 1 無法通過分支指令的檢查,故被確認出運行在 Debugger 下。
這次的文章就到這邊 \OwO/ 謝謝大家
若是有錯誤或是問題可以透過 iThome 或是以下聯絡方式聯絡我 :
E-mail :