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