最近嘗試對某軟體注入shellcode,遇到了幾個問題:
我的第1次嘗試:先將shellcode映射到目標行程,并通過CreateRemoteThread在目標行程中創建遠程執行緒來執行shellcode,此時發現在執行緒函式(threadProc)被執行前,其首句代碼被改為0xC3,隨后才開始執行執行緒函式。
我的第2次嘗試:同樣是創建遠程執行緒,其執行緒函式的地址改為目標行程中的正常模塊的某個函式地址(例如LoadLibrary函式的地址),發現該函式可以正常執行,其首句代碼不會被更改。
我的第3次嘗試,首先通過CreateRemoteThread+LoadLibrary將一個DLL注入目標行程,然后在DLL中呼叫CreateThread創建一個本地行程去執行我事先映射的ShellCode,發現ShellCode首句代碼仍被更改為0xC3。
請問這種檢測機制是如何實作的?在R3層,CreateThread的底層是否呼叫了其他API ? 我查看過目標行程CreateThread函式的機器碼,沒有發現其被更改,可以排除CreateThread的Inline hook。
uj5u.com熱心網友回復:
我懷疑你的執行緒函式地址計算錯誤,0xc3是RETU 首句改為0xC3了,怎么會執行執行緒函式。你可以把你的Shellcode發上來看下uj5u.com熱心網友回復:
你好,確實是被改為0xC3了。
在我呼叫遠程執行緒之前,使用CE工具查看了位于目標行程中的shellcode,代碼完全正確。
隨后我啟動遠程執行緒,此時觀察shellcode,發現其第一句代碼被改為0xC3,所以執行緒函式直接RET結束。
這應該是一種對創建執行緒的檢測的手段,但我不清楚其原理。目前來看是在R3層下的檢測機制。
uj5u.com熱心網友回復:
....那得看你目標行程是什么東西了,你可以先用普通exe測驗uj5u.com熱心網友回復:
先用其它軟體看看createthread有沒有被HOOK
uj5u.com熱心網友回復:
我懷疑你的執行緒函式地址計算錯誤,0xc3是RETU 首句改為0xC3了,怎么會執行執行緒函式。你可以把你的Shellcode發上來看下

