在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

介紹6種常見的反調試方法

蛇矛實驗室 ? 來源:蛇矛實驗室 ? 2024-01-15 09:53 ? 次閱讀

本期作者/牛杰

前言

是一種防止逆向的方案。逆向人員如果遇到復雜的代碼混淆,有時會使用調試器動態分析代碼邏輯簡化分析流程。例如惡意軟件通常會被安全研究人員、反病毒廠商和其他安全專業人員分析和調試,以了解其行為和功能,并開發相應的安全措施來保護系統,這時,惡意軟件開發人員就會使用反調試技術阻礙逆向人員的分析,以達到增加自己惡意代碼的存活時間。此外,安全人員也需要了解反調試技術,當遇到反調試代碼時,可以使用相對應的反反調試。在反調試技術上中,我們介紹了9種常見的反調試方法,本篇繼續介紹6種方式。

反調試

1.NtSetInformationThread

NtSetInformationThread 是 Windows 操作系統提供的一個函數,用于設置線程的信息,該函數通常用來設置線程的優先級,此外通過設置不同的 ThreadInformationClass 參數,可以實現隱藏線程、禁止調試、設置調試狀態等操作,從而增加程序的安全性和防御性,該函數原型與枚舉信息如下。

__kernel_entry NTSYSCALLAPI NTSTATUS NtSetInformationThread(
[in] HANDLE ThreadHandle,
[in] THREADINFOCLASS ThreadInformationClass,
[in] PVOID ThreadInformation,
[in] ULONG ThreadInformationLength
);

typedef enum_THREADINFOCLASS { 
ThreadBasicInformation, 
ThreadTimes, 
ThreadPriority, 
ThreadBasePriority, 
ThreadAffinityMask, 
ThreadImpersonationToken, 
ThreadDescriptorTableEntry, 
ThreadEnableAlignmentFaultFixup, 
ThreadEventPair_Reusable, 
ThreadQuerySetWin32StartAddress, 
ThreadZeroTlsCell, 
ThreadPerformanceCount, 
ThreadAmILastThread, 
ThreadIdealProcessor, 
ThreadPriorityBoost, 
ThreadSetTlsArrayAddress, 
ThreadIsIoPending, 
ThreadHideFromDebugger, 
ThreadBreakOnTermination, 
MaxThreadInfoClass 
} THREADINFOCLASS;

NtSetInformationThread通過ThreadInformationClass中ThreadHideFromDebugger來反調試 是 NtSetInformationThread 函數的一個參數,用于將當前線程隱藏起來,使得調試器無法對其進行調試。這個參數的作用是防止調試器附加到被隱藏的線程上進行調試操作。

當線程被隱藏后,調試器無法訪問和控制該線程的執行。這可以用作一種反調試技術,防止惡意用戶或惡意軟件使用調試器來分析、修改或干擾程序的執行。

通過隱藏線程,程序可以增加自身的安全性,防止被調試器進行逆向工程、代碼分析、內存調試等操作。這對于一些需要保護知識產權、防止惡意調試的應用程序或安全軟件來說特別有用。

NtSetInformationThread反調試demo如下。

#include
#include

typedefenum_THREADINFOCLASS {
ThreadBasicInformation,
ThreadTimes,
ThreadPriority,
ThreadBasePriority,
ThreadAffinityMask,
ThreadImpersonationToken,
ThreadDescriptorTableEntry,
ThreadEnableAlignmentFaultFixup,
ThreadEventPair_Reusable,
ThreadQuerySetWin32StartAddress,
ThreadZeroTlsCell,
ThreadPerformanceCount,
ThreadAmILastThread,
ThreadIdealProcessor,
ThreadPriorityBoost,
ThreadSetTlsArrayAddress,
ThreadIsIoPending,
ThreadHideFromDebugger,
ThreadBreakOnTermination,
MaxThreadInfoClass
} THREADINFOCLASS;
typedefNTSTATUS(WINAPI* pNtSetInformationThread)(HANDLE, THREADINFOCLASS, PVOID, ULONG);
voidHideFromDebugger(){
HMODULE hNtDll = LoadLibrary(TEXT("ntdll.dll"));
pNtSetInformationThread NtSetInformationThread = (pNtSetInformationThread)GetProcAddress(hNtDll, "NtSetInformationThread");
NTSTATUS status = NtSetInformationThread(GetCurrentThread(), ThreadHideFromDebugger, NULL, 0);
}

