Jektor:一款功能強(qiáng)大的Windows用戶(hù)模式Shellcode執(zhí)行測(cè)試工具
關(guān)于Jektor
Jektor是一款功能強(qiáng)大的Windows用戶(hù)模式Shellcode執(zhí)行測(cè)試工具,該工具可以幫助廣大研究人員了解和測(cè)試惡意軟件所使用的各種不同技術(shù)。
該工具主要針對(duì)的是Shellcode注入技術(shù),可以演示惡意軟件在目標(biāo)系統(tǒng)上執(zhí)行Shellcode時(shí)所使用的技術(shù)方法,其中包括:
- 動(dòng)態(tài)解析API函數(shù)以避免IAT包含
- 使用未記錄的NT Windows API函數(shù)
- 通過(guò)CreateThread執(zhí)行本地Shellcode
- 通過(guò)CreateRemoteThread執(zhí)行遠(yuǎn)程Shellcode
- 通過(guò)QueueUserAPC支持本地Shellcode注入
- 通過(guò)EnumTimeFormatsEx支持本地Shellcode注入
- 通過(guò)CreateFiber進(jìn)行本地Shellcode注入
反病毒檢測(cè)
在使用動(dòng)態(tài)函數(shù)地址解析時(shí),將一組NOP預(yù)掛起到Msfvenom異或加密Shellcode Payload后,可以繞過(guò)Windows Defender。
IAT導(dǎo)入規(guī)避
Jektor利用了動(dòng)態(tài)函數(shù)地址解析,并使用了LoadLibrary和GetProcessAddress來(lái)增加了靜態(tài)分析的難度。
除此之外,很多惡意軟件也不會(huì)直接調(diào)用類(lèi)似VirtualAlloc這樣的重要函數(shù),這也會(huì)使得調(diào)試和通過(guò)斷點(diǎn)轉(zhuǎn)儲(chǔ)Shellcode變得更加困難。
工具下載
廣大研究人員可以使用下列命令將該項(xiàng)目源碼克隆至本地:
- git clone https://github.com/FULLSHADE/Jektor.git
通過(guò)CreateThread實(shí)現(xiàn)本地Shellcode執(zhí)行
在Windows上,當(dāng)你想要在當(dāng)前進(jìn)程中創(chuàng)建一個(gè)新的線程,需要調(diào)用CreateThread函數(shù),這是在一個(gè)進(jìn)程中執(zhí)行惡意代碼或Shellcode時(shí)會(huì)使用的一個(gè)最基本的技術(shù)了。此時(shí),我們只需要為Shellcode分配一個(gè)內(nèi)存區(qū)域,然后將Shellcode移動(dòng)到分配的內(nèi)存區(qū)域中,并使用指向該區(qū)域地址的指針來(lái)調(diào)用CreateThread即可。調(diào)用CreateThread時(shí),需傳遞lpStartAddress 參數(shù),而該參數(shù)是一個(gè)指向由新創(chuàng)建線程所執(zhí)行的應(yīng)用程序定義函數(shù)的指針。
通過(guò)EnumTimeFormatsEx實(shí)現(xiàn)本地Shellcode執(zhí)行
EnumTimeFormatsEx是一個(gè)Windows API函數(shù),可以枚舉提供的時(shí)間格式,能夠用于執(zhí)行Shellcode,因?yàn)榈谝粋€(gè)參數(shù)可以接收用戶(hù)定義的指針:
- BOOL EnumTimeFormatsEx(
- [in] TIMEFMT_ENUMPROCEX lpTimeFmtEnumProcEx,
- [in, optional] LPCWSTR lpLocaleName,
- [in] DWORD dwFlags,
- [in] LPARAM lParam
- );
- 使用VirtualAlloc為Shellcode Payload分配本地內(nèi)存。
- 使用memcpy/RtlCopyMemory將Shellcode Payload移動(dòng)到新分配的內(nèi)存區(qū)域。
- 將Shellcode作為EnumTimeFormatsEx的lpTimeFmtEnumProcEx參數(shù)來(lái)傳遞,并觸發(fā)Shellcode。
通過(guò)QueueUserAPC實(shí)現(xiàn)本地Shellcode執(zhí)行
- 使用VirtualAlloc為Shellcode分配內(nèi)存緩沖區(qū)。
- 使用GetCurrentProcess獲取當(dāng)前進(jìn)程的句柄。
- 使用WriteProcessMemory向新分配的內(nèi)存區(qū)域?qū)懭隨hellcode Payload。
- 使用GetCurrentThread獲取當(dāng)前線程的句柄。
- 將分配的內(nèi)存區(qū)域以pfnAPC參數(shù)的形式提供給QueueUserAPC,并將新創(chuàng)建的APC程序加入隊(duì)列。
- 通過(guò)調(diào)用未記錄的NtTestAlert函數(shù)觸發(fā)Shellcode Payload,該函數(shù)將清除當(dāng)前線程的APC隊(duì)列。
- 通過(guò)關(guān)閉當(dāng)前線程和當(dāng)前進(jìn)程的句柄來(lái)執(zhí)行清理任務(wù)。
項(xiàng)目地址
Jektor:【GitHub傳送門(mén)】