如何修改執行緒的Access Token

2021-09-06 02:47:05 字數 3728 閱讀 8323

什麼是access token

access token

用來標識乙個使用者,其中包括使用者的

sid和使用者所屬組的

sid,還包括這個使用者和所屬使用者組的所擁有的許可權列表。

當使用者輸入使用者名稱和密碼登陸到

windows

之後,windows

會建立乙個

acess token

,用來標識這個使用者。

在這個使用者下建立的程序都將得到乙份這個

access token

的備份。當程序需要訪問乙個可以加密的物件(如檔案,事件等)時,

windows

利用這個

access token

來跟物件的

security descriptor

進行比較,以確認這個程序是否有許可權來訪問這個物件。(關於

sid和

security descriptor

請參閱其他資料)

2.執行緒的access token

程序被建立時,從系統中得到

access token

是屬於程序,執行緒剛開始建立的時候並沒有

access token

。我們可以通過乙個叫

impersonate

的方法賦予執行緒乙個

access token

,這樣就使得執行緒具有跟程序不同的

access token

,用來完成一些使用程序的

access token

無法完成的任務。

impersonate

一般用於

client/server

模式中,

client

傳送乙個請求訪問服務期內的資源,如果

server

接到請求後直接去訪問資源的話,可能會導致

server

無法控制

client

可以訪問哪些資源。

windows

提供了impersonate

這種解決方案,

server

的乙個執行緒可以

impersonate client

,這樣這個執行緒就將以

client

的身份來訪問資源,從而可以直接控制

client

是否可以訪問資源。

3.impersonate

的方法 有以下幾個函式可以實現

impersonate

a)ddeimpersonateclient

用於在dde

中impersonate

b)impersonatenamedpipeclient

用於在namedpipe

中impersonate

c)impersonateloggedonuser

利用access token

來impersonate

d)impersonateself

利用程序的

access token

來impersonate

e)setthreadtoken

使用access token

來impersonate

其他的執行緒

f)rpcimpersonateclient

用於在rpc

中impersonate

g)impersonatesecuritycontext

用於在security package

中impersonate

4.利用impersonateloggedonuser

來實現impersonate

其他的一些

impersonate

的方法大都是使用在特定的環境下,

impersonateloggedonuser

則僅需要有使用者的

access token

就可以。

獲取使用者的

access token

有兩種方法

a)利用logonasuser

,通過輸入使用者名稱,密碼,域資訊來獲取使用者的

access token

b)利用openprocesstoken

來直接程序的

access token

5.例子 下面乙個利用

impersonateloggedonuser

來實現impersonate

的例子。

bool impersonate(lpcstr szfilename)

函式中,輸入引數為需要

impersonate

的程序名,比如說

explorer.exe

int main()

; getversionex(&os);

if(os.dwmajorversion >= 6 )

} bool impersonate(lpcstr szfilename)

bresult = impersonateloggedonuser(htoken);

break;

} return bresult;

} dword getactiveconsolesessionid()

; getversionex(&os);

if(os.dwmajorversion == 5 && os.dwminorversion==0)

else

} while(false);

if(hkernal32 != null)

freelibrary(hkernal32);

return dwresult;}

dword getpidofspecifiedsession(dword dwsessionid, lpctstr lpprocessname,

lpctstr lpusername)

// dump each process description

for (dword dwindex = 0; dwindex < dwprocesscount;

dwindex++)

; dword chuser = max_path;

tchar szdomain[max_path] = ;

dword chdomain = max_path;

sid_name_usesnu;

if(!lookupaccountsid(null, lpprocessinfo[dwindex].pusersid, szuser,

&chuser, szdomain, &chdomain, &snu))

dbgprint("szuser:%s, lpusername:%s", szuser, lpusername);

if(lstrcmpi(szuser, lpusername) != 0)

}dwret = lpprocessinfo[dwindex].processid;

break;

}//end of for loop

}while(false);

if(lpprocessname != null)

return dwret;

}

linux修改執行緒優先順序

linux核心的三種排程策略 1,sched other 分時排程策略,2,sched fifo實時排程策略,先到先服務。一旦占用cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄 3,sched rr實時排程策略,時間片輪轉。當程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。...

主線程呼叫(通過修改執行緒上下文實現)

思路 將主線程掛起後獲取到主線程的eip,然後將eip修改為shellcode的位址恢復執行緒執行,當shellcode執行完成後跳轉到舊eip處繼續執行。1 typedef void stdcall pfn call const void pvin,void pvout 23 bool callf...

R3修改執行緒上下文EIP實現的無模組注入

include stdafx.h include include using std cin dword dwoldeip 0 dword funremote 0 byte shellcode 25 bool threadcontexttest dword dwprocessid,dword dwm...