voidThreadHid(){
HideFromDebugger();
intx = 1;
while(1) {
printf("%d",x);
Sleep(1000);
x++;
};
}

intmain()
{
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadHid, 0, 0, 0);

getchar();

return0;
}

使用調試器執調試該程序,可以看到程序正常執行。

0419ab90-b132-11ee-8b88-92fbcf53809c.png

然后在線程中下斷點,程序會自動關閉。

043e5792-b132-11ee-8b88-92fbcf53809c.png

需要注意的是,雖然使用 ThreadHideFromDebugger 可以增加程序的安全性,但它并不是絕對的安全措施,因為仍然存在其他方法可以繞過或檢測到線程隱藏。因此,在設計安全應用程序時,應綜合考慮多種防護措施,并定期進行安全評估和更新。

2.SeDebugPrivilege

默認情況下,進程沒有調試權限(SeDebugPrivilege),除非自己主動開啟,但是調試器啟動程序并調試時,會從調試器繼承該權限。使用該方式需要先調用CsrGetProcessId獲取csrss.exe的pid,該函數在ntdll。獲取pid后,通過OpenProcess讀取句柄csrss.exe,如果能獲取則說明被調試,代碼如下。

HMODULEhMod = LoadLibrary(TEXT("ntdll.dll"));
typedefint(*CSRGETPROCESSID)();
CSRGETPROCESSIDCsrGetProcessId = (CSRGETPROCESSID)GetProcAddress(hMod, "CsrGetProcessId");
DWORDpid = CsrGetProcessId();

HANDLEhandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
if(handle) {
returntrue;
}
else{
returnfalse;
}

3.時間檢測

通過計算時間差,如果時間間隔過長,判斷當前進程被反調試,常用API有API有:QueryPerformanceCounter、GetTickCount、GetSystemTime、GetLocalTime,這些API使用方法相似,我們使用GetTickCount舉例。

DWORDstarttime = GetTickCount();
DWORDendtime = GetTickCount();
if(endtime - starttime > 500) {
returntrue;
}
else{
returnfalse;
}

4.父進程

通過檢測自身父進程來判定是否被調試,原理非常簡單,我們的系統在運行程序的時候,絕大多數應用程序都是由explorer.exe這個父進程派生而來的子進程,也就是說如果沒有被調試其得到的父進程就是explorer.exe的進程PID,而如果被調試則該進程的父進程PID就會變成調試器的PID值,通過對父進程的檢測即可實現檢測是否被調試的功能。

#include
#include
#include

intIsDebug()
{
DWORD ExplorerId = 0;
PROCESSENTRY32 pe32 = { 0};
DWORD ProcessId = GetCurrentProcessId();

GetWindowThreadProcessId(FindWindow(L"Progman", NULL), &ExplorerId);

HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if(hProcessSnap != INVALID_HANDLE_VALUE)
{
pe32.dwSize = sizeof(PROCESSENTRY32);
Process32First(hProcessSnap, &pe32);
do
{
if(ProcessId == pe32.th32ProcessID)
{
// 判斷父進程是否是 Explorer.exe
if(pe32.th32ParentProcessID != ExplorerId)
{
returnTRUE;
}
}
} while(Process32Next(hProcessSnap, &pe32));
}
returnFALSE;
}

