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

saiksy

記錄生活中的點點滴滴

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  13 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks
RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,1,0,NULL);

這個函數(shù)封裝在NtDll.dll中(在所有DLL加載之前加載),被微軟嚴(yán)格保密,就是說你在MSDN上查不到關(guān)于他的任何信息。

.常量 SE_BACKUP_PRIVILEGE, 
"17", 公開
.常量 SE_RESTORE_PRIVILEGE, 
"18", 公開
.常量 SE_SHUTDOWN_PRIVILEGE, 
"19", 公開
.常量 SE_DEBUG_PRIVILEGE, 
"20", 公開


先來看看這個函數(shù)的定義(Winehq給出):
NTSTATUS RtlAdjustPrivilege
(
ULONG    Privilege,
BOOLEAN Enable,
BOOLEAN CurrentThread,
PBOOLEAN Enabled
)

參數(shù)的含義:
Privilege [In] Privilege index to change.                         
// 所需要的權(quán)限名稱,可以到MSDN查找關(guān)于Process Token & Privilege內(nèi)容可以查到

Enable [In] If TRUE, then enable the privilege otherwise disable. 
// 如果為True 就是打開相應(yīng)權(quán)限,如果為False 則是關(guān)閉相應(yīng)權(quán)限

CurrentThread [In] If TRUE, then enable 
in calling thread, otherwise process. 
// 如果為True 則僅提升當(dāng)前線程權(quán)限,否則提升整個進程的權(quán)限

Enabled [Out] Whether privilege was previously enabled or disabled.
// 輸出原來相應(yīng)權(quán)限的狀態(tài)(打開 | 關(guān)閉)


很多人大概沒有聽說過他的大名,但是相信有很多人見過進程提權(quán)的過程
拷一段我寫的提權(quán)上來吧

BOOL ImproveProcPriv()
{
    HANDLE token;
    
//提升權(quán)限
    if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&token))
    
{
        MessageBox(NULL,
"打開進程令牌失敗","錯誤",MB_ICONSTOP);
        
return FALSE;
    }

    TOKEN_PRIVILEGES tkp;
    tkp.PrivilegeCount 
= 1;
    ::LookupPrivilegeValue(NULL,SE_DEBUG_NAME,
&tkp.Privileges[0].Luid);
    tkp.Privileges[
0].Attributes = SE_PRIVILEGE_ENABLED;
    
if(!AdjustTokenPrivileges(token,FALSE,&tkp,sizeof(tkp),NULL,NULL))
    
{
        MessageBox(NULL,
"調(diào)整令牌權(quán)限失敗","錯誤",MB_ICONSTOP);
        
return FALSE;
    }

    CloseHandle(token);
    
return TRUE;
}



看看吧,這個提權(quán)快要累死了

但是 如果有這個函數(shù)就不一樣了,你可以只用一個函數(shù)就實現(xiàn)這個功能,甚至功能遠多于上面的代碼

通過恰當(dāng)?shù)腎DE設(shè)置和必要的Defination,上面這個函數(shù)的功能你完全可以通過一行代碼來實現(xiàn)。

RtlAdjustPrivilege(SE_DEBUG_NAME,
1,0,NULL);


正文:

下面我們看一下這個函數(shù)是怎么運行的,順便學(xué)習(xí)下強大的IDA
IDA 載入ntdll.dll (我這里載入的是 WinDBG自動下載的 Symbol里面的英文版本 可能不同的Windows版本略有不同)


先把函數(shù)的原型給輸入IDA 方便一下閱讀,然后開始閱讀匯編代碼了(黨和國家考驗我們的時候到了)。
看看Graph View 真的是很牛啊 
看看函數(shù)最開頭

mov     edi, edi        ; 這句話是廢指令
push    ebp
mov     ebp, esp
sub     esp, 30h        ; 48個字節(jié)的子過程域Auto變量
cmp     [ebp
+CurrentThread], 1 ; 判斷CurrentThread參數(shù)是否被指定為1
mov     eax, dword_7C97B0C8
mov     [ebp
+var_4], eax
mov     eax, [ebp
+Enabled]
mov     [ebp
+IsEnabled], eax ; BOOL *IsEnabled = Enabled;
lea     eax, [ebp
+var_28]
push    eax
jz      loc_7C93378B


判斷是調(diào)整進程權(quán)限還是線程權(quán)限,
CurrentThread 
== TRUE
push    
0
push    28h             ; TOKEN_ADJUST_PRIVILEGES 
| TOKEN_QUERY
push    0FFFFFFFEh      ; GetCurrentThread()
call    ZwOpenThreadToken
jmp     loc_7C929A7A


