青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-60  評論-262  文章-1  trackbacks-0

說明: 前段時間找關于向系統進程注入鏈接庫的文章, 找到這篇, 加入收藏夾, 但后來這個連接死活打不開了. 就用 google 的 cache 功能將文章 A 在這里. 查閱方便.

For a while now, I've been searching for the optimal way to inject code into privileged Win32 processes like lsass.exe, csrss.exe, and winlogon.exe.

There are many functions such as the LSA and SAM exports that even users logged in with full administrative rights cannot execute
unless they do so under the context of one of these privileged processes.

There are a few tricks that I learned along the way.

First, it is necessary to adjust the token privileges of your program so that debugging (SE_PRIVILEGE_ENABLED) is allowed.

If you are injecting code into a lower privileged process, then this will not be needed.

Also, the target process will need to be opened with PROCESS_ALL_ACCESS rights.

Its all pretty easy on Windows 2000 and XP Service Pack 0 and 1.
On these systems, you can use the documented CreateRemoteThread() function, but first the code you want
to run in the security context of the remote process needs to exist in that process' virtual memory space.
You can put it there by using VirtualAllocEx() and WriteProcessMemory().

With XP SP2 and later (2003, Vista) some new security measures prevent the traditional CreateRemoteThread() function from working properly.
You should be able to open the process, allocate memory on its heap, and write data to the allocated region,
but when trying to invoke the remote thread, it will fail with ERROR_NOT_ENOUGH_MEMORY.

On Vista, I found that an author can substitute the CreateRemoteThread() call with NtCreateThreadEx() export from ntdll.dll
and it will allow for the thread to execute properly. This requires you to auto-detect the version of the operating system and
branch to this different call if on Vista.

Also, this is isn't really a universal solution, because NtCreateThreadEx() doesn't exist on pre-Vista sytsems.
So now we're stuck with using CreateRemoteThread() on 2000 and XP SP 0,1 and NtCreateThreadEx() on Vista.
This is already getting messy, and we still don't have a solution for XP SP2.

Also, the NtCreateThreadEx() function takes an undocumented structure, whose members can be initialized appropriately
by reversing other binaries that use the function, but it looks really ugly in source code since I don't really know what the members are for,
or why particular values are significant.

For XP SP2 I did a little debugging and found that inside CreateRemoteThread(), there is a call to ZwCreateThread() which is an export
from ntdll.dll. The call is made while specifying that the thread should start suspended, which it does properly,
however down the road still inside CreateRemoteThread() before ZwResumeThread() is called, there is a call to CsrClientCallServer()
which fails and eventually leads to the error message.

This behavior makes you wonder, if you can just call ZwCreateThread() directly, then the call to CsrClientCallServer() will be avoided
and the thread will execute. The problem is that ZwCreateThread() doesn't allow one to set the thread start address easily
(you have to configure the INITIAL_TEB members to set EIP to your start address using mostly undocumented structures and functions).

However, this all can be avoided by using the RtlCreateUserThread() function instead,
which configures and calls all the undocumented functions for you, and eventually invokes ZwCreateThread() with the result.
Although RtlCreateUserThread() is undocumented also, its hardly as complex as the rest and is pretty simple to use.

At this point, we can successfully execute remote threads into privileged processes across all target platforms,
but as mentioned before, its pretty messy.

We're using three different, largely undocumented functions and auto-detecting which one to use based on the OS version.

The better solution is to create a secondary program that adds a service object (your injector program)
to the service control manager database on the target system. Since you're administrator, which is required anyway,
you'll be able to add these entries and start the service. This will enable the injector program
to run with different access rights than normal code, and the traditional CreateRemoteThread()
will work properly on Windows 2000, all of XP, and 2003/Vista.

The API functions for adding and controlling the service are documented by MSDN and remain consistent across all of the platforms.

So, what is learned is that we can use a number of different functions to inject code into privileged remote processes,
including RtlCreateUserThread() on XP SP2, and NtCreateThreadEx() on Vista, but the optimal way is to install a temporary service
and allow CreateRemoteThread() to be the single API that accomplishes the task for all platforms.