intmain(intargc, char* argv[])
{
if(IsDebug())
{
printf("正在被調試 
");
}

system("pause");
return0;
}

044be114-b132-11ee-8b88-92fbcf53809c.png

5.NtYieldExecution

NtYieldExecution讓當前線程主動放棄其剩余的時間片,并執行下一個等待的線程。如果沒有線程被安排執行或在使用調試器單步調試時線程無法切換,NtYieldExecution函數返回為STATUS_NO_YIELD_PERFORMED (0x40000024)。

#defineSTATUS_NO_YIELD_PERFORMED 0x40000024 
typedefNTSTATUS(WINAPI* pNtYieldExecution)();
boolisDebug()
{
HMODULE hNtDll = LoadLibrary(TEXT("ntdll.dll"));
pNtYieldExecution NtYieldExecution = (pNtYieldExecution)GetProcAddress(hNtDll, "NtSetInformationThread");
INT iDebugged = 0;

for(inti = 0; i < 0x20; i++)
????{
????????Sleep(0xf);

????????if?(NtYieldExecution() != STATUS_NO_YIELD_PERFORMED)
????????????iDebugged++;
????}

????if?(iDebugged <= 3)
????????return?false;
????else
????????return?true;

????system("pause");
}

但是這種方法其實并不可靠,因為它只顯示當前進程中是否有一個高優先級的線程。然而,它可以作為一種反跟蹤技術。

6.DbgUiRemoteBreakin

DbgUiRemoteBreakin打補丁可以反OD附加調試,當我們用OD附加調試時,CreateRemoteThread函數在目標程序中創建了一個遠程線程,然后在遠程線程中調用DbgUiRemoteBreakin函數,DbgUiRemoteBreakin內部調用了DbgBreakPoint函數,DbgBreakPoint函數內部下了一個int 3斷點,觸發異常讓操作系統運行異常處理程序,然后操作系統把控制權交管給調試器,因此可以創建TLS回調的方式hook DbgUiRemoteBreakin,內部直接調用ExitProcess()退出程序,測試代碼如下。

# include
# include
# include
intmain(intargc, char* argv[])
{
BYTE bBuffer[0x10] = { 0};
DWORD dwBreakAddress; 
DWORD dwOldProtect;
DWORD dwNum;

dwBreakAddress = (DWORD)GetProcAddress(LoadLibrary(L"ntdll.dll"), "DbgUiRemoteBreakin");
bBuffer[0] = 0xE9; 
*((DWORD*)(bBuffer + 1)) = (DWORD)ExitProcess - dwBreakAddress; 

VirtualProtect((LPVOID)dwBreakAddress, 0x10, PAGE_EXECUTE_READWRITE, &dwOldProtect);
WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwBreakAddress, bBuffer, 5, &dwNum);
VirtualProtect((LPVOID)dwBreakAddress, 0x10, dwOldProtect, &dwOldProtect);

while(1)
{
staticintx = 0;
printf("%d
",x);
Sleep(1000);
x++;
}
return0;
}

當OD附加,程序終止。

04613956-b132-11ee-8b88-92fbcf53809c.png

總結

本篇繼續介紹了其他反調試的方法,在自己的代碼中使用反調試技術,可以增加逆向人員的分析難度,或是通過了解這些技術的原理,在分析惡意代碼時進行反反調試,在后續的文章中,將會介紹更多的反調試方法。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • WINDOWS
    +關注

    關注

    4

    文章

    3570

    瀏覽量

    89308
  • 操作系統
    +關注

    關注

    37

    文章

    6896

    瀏覽量

    123751
  • 調試
    +關注

    關注

    7

    文章

    589

    瀏覽量

    34064
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62977

原文標題:反調試技術-下

文章出處:【微信號:蛇矛實驗室,微信公眾號:蛇矛實驗室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    簡單了解反調試技術

    反調試技術,是一防止逆向的方案。逆向人員如果遇到復雜的代碼混淆,有時會使用調試器動態分析代碼邏輯簡化分析流程。例如惡意軟件通常會被安全研究人員、反病毒廠商和其他安全專業人員分析和調試
    的頭像 發表于 11-13 11:10 ?1979次閱讀
    簡單了解<b class='flag-5'>反調試</b>技術

    常見的金屬冶煉方法

    常見的金屬冶煉方法本文介紹常用的方法,希望大家能用得到! 
    發表于 03-03 17:14

    嵌入式arm調試方法介紹

    開發基于 arm 的應用軟件,包括編輯、編譯、匯編、鏈接等工作全部在 PC 機上即可完成,調試工作則需要配合其他的模塊或產品方可完成,目前常見調試方法有以下幾種:  1. 指令集模擬
    發表于 05-11 16:53

    【北京】奇虎360誠聘車聯網安全研究員

    ;5.至少能夠熟練使用C、C++、python等一編程語言;6.熟悉常見的軟件保護方法和協議加密算法。 有整車廠軟件開發經驗、破解程序POC實例、汽車破解經驗者優先。 有意向者請發送
    發表于 08-17 17:27

    動態反調試技術總結

    :1. CC int3 指令(注意兩者之間沒有空格)。2.CD 2D int 2d 指令3.pushfdor [esp],100 popfd使EFlags寄存器TF==1.此3種方法,都是利用了調試器特有
    發表于 07-10 06:21

    介紹幾種常見電阻器的測試方法

    本文介紹了幾種常見電阻器的測試方法
    發表于 05-10 07:12

    介紹常見的CPU故障及維護方法

    我們使用電腦的時候有一個CPU的硬件,大家很多對這個硬件不是很了解,遇到狀況也很難解決,下面給大家介紹常見的CPU故障及維護方法,歡迎閱讀!常見的CPU故障及維護
    發表于 09-08 06:09

    介紹goahead的調試手段

    這里介紹goahead的調試手段:(1)終端調試(2)日志調試1 終端調試終端
    發表于 12-16 06:21

    安防監控系統常見故障及解決方法

    本文介紹監控系統進入調試、試運行及交付使用階段,可能出現的常見故障現象及其解決方法參考。
    發表于 12-18 11:45 ?4948次閱讀

    TR5001T設備介紹及程序調試方法

    TR5001設備介紹及程序調試方法和程序調試技巧。
    發表于 06-16 18:21 ?0次下載

    GOE219硬件調試常見問題及檢修方法

    GOE219硬件調試常見問題及檢修方法
    發表于 12-27 16:26 ?0次下載

    python斷點調試方法

    本文主要介紹了python斷點調試方法,pdb 是 python 自帶的一個包,為 python 程序提供了一交互的源代碼調試功能,主要特
    發表于 01-14 10:44 ?7324次閱讀
    python斷點<b class='flag-5'>調試</b><b class='flag-5'>方法</b>

    遠程調試嵌入式系統的介紹

    調試嵌入式系統與桌面操作系統差別很大,本文向您介紹調試嵌入式系統的兩推薦方案,插樁和片上調試,希望對您的嵌入式項目中有所幫助。我們
    發表于 04-14 07:43 ?2619次閱讀
    兩<b class='flag-5'>種</b>遠程<b class='flag-5'>調試</b>嵌入式系統的<b class='flag-5'>介紹</b>

    MATLAB程序調試方法及工具介紹

    MATLAB程序設計之MATLAB程序調試方法及工具介紹
    的頭像 發表于 07-13 17:50 ?6904次閱讀
    MATLAB程序<b class='flag-5'>調試</b>的<b class='flag-5'>方法</b>及工具<b class='flag-5'>介紹</b>

    單機PFC調試經常會碰到哪些異常?8常見單機PFC調試異常和解決方法

    PFC在電路中的作用是體現電力的利用率,此項系數反映著電路性能的好壞。因此很多設計者對于PFC的調試都非常重視,在本文中小編將對電源達人的經驗進行總結,給出一單級PFC的調試心得,其中包含了很多異常情況的
    的頭像 發表于 09-24 19:28 ?8336次閱讀
    主站蜘蛛池模板: 你懂的网站在线播放 | 中文字幕在线观看你懂的 | 韩国成人毛片aaa黄 韩国床戏合集三小时hd中字 | 日日艹| 欧美国产在线一区 | 又潮又黄的叫床视频 | 久久久五月 | 种子天堂bt | 精品无码三级在线观看视频 | 特黄aaaaa日本大片免费看 | 天天天综合 | 免费观看视频高清www | 天堂成人一区二区三区 | 日韩精品一区二区在线观看 | 亚欧乱色束缚一区二区三区 | 国产精品免费久久 | 俺去俺来也www色官网免费的 | 上海一级毛片 | 午夜精品久久久久久久久 | 刺激一区| 午夜老司机福利 | 久久人精品 | www在线播放| 天天干天天谢 | 黄色日本视频网站 | 黄色网址你懂的 | 国产色爽女 | 天天夜夜操 | 亚洲免费成人 | 69yywww| 在线观看三级网站 | 色视频在线观看网站 | 久久国产精品99精品国产987 | 牛牛a级毛片在线播放 | 97午夜理伦片在线影院 | 狠狠干天天爱 | 在线天堂bt种子 | 中文字幕亚洲一区二区三区 | 夜夜精品视频一区二区 | gav久久 | 久久刺激 |