CurrentThread 
== FALSE
push    28h             ; TOKEN_ADJUST_PRIVILEGES 
| TOKEN_QUERY
push    0FFFFFFFFh      ; GetCurrentProcess()
call    NtOpenProcessToken


然后兩個代碼塊同時指向這里
loc_7C929A7A:           ; 很明白了吧 判斷進程
/線程令牌是否成功被打開
test    eax, eax
jl      
short loc_7C929AE4 ; 沒成功則跳


若 執(zhí)行成功

mov     eax, [ebp
+Privilege]
mov     [ebp
+dwPrivilege], eax
mov     al, [ebp
+Enable]
xor     ecx, ecx        ; ecx清零
neg     al
push    esi
mov     [ebp
+NewState], 1
mov     [ebp
+var_C], ecx
sbb     eax, eax
and     eax, 
2
mov     [ebp
+var_8], eax
lea     eax, [ebp
+ReturnLength] ; 實際返回長度
push    eax
lea     eax, [ebp
+OldState]
push    eax             ; 舊的特權(quán) 指針
push    10h             ; 
sizeof(TOKEN_PRIVILEGES)
lea     eax, [ebp
+NewState]
push    eax             ; 新的特權(quán) 指針
push    ecx             ; FALSE 因為上面有xor ecx,ecx
push    [ebp
+TokenHandle]
call    NtAdjustPrivilegesToken ; 調(diào)用 AdjustPrivilegesToken提權(quán)
push    [ebp
+TokenHandle]
mov     esi, eax        ; eax備份
call    ZwClose         ; 關(guān)閉 內(nèi)核對象句柄
cmp     esi, 106h       ; 判斷NtAdjustPrivilege執(zhí)行情況 106h 
= STATUS_NOT_ALL_ASSIGNED
jz      loc_7C947DF2

判斷是否執(zhí)行成功之后,開始輸出最后一個參數(shù)

cmp     [ebp
+OldState], 0
mov     ecx, [ebp
+IsEnabled]
jnz     loc_7C929E99


若 OldState 
!= 0 則

mov     al, [ebp
+Enable]         ; 應(yīng)該很明顯了 把Enable變量賦給al 也就是eax最后兩位


若 OldState 
== 0 則

mov     eax, [ebp
+var_18]
shr     eax, 
1
and     al, 
1
jmp     loc_7C929ADF


這個函數(shù)大致流程就是這樣。

到這里差不多可以按一下傳說中的F5了


