• <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.¢%

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

            about Injection (2)

            Posted on 2010-02-07 17:23 S.l.e!ep.¢% 閱讀(1583) 評論(2)  編輯 收藏 引用 所屬分類: RootKit
            about Injection ? 被說成是 black paper.....? 俺只是技術研究,沒其它目的.....

            代碼優化

            bool?EnablePrivilege(LPCTSTR?lpszPrivilege,?bool?bEnable)
            {
            ????HANDLE?TokenHandle?
            =?NULL;

            ????
            //?
            ????if?(?FALSE?==?::OpenProcessToken(?GetCurrentProcess(),?TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,?&TokenHandle)?)
            ????{
            ????????
            return?false;
            ????}
            ????
            ????TOKEN_PRIVILEGES?tkp;
            ????
            ????
            //?Get?LUID?for?SeDebugPrivilege
            ????if(?FALSE?==?::LookupPrivilegeValue(NULL,?lpszPrivilege,?&tkp.Privileges[0].Luid)?)
            ????{
            ????????::CloseHandle(TokenHandle);
            ????????
            return?false;
            ????}

            ????tkp.PrivilegeCount?
            =?1;

            #ifndef?SE_PRIVILEGE_REMOVED
            #define?SE_PRIVILEGE_REMOVED?0X00000004?
            #endif

            ????
            if(?bEnable?)
            ????????tkp.Privileges[
            0].Attributes?=?SE_PRIVILEGE_ENABLED;
            ????
            else
            ????????tkp.Privileges[
            0].Attributes?=?SE_PRIVILEGE_REMOVED;
            ????
            ????
            if?(?FALSE?==?AdjustTokenPrivileges(TokenHandle,?FALSE,?&tkp,?0,?NULL,?NULL)?)?
            ????{
            ????????::CloseHandle(TokenHandle);
            ????????
            return?false;
            ????}

            ????::CloseHandle(TokenHandle);

            ????
            return?true;
            }

            bool?RemoteLoadDLL(DWORD?dwProcessID,?const?char*?pszDLLPath)
            {
            ????typedef?HMODULE?(WINAPI?
            *LoadLibraryPointor)(LPCTSTR);
            ????LoadLibraryPointor?pfnLoadLibrary?
            =?NULL;
            ????HMODULE?hKernel32?
            =?NULL;
            ????
            ????
            //Get?address?to?LoadLibrary?and?FreeLibrary
            ????if?(pfnLoadLibrary?==?NULL)?
            ????{
            ????????hKernel32?
            =?::GetModuleHandle("kernel32.dll");
            ????????
            ????????
            if?(?hKernel32?==?NULL?)
            ????????{
            ????????????
            return?false;????????????
            ????????}
            ????????
            ????????pfnLoadLibrary?
            =?(LoadLibraryPointor)GetProcAddress(hKernel32,?"LoadLibraryA");
            ????????
            ????????
            if?(pfnLoadLibrary?==?NULL)
            ????????{
            ????????????::FreeLibrary(hKernel32);
            ????????????
            return?false;
            ????????}
            ????}

            ????
            if(?!EnablePrivilege(SE_DEBUG_NAME,?true)?)
            ????????
            return?false;

            ????HANDLE?process?
            =?::OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ|PROCESS_QUERY_INFORMATION,?TRUE,?dwProcessID);
            ????
            if?(?process?==?NULL?)
            ????{
            ????????::EnablePrivilege(SE_DEBUG_NAME,?
            false);
            ????????
            return?false;
            ????}

            ????PVOID?memory?
            =?::VirtualAllocEx(process,?NULL,?strlen(pszDLLPath)+1,?MEM_COMMIT,?PAGE_READWRITE);
            ????
            ????
            if?(?memory?==?NULL?)
            ????{
            ????????::EnablePrivilege(SE_DEBUG_NAME,?
            false);
            ????????::CloseHandle(process);
            ????????
            return?false;
            ????}

            ????
            if?(?FALSE?==?::WriteProcessMemory(process,?memory,?(LPVOID)pszDLLPath,?strlen(pszDLLPath)+1,?NULL)?)
            ????{
            ????????::EnablePrivilege(SE_DEBUG_NAME,?
            false);
            ????????::VirtualFreeEx(process,?memory,?strlen(pszDLLPath)
            +1,?MEM_RELEASE);
            ????????::CloseHandle(process);
            ????????
            return?false;
            ????}

            ????
            //?Inject?Code
            ????DWORD?dwThreadID?=?0;
            ????HANDLE?hRemoteHandle?
            =?::CreateRemoteThread(process,?NULL,?0,?(LPTHREAD_START_ROUTINE)pfnLoadLibrary,?memory,?0,?&dwThreadID);

            ????
            if?(?hRemoteHandle?==?NULL?)?
            ????{
            ????????::EnablePrivilege(SE_DEBUG_NAME,?
            false);
            ????????::VirtualFreeEx(process,?memory,?strlen(pszDLLPath)
            +1,?MEM_RELEASE);
            ????????::CloseHandle(process);
            ????????
            return?false;
            ????}

            ????::WaitForSingleObject(hRemoteHandle,?INFINITE);

            ????DWORD?dwReturn?
            =?0;
            ????
            if(?FALSE?==?::GetExitCodeThread(hRemoteHandle,?&dwReturn)?)
            ????{
            ????????::EnablePrivilege(SE_DEBUG_NAME,?
            false);
            ????????::CloseHandle(hRemoteHandle);
            ????????::VirtualFreeEx(process,?memory,?strlen(pszDLLPath)
            +1,?MEM_RELEASE);
            ????????::CloseHandle(process);
            ????????
            return?false;
            ????}

            ????::EnablePrivilege(SE_DEBUG_NAME,?
            false);
            ????::CloseHandle(hRemoteHandle);
            ????::VirtualFreeEx(process,?memory,?strlen(pszDLLPath)
            +1,?MEM_RELEASE);
            ????::CloseHandle(process);
            ????::FreeLibrary(hKernel32);

            ????
            if(?dwReturn?==?NULL?)
            ????????
            return?false;
            ????
            else
            ????????
            return?true;????
            }

            HMODULE?GetProcessModule(DWORD?dwPID,?LPCTSTR?czDllName)?
            {?
            ????HMODULE????????hMod???????
            =?NULL;
            ????BOOL??????????bFound??????
            =?FALSE;?
            ????HANDLE????????hModuleSnap?
            =?NULL;?
            ????MODULEENTRY32?me32????????
            =?{0};?

            ????
            //?Take?a?snapshot?of?all?modules?in?the?specified?process.?
            ????hModuleSnap?=?CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,?dwPID);?
            ????
            if?(hModuleSnap?==?INVALID_HANDLE_VALUE)?
            ????????
            return?(FALSE);?

            ????
            //?Fill?the?size?of?the?structure?before?using?it.?

            ????me32.dwSize?
            =?sizeof(MODULEENTRY32);?

            ????
            //?Walk?the?module?list?of?the?process,?and?find?the?module?of?
            ????
            //?interest.?Then?copy?the?information?to?the?buffer?pointed?
            ????
            //?to?by?lpMe32?so?that?it?can?be?returned?to?the?caller.?
            ????if?(Module32First(hModuleSnap,?&me32))?
            ????{?
            ????????
            do?
            ????????{?
            ????????????
            if(0?==?lstrcmpi(czDllName,?me32.szExePath))
            ????????????{
            ????????????????hMod?
            =?me32.hModule;
            ????????????}
            ????????}?
            ????????
            while?(hMod?==?NULL?&&?Module32Next(hModuleSnap,?&me32));?
            ????}?
            ????
            else?
            ????{
            ????????hMod?
            =?NULL;???????????//?could?not?walk?module?list?
            ????}

            ????
            //?Do?not?forget?to?clean?up?the?snapshot?object.?
            ????CloseHandle(hModuleSnap);?

            ????
            return?hMod;?
            }

            bool?RemoteUnLoadDLL(DWORD?dwProcessID,?const?char*?pszDLLPath)
            {
            ????typedef?BOOL?(WINAPI?
            *FreeLibraryFunType)(HMODULE?hModule);
            ????FreeLibraryFunType?pfnFreeLibrary?
            =?NULL;
            ????HMODULE?hKernel32?
            =?NULL;
            ????
            ????
            //Get?address?to?FreeLibrary
            ????if?(pfnFreeLibrary?==?NULL)?
            ????{
            ????????hKernel32?
            =?::GetModuleHandle("kernel32.dll");
            ????????
            ????????
            if?(?hKernel32?==?NULL?)
            ????????{
            ????????????
            return?false;????????????
            ????????}
            ????????
            ????????pfnFreeLibrary?
            =?(FreeLibraryFunType)GetProcAddress(hKernel32,?"FreeLibrary");
            ????????
            ????????
            if?(pfnFreeLibrary?==?NULL)
            ????????{
            ????????????::FreeLibrary(hKernel32);
            ????????????
            return?false;
            ????????}
            ????}

            ????
            if(?!EnablePrivilege(SE_DEBUG_NAME,?true)?)
            ????????
            return?false;

            ????HANDLE?process?
            =?::OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ|PROCESS_QUERY_INFORMATION,?TRUE,?dwProcessID);
            ????
            if?(?process?==?NULL?)
            ????{
            ????????::EnablePrivilege(SE_DEBUG_NAME,?
            false);
            ????????
            return?false;
            ????}

            ????HMODULE?hUnloadDll?
            =?GetProcessModule(dwProcessID,?pszDLLPath);

            ????
            if(?hUnloadDll?==?NULL?)
            ????????
            return?true;

            ????
            //?Inject?Code
            ????DWORD?dwThreadID?=?0;
            ????HANDLE?hRemoteHandle?
            =?::CreateRemoteThread(process,?NULL,?0,?(LPTHREAD_START_ROUTINE)pfnFreeLibrary,?(LPVOID)hUnloadDll,?0,?&dwThreadID);

            ????
            if?(?hRemoteHandle?==?NULL?)?
            ????{
            ????????::EnablePrivilege(SE_DEBUG_NAME,?
            false);
            ????????::CloseHandle(process);
            ????????
            return?false;
            ????}

            ????::WaitForSingleObject(hRemoteHandle,?INFINITE);

            ????DWORD?dwReturn?
            =?0;
            ????
            if(?FALSE?==?::GetExitCodeThread(hRemoteHandle,?&dwReturn)?)
            ????{
            ????????::EnablePrivilege(SE_DEBUG_NAME,?
            false);
            ????????::CloseHandle(hRemoteHandle);
            ????????::CloseHandle(process);
            ????????
            return?false;
            ????}

            ????::EnablePrivilege(SE_DEBUG_NAME,?
            false);
            ????::CloseHandle(hRemoteHandle);
            ????::CloseHandle(process);
            ????::FreeLibrary(hKernel32);

            ????
            if(?dwReturn?==?FALSE?)
            ????????
            return?false;
            ????
            else
            ????????
            return?true;
            }

            目前存在的已知問題:
            1. 未考慮 64 位機器
            2. 未考慮 DLL 加載失敗的處理 (2010.02.05-23:38 已經 Fixed)
            3. 提權后沒有恢復 (2010.02.07-17:15 已經Fixed)
            4. 在?RemoteUnloadDLL 時,采用的是重定位DLL句柄的方法,有人跟我反應這種方法不安全,但我暫時還沒想到什么情況下會引發問題。


            目標程序的輸出結果是:
            DLL_PROCESS_ATTACH C:\Documents and Settings\Administrator\桌面\demo\test\Debug\test.exe
            DLL_THREAD_DETACH C:\Documents and Settings\Administrator\桌面\demo\test\Debug\test.exe
            The thread 0x878 has exited with code 13500416 (0xCE0000).
            DLL_THREAD_ATTACH C:\Documents and Settings\Administrator\桌面\demo\test\Debug\test.exe
            DLL_PROCESS_DETACH C:\Documents and Settings\Administrator\桌面\demo\test\Debug\test.exe
            The thread 0x624 has exited with code 1 (0x1).

            (開始不明白,結果看了
            DLL_THREAD_DETACH 認識誤區后就明白了)

            又一天就這么過去了~

            Feedback

            # re: about Injection (2)  回復  更多評論   

            2010-02-08 19:32 by 樂蜂網官方網站
            偶滴愛哦上帝哦啊

            # re: about Injection (2)  回復  更多評論   

            2010-02-08 19:51 by DrKN
            呵..有點冒犯 真對不起
            因為之前那篇都見到你打算給人想到是shutdown跟提權之類 感覺變得像blackpaper
            亚洲а∨天堂久久精品| 午夜不卡888久久| 久久久久一级精品亚洲国产成人综合AV区 | 久久综合九色综合精品| 午夜天堂av天堂久久久| 99久久国产宗和精品1上映| 久久这里都是精品| 久久综合色老色| 色综合久久中文字幕无码| 久久久久人妻精品一区二区三区| 欧美一区二区三区久久综合| 久久久久亚洲AV无码专区体验| 国产精品久久久久久吹潮| 欧美亚洲另类久久综合| 久久亚洲精品无码播放| 久久精品国产AV一区二区三区| 色综合久久无码五十路人妻| 国产精品一久久香蕉产线看 | 99久久人妻无码精品系列蜜桃| 久久精品国产清高在天天线| 国产福利电影一区二区三区久久久久成人精品综合 | 久久精品免费大片国产大片| 久久久久亚洲AV无码专区网站| 亚洲国产高清精品线久久| 久久精品日日躁夜夜躁欧美| 国产一久久香蕉国产线看观看| 国内精品久久久久久中文字幕| 久久无码专区国产精品发布| av无码久久久久久不卡网站 | 99麻豆久久久国产精品免费| 狠狠色伊人久久精品综合网| 久久亚洲国产最新网站| 国产精品无码久久久久久| 久久综合色之久久综合| 久久99精品久久久久婷婷| 精品国产乱码久久久久久浪潮| 久久精品国产亚洲av麻豆蜜芽 | 99久久精品免费看国产一区二区三区 | 无码国内精品久久人妻蜜桃| 久久久久一级精品亚洲国产成人综合AV区| 久久亚洲AV成人无码|