C++源代码免杀之函数的动态调用
最近也在學(xué)著修改Gh0st遠控的源代碼,源代碼免殺起來還是方便、簡單、有效和簡單點。針對于輸入輸出表盯的比較緊的殺毒軟件,最有效的還是進行函數(shù)動態(tài)調(diào)用。也就是說找到函數(shù)的原定義,包括值類型和參數(shù)等等,再在調(diào)用該函數(shù)的地方重新定義這個函數(shù),其實也只是改下函數(shù)名而已,下面舉個例子:
CreateRemoteThread 作用是創(chuàng)建遠線程,假設(shè)殺毒軟件現(xiàn)在就殺在這個函數(shù)上,我們就這樣處理,首先在代碼中右鍵點擊CreateRemoteThread函數(shù)-->轉(zhuǎn)到定義,找到函數(shù)的原型:
函數(shù)原型如下:
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
);
改后的函數(shù)模型如下:
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");
補充:有些函數(shù)原型最后面分別帶得有A和W的,如果你的編譯環(huán)境是ANSI環(huán)境就選擇帶A的那部分,如果你的環(huán)境是Unicode環(huán)境,那就選擇帶W的那部分。例如:GetUserName的原型有兩種定義:GetUserNameA和GetUserNameW,視實際情況選擇相應(yīng)的函數(shù)原型進行修改就好。
修改后調(diào)用的函數(shù)名就由CreateRemoteThread變?yōu)榱藋yCreateRemoteThread,紅色部分為自定義部分,隨便你改稱什么,但是要注意前后一致。藍色的部分再可以用字符串連接法進行分離后連接,這樣處理之后,殺毒軟件就找不到CreateRemoteThread這個函數(shù)了。到此,文件的這處也就免殺了。一點小手記,分享給大家,見笑了。
后記:看了很多教程,都是說怎么改,沒說為什么要這么改,也沒說還可以怎么改,更沒說改的限度是什么。一看教程里先在函數(shù)后面加個L,再在定義后的新的函數(shù)前面加個p,接著很多看了教程的人都改成那兩個,做教程的人還在教程里嚇唬人說“別的都不要動,這兩個地方改成這樣就可以了”,有時候有些事情并不難,并不可怕,難和可怕大多來自于別人的聳人聽聞和對未知事物的懼怕。最后希望大家都能夠放開手腳,干番大事業(yè)!搞了個垃圾站賺點外塊,希望大家能支持下。
總結(jié)
以上是生活随笔為你收集整理的C++源代码免杀之函数的动态调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: socket中的nagle算法
- 下一篇: 我所理解的设计模式(C++实现)—— “