uj5u.com熱心網友回復:
我懷疑你的執行緒函式地址計算錯誤,0xc3是RETU 首句改為0xC3了,怎么會執行執行緒函式。你可以把你的Shellcode發上來看下
你好,確實是被改為0xC3了。
在我呼叫遠程執行緒之前,使用CE工具查看了位于目標行程中的shellcode,代碼完全正確。
隨后我啟動遠程執行緒,此時觀察shellcode,發現其第一句代碼被改為0xC3,所以執行緒函式直接RET結束。
這應該是一種對創建執行緒的檢測的手段,但我不清楚其原理。目前來看是在R3層下的檢測機制。
先用其它軟體看看createthread有沒有被HOOK
你好,我對比了createthread的機器碼,沒有發現其被改動。可以排除Inline Hook。
有沒有其他可能性?
uj5u.com熱心網友回復:
....那得看你目標行程是什么東西了,你可以先用普通exe測驗
你好,注入普通的exe沒問題。
uj5u.com熱心網友回復:
那應該是檢查CreateRemoteThread吧uj5u.com熱心網友回復:
那應該是檢查CreateRemoteThread吧
我注入一個DLL到目標行程,在DLL中呼叫CreateThread()去創建本地執行緒執行事先映射過來的shellcode,在執行緒函式執行的瞬間shellcode首句代碼同樣被修改為0xC3。
所以我認為CreateRemoteThread和CreateThread都被檢測了,但不清楚是在哪個環節動的手腳。
您覺得有哪些可能性呢?可以排除硬體斷點和inline hook
uj5u.com熱心網友回復:
那應該是檢查CreateRemoteThread吧
我注入一個DLL到目標行程,在DLL中呼叫CreateThread()去創建本地執行緒執行事先映射過來的shellcode,在執行緒函式執行的瞬間shellcode首句代碼同樣被修改為0xC3。
所以我認為CreateRemoteThread和CreateThread都被檢測了,但不清楚是在哪個環節動的手腳。
您覺得有哪些可能性呢?可以排除硬體斷點和inline hook
都己要執行dll中的createthread了,為什么還要shellcode?
uj5u.com熱心網友回復:
那應該是檢查CreateRemoteThread吧
我注入一個DLL到目標行程,在DLL中呼叫CreateThread()去創建本地執行緒執行事先映射過來的shellcode,在執行緒函式執行的瞬間shellcode首句代碼同樣被修改為0xC3。
所以我認為CreateRemoteThread和CreateThread都被檢測了,但不清楚是在哪個環節動的手腳。
您覺得有哪些可能性呢?可以排除硬體斷點和inline hook
都己要執行dll中的createthread了,為什么還要shellcode?
我想隱藏注入的模塊,所以想寫為shellcode的形式。
uj5u.com熱心網友回復:
那應該是檢查CreateRemoteThread吧
我注入一個DLL到目標行程,在DLL中呼叫CreateThread()去創建本地執行緒執行事先映射過來的shellcode,在執行緒函式執行的瞬間shellcode首句代碼同樣被修改為0xC3。
所以我認為CreateRemoteThread和CreateThread都被檢測了,但不清楚是在哪個環節動的手腳。
您覺得有哪些可能性呢?可以排除硬體斷點和inline hook
都己要執行dll中的createthread了,為什么還要shellcode?
我想隱藏注入的模塊,所以想寫為shellcode的形式。
沒測驗過這種,不了解了。
uj5u.com熱心網友回復:
那應該是檢查CreateRemoteThread吧
我注入一個DLL到目標行程,在DLL中呼叫CreateThread()去創建本地執行緒執行事先映射過來的shellcode,在執行緒函式執行的瞬間shellcode首句代碼同樣被修改為0xC3。
所以我認為CreateRemoteThread和CreateThread都被檢測了,但不清楚是在哪個環節動的手腳。
您覺得有哪些可能性呢?可以排除硬體斷點和inline hook
都己要執行dll中的createthread了,為什么還要shellcode?
我想隱藏注入的模塊,所以想寫為shellcode的形式。
沒測驗過這種,不了解了。
好吧,還是謝謝您的回復。
uj5u.com熱心網友回復:
那應該是檢查CreateRemoteThread吧
我注入一個DLL到目標行程,在DLL中呼叫CreateThread()去創建本地執行緒執行事先映射過來的shellcode,在執行緒函式執行的瞬間shellcode首句代碼同樣被修改為0xC3。
所以我認為CreateRemoteThread和CreateThread都被檢測了,但不清楚是在哪個環節動的手腳。
您覺得有哪些可能性呢?可以排除硬體斷點和inline hook
都己要執行dll中的createthread了,為什么還要shellcode?
我想隱藏注入的模塊,所以想寫為shellcode的形式。
沒測驗過這種,不了解了。
好吧,還是謝謝您的回復。
昨天太晚了,兩種思路你參考下,一種shellcode hook原exe訊息,訊息中createthread
二,OD記憶體斷點,回溯什么修該執行緒函式首地址,針對處理,這里回復太慢,留你的聯系方式,可以討論下
uj5u.com熱心網友回復:
驅動層PsSetCreateThreadNotifyRoutine注冊執行緒創建回呼,任你要R3怎么折騰都有脫不出手掌心uj5u.com熱心網友回復:
驅動層PsSetCreateThreadNotifyRoutine注冊執行緒創建回呼,任你在R3怎么折騰都脫不出手掌心uj5u.com熱心網友回復:
驅動層PsSetCreateThreadNotifyRoutine注冊執行緒創建回呼,任你在R3怎么折騰都脫不出手掌心
過濾總要有條件的,回呼總不可能所有都不能創建執行緒,無非就是執行緒函式記憶體模塊過濾,做的符合條件不是可以了嗎,驅動也不是萬能的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/43676.html
標籤:進程/線程/DLL