PS:

Basically the needed access rights are identical to XP: In both OSs you need admin rights for system wide injection. However, in Vista when UAC is enabled even admin users don't have admin rights by default. So you need to right click your exe and choose "run as administrator" (as LeVuHoang has already said). Alternatively you can add a manifest to your exe which will tell Vista that your app needs admin rights. If you do that, you don't need to do the "run as admin" step, anymore. However, the end user will still have to confirm the operation. If you don't like all this you need to inject from a service (see HookProcessTermination demo).

One other thing to look for is that the hook dll needs enough NTFS rights or else it might not be injected into all processes successfully. Vista is a bit more strict there than XP was.

void Inject(HWND hWnd, char* strDll)
{
    GetWindowThreadProcessId(hWnd, 
&pId);
    HANDLE hProcess 
= OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
    LPVOID lpRemoteAddress 
= VirtualAllocEx(hProcess, NULL, strlen(strDll), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProcess, lpRemoteAddress, (LPVOID)strDll, strlen(strDll), NULL);
    CreateRemoteThread(hProcess, NULL, 
0,
        (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(
"Kernel32"), "LoadLibraryA"),
        lpRemoteAddress, 
0, NULL);


The API does not create threads in other sessions (this behavior is documented in MSDN).

One way to load a library into a process of another session is: Create a suspended thread (ntdll!RtlCreateUserThread) at kernel32!ExitThread, schedule an asynchronous procedure call (ntdll!NtQueueApcThread) at kernel32!LoadLibraryEx, resume the thread (kernel32!ResumeThread - this executes the pending APC), and wait for the end of the thread (kernel32!WaitForSingleObject). APCs do not return a value - therefore the return value of kernel32!LoadLibraryEx is lost. There is much more work required to use this method in the exact same manner as CreateRemoteThread(LoadLibrary) (includes reading the PEB’s loader structures).

Other hints:

    * Never ever use CreateRemoteThread on a target process that differs in 'bitness' (kernel32!IsWow64Process). On some Windows versions this freezes your calling thread.
    * Dynamically determine the kernel32’s image base (might not be loaded at all).

 


對于 RtlCreateUserThread 函數的線程函數, 以下是個示例:

#define LoadLibraryA_ADDR       0xDDDDDDDD 
#define RtlExitUserThread_ADDR  0xEEEEEEEE 

static __declspec(naked) DWORD WINAPI ThreadDummy(LPVOID lpParam) 
{
    __asm { 
        push    dword ptr [esp+4]           ; // 將傳進來的線程函數的參數壓棧 
        mov     eax, LoadLibraryA_ADDR      ; // LoadLibraryA 或 FreeLibrary 函數的地址 
        call    eax                         ; // 調用 LoadLibraryA 函數
        push    eax                         ; // 將 RtlExitUserThread 函數的參數壓棧
        mov     eax, RtlExitUserThread_ADDR ; // RtlExitUserThread 函數的地址 
        call    eax                         ; // 調用 RtlExitUserThread 函數
        ret     4                           ; // 返回 
    } 
}

static __declspec(naked) DWORD WINAPI ThreadDummy_end(LPVOID lpParam) 

    __asm { 
        ret     4                            ; 
    } 
}

PUCHAR FindDWordFromBuffer(PUCHAR lpBuffer, UINT cchMax, DWORD dwValue) 

    PUCHAR pResult 
= NULL; 
    UINT nIter 
= 0
    
