C++原始碼免殺之函式的動態呼叫

H-KING發表於2015-10-02

最近也在學著修改Gh0st遠控的原始碼,源程式碼免殺起來還是方便、簡單、有效和簡單點。針對於輸入輸出表盯的比較緊的防毒軟體,最有效的還是進行函式動態呼叫。也就是說找到函式的原定義,包括值型別和引數等等,再在呼叫該函式的地方重新定義這個函式,其實也只是改下函式名而已,下面舉個例子:

CreateRemoteThread 作用是建立遠執行緒,假設防毒軟體現在就殺在這個函式上,我們就這樣處理,首先在程式碼中右鍵點選CreateRemoteThread函式-->轉到定義,找到函式的原型:

函式原型如下:

WINBASEAPI
__out
HANDLE
WINAPI
CreateRemoteThread(
__in HANDLE hProcess,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in_opt LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out_opt LPDWORD lpThreadId
);

改後的函式模型如下:

typedef HANDLE (WINAPI *CreateRemoteThreadxx)
(
__in HANDLE hProcess,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in_opt LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out_opt LPDWORD lpThreadId
);
CreateRemoteThreadxx yyCreateRemoteThread= (CreateRemoteThreadxx)GetProcAddress(LoadLibrary("kernel32.dll"),"CreateRemoteThread");

補充:有些函式原型最後面分別帶得有A和W的,如果你的編譯環境是ANSI環境就選擇帶A的那部分,如果你的環境是Unicode環境,那就選擇帶W的那部分。例如:GetUserName的原型有兩種定義:GetUserNameA和GetUserNameW,視實際情況選擇相應的函式原型進行修改就好。

修改後呼叫的函式名就由CreateRemoteThread變為了yyCreateRemoteThread,紅色部分為自定義部分,隨便你改稱什麼,但是要注意前後一致。藍色的部分再可以用字串連線法進行分離後連線,這樣處理之後,防毒軟體就找不到CreateRemoteThread這個函式了。到此,檔案的這處也就免殺了。一點小手記,分享給大家,見笑了。

後記:看了很多教程,都是說怎麼改,沒說為什麼要這麼改,也沒說還可以怎麼改,更沒說改的限度是什麼。一看教程裡先在函式後面加個L,再在定義後的新的函式前面加個p,接著很多看了教程的人都改成那兩個,做教程的人還在教程裡嚇唬人說“別的都不要動,這兩個地方改成這樣就可以了”,有時候有些事情並不難,並不可怕,難和可怕大多來自於別人的聳人聽聞和對未知事物的懼怕。最後希望大家都能夠放開手腳,幹番大事業!搞了個垃圾站賺點外塊,希望大家能支援下。

相關文章