什麼是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...