for (nIter=0; nIter<cchMax; nIter++
    { 
        
if ( *(DWORD *)(lpBuffer + nIter) == dwValue ) { 
            pResult 
= lpBuffer + nIter; 
            
break
        } 
    } 
    
return pResult; 


BOOL BuildRemoteThreadCode(OUT PUCHAR lpCode, UINT cchMax, BOOL bInject) 

    UINT nCodeLen 
= 0
    PUCHAR pIter 
= NULL; 
    DWORD dwFnAddr 
= 0
    
    
if (NULL==lpCode || 0==cchMax) { 
        
return FALSE; 
    } 
    
    nCodeLen 
= (PUCHAR) &ThreadDummy_end - (PUCHAR) &ThreadDummy; 
    
if (nCodeLen > cchMax) { 
        
return FALSE; 
    } 
    
    memcpy((
void *)lpCode, (void *&ThreadDummy, nCodeLen); 
    
    {
        pIter 
= FindDWordFromBuffer(lpCode, nCodeLen, LoadLibraryA_ADDR); 
        
if (NULL == pIter) { 
            
return FALSE; 
        } 
        
        
if (bInject) { 
            dwFnAddr 
= (DWORD) GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "LoadLibraryA"); 
        } 
else { 
            dwFnAddr 
= (DWORD) GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "FreeLibrary"); 
        } 
        
        
if (0 == dwFnAddr) { 
            
return FALSE; 
        } 
        
*(DWORD *)pIter = dwFnAddr; 
    } 
    
    {
        pIter 
= FindDWordFromBuffer(lpCode, nCodeLen, RtlExitUserThread_ADDR); 
        
if (NULL == pIter) { 
            
return FALSE; 
        } 
        
        dwFnAddr 
= (DWORD) GetProcAddress(GetModuleHandle(_T("ntdll.dll")), "RtlExitUserThread"); 
        
if (0 == dwFnAddr) { 
            
return FALSE; 
        } 
        
*(DWORD *)pIter = dwFnAddr; 
    } 
    
    
return TRUE; 
}

自己分配一塊足夠大的內存, 以這塊內存的指針作為參數調用 BuildRemoteThreadCode 函數后, 這塊內存就可以寫到目標進程里面, 并作為 RtlCreateUserThread 函數的線程函數執行了.

當然, 線程函數的參數, 還是得自己準備了, 也就是一個字符串指針或一個模塊的 HMODULE. 相信大家都會, 不用我廢話了.