int __stdcall RtlAdjustPrivilege(int Privilege, char Enable, char CurrentThread, int Enabled)
{
int result; // eax@2
signed int AdjustResult; // esi@4
char returnValue; // al@7
int v7; // [sp+2Ch] [bp-4h]@1
int IsEnabled; // [sp+4h] [bp-2Ch]@1
int TokenHandle; // [sp+8h] [bp-28h]@2
int dwPrivilege; // [sp+20h] [bp-10h]@4
signed int NewState; // [sp+1Ch] [bp-14h]@4
int v12; // [sp+24h] [bp-Ch]@4
int v13; // [sp+28h] [bp-8h]@4
int OldState; // [sp+Ch] [bp-24h]@4
char ReturnLength; // [sp+0h] [bp-30h]@4
unsigned int v16; // [sp+18h] [bp-18h]@11

v7 
= dword_7C97B0C8;
IsEnabled 
= Enabled;
if ( CurrentThread == 1 )
    result 
= ZwOpenThreadToken(-2400&TokenHandle);
else
    result 
= NtOpenProcessToken(-140&TokenHandle);
if ( result >= 0 )
{
    dwPrivilege 
= Privilege;
    NewState 
= 1;
    v12 
= 0;
    v13 
= -(Enable != 0& 2;
    AdjustResult 
= NtAdjustPrivilegesToken(TokenHandle, 0&NewState, 16&OldState, &ReturnLength);
    ZwClose(TokenHandle);
    
if ( AdjustResult == 262 )
      AdjustResult 
= -1073741727;
    
if ( AdjustResult >= 0 )
    
{
      
if ( OldState )
        returnValue 
= (v16 >> 1& 1;
      
else
        returnValue 
= Enable;
      
*(_BYTE *)IsEnabled = returnValue;
    }

    result 
= AdjustResult;
}

return result;
}

可讀性好像仍然不高,看看這個


/******************************************************************************
* RtlAdjustPrivilege          [NTDLL.@]
*
* Enables or disables a privilege from the calling thread or process.
*
* PARAMS
* Privilege     [I] Privilege index to change.
* Enable        [I] If TRUE, then enable the privilege otherwise disable.
* CurrentThread [I] If TRUE, then enable in calling thread, otherwise process.
* Enabled       [O] Whether privilege was previously enabled or disabled.
*
* RETURNS
* Success: STATUS_SUCCESS.
* Failure: NTSTATUS code.
*
* SEE ALSO
* NtAdjustPrivilegesToken, NtOpenThreadToken, NtOpenProcessToken.
*
*/

NTSTATUS WINAPI
RtlAdjustPrivilege(ULONG Privilege,
                   BOOLEAN Enable,
                   BOOLEAN CurrentThread,
                   PBOOLEAN Enabled)
{
    TOKEN_PRIVILEGES NewState;
    TOKEN_PRIVILEGES OldState;
    ULONG ReturnLength;
    HANDLE TokenHandle;
    NTSTATUS Status;

    TRACE(
"(%d, %s, %s, %p)\n", Privilege, Enable ? "TRUE" : "FALSE",
        CurrentThread 
? "TRUE" : "FALSE", Enabled);

    
if (CurrentThread)
    
{
        Status 
= NtOpenThreadToken(GetCurrentThread(),
                                   TOKEN_ADJUST_PRIVILEGES 
| TOKEN_QUERY,
                                   FALSE,
                                   
&TokenHandle);
    }

    
else
    
{
        Status 
= NtOpenProcessToken(GetCurrentProcess(),
                                    TOKEN_ADJUST_PRIVILEGES 
| TOKEN_QUERY,
                                    
&TokenHandle);
    }


    
if (!NT_SUCCESS(Status))
    
{
        WARN(
"Retrieving token handle failed (Status %x)\n", Status);
        
return Status;
    }


    OldState.PrivilegeCount 
= 1;

    NewState.PrivilegeCount 
= 1;
    NewState.Privileges[
0].Luid.LowPart = Privilege;
    NewState.Privileges[
0].Luid.HighPart = 0;
    NewState.Privileges[
0].Attributes = (Enable) ? SE_PRIVILEGE_ENABLED : 0;

    Status 
= NtAdjustPrivilegesToken(TokenHandle,
                                     FALSE,
                                     
&NewState,
                                     
sizeof(TOKEN_PRIVILEGES),
                                     
&OldState,
                                     
&ReturnLength);
    NtClose (TokenHandle);
    
if (Status == STATUS_NOT_ALL_ASSIGNED)
    
{
        TRACE(
"Failed to assign all privileges\n");
        
return STATUS_PRIVILEGE_NOT_HELD;
    }

    
if (!NT_SUCCESS(Status))
    
{
        WARN(
"NtAdjustPrivilegesToken() failed (Status %x)\n", Status);
        
return Status;
    }


    
if (OldState.PrivilegeCount == 0)
        
*Enabled = Enable;
    
else
        
*Enabled = (OldState.Privileges[0].Attributes & SE_PRIVILEGE_ENABLED);

    
return STATUS_SUCCESS;
}


posted on 2011-05-08 17:22 saiksy 閱讀(776) 評論(0)  編輯 收藏 引用 所屬分類: 技術(shù)雜項

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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>
            欧美日本高清视频| 欧美成人激情视频| 小黄鸭精品密入口导航| 99综合精品| 久久综合色婷婷| 亚洲精品视频免费| 国内精品视频在线播放| 久久精品二区| 国产一二三精品| 这里是久久伊人| 欧美一区二区精美| 裸体一区二区三区| 老司机午夜精品| 国产一区二区三区在线观看免费 | 欧美激情五月| 欧美一区在线直播| 久久精品成人欧美大片古装| 国产精品观看| 亚洲在线观看| 欧美日韩成人一区| 欧美顶级大胆免费视频| 亚洲精品久久久久久久久久久久久 | 国产亚洲视频在线| 在线观看一区| 亚洲精品久久久久久久久久久久| 欧美四级伦理在线| 午夜日韩av| 久久久www成人免费精品| 欧美在线播放一区| 欧美一区二区三区在线观看视频 | 国产精品国码视频| 一区二区三区国产| 国产精品亚洲综合久久| 欧美一区二区三区在线看| 久久精品国产免费看久久精品| 亚洲小视频在线观看| 亚洲精品久久久久久久久久久久 | 亚洲第一狼人社区| 午夜一区在线| 欧美影视一区| 国内欧美视频一区二区| 午夜精品久久久久久99热软件| 欧美亚洲日本一区| 亚洲一区二区高清视频| 午夜精品婷婷| 欧美激情bt| 亚洲精品乱码久久久久久按摩观| 在线观看亚洲一区| 国内久久视频| 中文高清一区| 欧美在线黄色| 欧美在线观看网站| 欧美成人激情视频免费观看| 欧美一区二区三区婷婷月色| 国产一区二区久久久| 99精品视频免费全部在线| 亚洲一区二区三区在线观看视频 | 国产一区二区三区日韩| 亚洲男人的天堂在线| 一区二区三区在线不卡| 国产美女扒开尿口久久久| 新狼窝色av性久久久久久| 噜噜爱69成人精品| 亚洲动漫精品| 久久久久九九九九| 亚洲专区一区二区三区| 国产综合一区二区| 欧美日韩在线看| 久久美女性网| 欧美一区二区三区免费视| 亚洲欧美日韩国产一区| 欧美电影免费观看网站| 欧美国产精品v| 欧美日韩国产区| 亚洲一区二区精品视频| 久久se精品一区精品二区| 99精品99久久久久久宅男| 免费高清在线视频一区·| 亚欧成人在线| 午夜视频一区| 亚洲免费观看高清在线观看| 国产精品三上| 国产午夜精品一区理论片飘花| 国产伦理精品不卡| 国产精品超碰97尤物18| 亚洲黑丝在线| 国产精品一区二区在线观看| 欧美激情一区二区三区四区| 国产精品狠色婷| 国模大胆一区二区三区| 99国产一区| 欧美99久久| 香蕉久久一区二区不卡无毒影院| 一本久道久久综合婷婷鲸鱼| 日韩视频精品| 久久黄金**| 欧美日本亚洲视频| 国产精品蜜臀在线观看| 欧美伦理91i| 亚洲夫妻自拍| 亚洲自拍偷拍麻豆| 亚洲欧洲精品天堂一级| 欧美在线观看一区| 亚洲激情女人| 欧美91福利在线观看| 在线亚洲+欧美+日本专区| 久久久久久九九九九| 国产一区二区三区直播精品电影 | 国产欧美一区二区精品性| 亚洲成人在线免费| 欧美一区二区三区四区在线| 午夜精品免费在线| 亚洲国产成人av好男人在线观看| 亚洲第一在线视频| 性做久久久久久免费观看欧美| 欧美日产国产成人免费图片| 亚洲高清视频的网址| 亚洲国产精品一区| 欧美成人精品| 欧美日韩一区在线观看视频| 在线亚洲美日韩| 亚洲国产日韩一级| 久久九九热re6这里有精品| 国产欧美精品一区二区色综合| 欧美激情一区三区| 亚洲国产精品第一区二区三区| 香蕉免费一区二区三区在线观看| 欧美一区二区在线看| 国产日产精品一区二区三区四区的观看方式 | 久久综合九色综合网站| 亚洲大片精品永久免费| 日韩亚洲一区二区| 国产一区高清视频| 中国亚洲黄色| 欧美一区二区三区在| 国产精品影片在线观看| 欧美黄色一区| 亚洲精品在线观| 久久永久免费| 久久久999国产| 国模一区二区三区| 99精品热视频| 精品电影一区| 欧美成人免费小视频| 91久久久久久国产精品| 国产精品美女一区二区在线观看| 日韩视频一区二区三区在线播放| 宅男精品视频| 99精品视频一区二区三区| 亚洲精品综合| 欧美1区免费| 一本色道久久综合狠狠躁篇怎么玩| 日韩视频在线你懂得| 麻豆乱码国产一区二区三区| 一区二区三区日韩精品| 国产精品乱码久久久久久| 日韩系列在线| 欧美日本韩国| 久久精品九九| 免费看的黄色欧美网站| 狠狠久久亚洲欧美专区| 国产精品久久久久久久久久尿| 亚洲欧美成人网| 国产欧美日韩在线观看| 久久成人精品视频| 欧美高清一区二区| 午夜在线不卡| 亚洲第一福利视频| 久久亚洲欧洲| 欧美一区二区黄色| 亚洲免费网站| 国产一区二区三区不卡在线观看| 免费在线欧美视频| 亚洲在线观看免费| 欧美 日韩 国产一区二区在线视频 | 亚洲精品久久久久久久久| 久久亚洲精品一区二区| 亚洲一区观看| 亚洲人成77777在线观看网| 亚洲天堂成人在线观看| 久久久精品日韩欧美| 久久久亚洲国产美女国产盗摄| 日韩亚洲视频| 性做久久久久久久久| 中文在线资源观看网站视频免费不卡 | 国产一区二区无遮挡| 麻豆精品精华液| 久久久精品日韩欧美| 久久成人免费日本黄色| 中文久久乱码一区二区| 亚洲激精日韩激精欧美精品| 亚洲国产精品久久| 久久久精品2019中文字幕神马| 国产精品黄视频| 亚洲免费电影在线观看| 欧美一区二区在线观看| 欧美伊人久久| 久久精品国产久精国产思思| 久久久午夜精品| 亚洲丰满在线|