posted on 2008-06-18 17:31 free2000fly 閱讀(2413) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线亚洲欧美| 久久综合久久久| 久久精品免视看| 9色porny自拍视频一区二区| 欧美与黑人午夜性猛交久久久| 亚洲素人一区二区| 欧美成人精品三级在线观看| 久久国产免费| 国产精品久久久久999| 欧美成人日韩| 一区二区三区在线观看欧美| 亚洲女爱视频在线| 亚洲欧美区自拍先锋| 欧美另类高清视频在线| 欧美成人性生活| 精品999成人| 久久大香伊蕉在人线观看热2| 亚洲午夜一区二区| 欧美精品性视频| 亚洲国产精品va在线观看黑人| 国产视频在线一区二区| 欧美一区激情视频在线观看| 欧美午夜不卡| 一本久久青青| 亚洲欧美成人网| 国产精品久久久久久久9999| 日韩视频中文字幕| 亚洲视频综合| 国产伦精品一区二区三区高清版 | 亚洲色图制服丝袜| 欧美人与性禽动交情品| 91久久久国产精品| 夜夜爽av福利精品导航| 欧美日韩国产成人高清视频| 亚洲精品小视频| 亚洲小说欧美另类婷婷| 欧美图区在线视频| 亚洲主播在线| 久久久av水蜜桃| 影院欧美亚洲| 欧美精品成人在线| 在线亚洲免费| 久久综合五月天婷婷伊人| 黄色一区二区三区| 欧美a一区二区| av不卡在线观看| 欧美一区二区日韩一区二区| 国内久久婷婷综合| 欧美国产三区| 亚洲专区一区| 欧美a一区二区| 一区二区欧美在线| 国产精品私人影院| 久久精品一区二区国产| 亚洲激情图片小说视频| 亚洲欧美另类在线| 1024成人网色www| 欧美午夜精彩| 久久久久99| 99国产精品私拍| 久久久久久尹人网香蕉| 日韩亚洲在线| 久久大综合网| 欧美日韩美女一区二区| 亚洲欧美日韩一区二区三区在线观看 | 国产欧美日韩精品在线| 久热re这里精品视频在线6| 一区二区冒白浆视频| 久久亚洲高清| 亚洲综合三区| 亚洲欧洲视频在线| 国产欧美欧洲在线观看| 欧美精品乱码久久久久久按摩| 亚洲视频一区在线| 欧美激情亚洲国产| 久久精品国产亚洲一区二区| 日韩亚洲在线| 在线日韩中文| 国产日韩欧美在线一区| 欧美日韩在线第一页| 久久免费国产精品1| 亚洲欧美日本视频在线观看| 91久久在线| 美女露胸一区二区三区| 欧美一级视频精品观看| 一区二区三区高清不卡| 亚洲高清在线视频| 国语自产精品视频在线看一大j8 | 亚洲欧美999| 欧美国产日韩精品| 欧美在线观看你懂的| 亚洲午夜av电影| 亚洲激情网站| 激情欧美一区二区| 国产九区一区在线| 国产精品日韩电影| 国产精品高精视频免费| 欧美日韩国产综合在线| 欧美经典一区二区三区| 免费成人在线观看视频| 久久国产主播| 亚洲福利电影| 亚洲欧美在线aaa| 亚洲特级片在线| 一区二区三区国产精华| 日韩午夜剧场| 亚洲精选一区二区| 亚洲欧洲一区二区天堂久久| 久久深夜福利| 老司机aⅴ在线精品导航| 久久精品午夜| 老司机精品视频一区二区三区| 久久久精品国产99久久精品芒果| 性色av一区二区三区在线观看| 午夜免费日韩视频| 欧美一区二区三区的| 欧美在线看片| 老司机久久99久久精品播放免费| 久久乐国产精品| 免费亚洲电影在线| 亚洲高清影视| 一区二区三区回区在观看免费视频| 一本色道**综合亚洲精品蜜桃冫| 亚洲午夜电影网| 午夜精品久久久久久久白皮肤| 午夜精品视频在线观看一区二区| 亚洲一区观看| 久久精品综合一区| 欧美国产日本韩| 欧美涩涩网站| 国内精品伊人久久久久av影院| 亚洲国产高清在线观看视频| 亚洲精品中文字| 亚洲一区视频| 久久久久久久久久久久久女国产乱 | 一区二区日韩欧美| 午夜视频在线观看一区二区三区| 久久精品国产亚洲a| 欧美91精品| 国产精品你懂的| 在线电影国产精品| 在线亚洲欧美视频| 欧美中文字幕在线观看| 欧美高清在线观看| 一本色道久久综合| 久久国产一区二区三区| 欧美精品一区二区视频| 亚洲综合视频网| 亚洲福利视频网| 亚洲一区二区三区四区五区黄 | 久久不射网站| 欧美成人午夜影院| 亚洲一区二区三区中文字幕在线| 久久久久久国产精品mv| 欧美日韩国产精品一区| 国产日韩欧美一区在线| 亚洲美女一区| 久久久亚洲精品一区二区三区| 亚洲精华国产欧美| 性色一区二区| 欧美日韩精品伦理作品在线免费观看| 国产一区二区三区的电影| 99日韩精品| 欧美3dxxxxhd| 午夜精品久久久久久久男人的天堂| 麻豆久久婷婷| 黑人一区二区三区四区五区| 亚洲视频在线一区| 亚洲国产精品福利| 久久精品国产亚洲aⅴ| 国产精品欧美激情| 一区二区三区欧美激情| 蜜桃av一区二区| 欧美一二三区精品| 欧美激情综合色综合啪啪| 国产又爽又黄的激情精品视频| 亚洲欧美国产一区二区三区| 亚洲高清视频中文字幕| 久久不射2019中文字幕| 国产精品家教| 亚洲午夜成aⅴ人片| 91久久久亚洲精品| 老司机午夜精品视频| 国产一区二区三区日韩欧美| 亚洲欧美在线播放| 一区二区三区国产在线| 欧美日韩一二三区| 在线视频欧美精品| 亚洲欧洲一区| 欧美日韩亚洲综合一区| 在线亚洲一区| 亚洲美女毛片| 欧美精品久久99| 亚洲精品男同| 亚洲激情在线| 欧美精品久久一区| 在线亚洲观看| 亚洲一区二区三| 国产人久久人人人人爽| 久久精品在线|