以系統最高許可權執行軟體

2022-08-31 18:33:12 字數 4873 閱讀 1450

////////////////////

///說明:vc6編譯通過

//檔名:uac.h

//呼叫:uac(程序名,可執行檔案路徑);

////////////////////

#pragma once#include

#include

#include

typedef dword (winapi *wtsgetactiveconsolesessionidfunc)();

typedef bool (winapi *processidtosessionidfunc)(dword dwprocessid,dword*psessionid);

typedef bool (winapi *wtsqueryusertokenfunc)(ulong sessionid,phandle phtoken);

typedef bool (winapi *createenvironmentblockfunc)(lpvoid *lpenvironment,handle htoken,bool binherit);

wtsgetactiveconsolesessionidfunc wtsgetactiveconsolesessionid=null;

processidtosessionidfunc processidtosessionid=null;

wtsqueryusertokenfunc wtsqueryusertoken=null;

createenvironmentblockfunc createenvironmentblock=null;

//獲取所需函式位址

void

getfunc()}//

開啟本執行緒的sededebug許可權

bool

enabledebugprivilege()

//主函式

bool uac(char *processname,char *executefilepath)

; bool flag=false,bret=false

,bdacl,bdefdacl;

token_privileges tp;

lpvoid lpenv;

startupinfo si;

process_information pi;

explicit_access ea;

psecurity_descriptor porigsd=null,pnewsd=null;

pacl polddacl=null,pnewdacl=null,psacl=null;

psid psidowner=null,psidprimary=null;

//獲取所需函式

getfunc();

//開啟本執行緒許可權

enabledebugprivilege();

//baby,come on!

dwsessionid=wtsgetactiveconsolesessionid();

//查詢程序,獲取pid

); pe.dwsize=sizeof

(pe);

flag=process32first(hsnap,&pe);

while

(flag)

}flag=process32next(hsnap,&pe);

}//獲取使用者令牌

wtsqueryusertoken(dwsessionid,&husertoken);

hprocess=openprocess(process_all_access,false,pid);

if (!hprocess)

return

false;

if (!openprocesstoken(hprocess,read_control|write_dac,&htoken))

return

false;

//設定ace具有所有訪問許可權

zeromemory(&ea,sizeof

(explicit_access));

buildexplicitaccesswithname(&ea,"

everyone

",token_all_access,grant_access,0

);

//第一次呼叫肯定返回這個錯誤,這是為了得到原安全描述符 porigsd 的長度

if (!getkernelobjectsecurity(htoken,dacl_security_information,porigsd,0,&dwsdlen))

}//第二次呼叫得到安全描述符 porigsd

if (!getkernelobjectsecurity(htoken,dacl_security_information,porigsd,dwsdlen,&dwsdlen))

return

false;

//得到原安全描述符的訪問控制列表 acl

if (!getsecuritydescriptordacl(porigsd,&bdacl,&polddacl,&bdefdacl))

return

false;

//生成新 ace 許可權的訪問控制列表 acl

dwret=setentriesinacl(1,&ea,polddacl,&pnewdacl);

if (dwret!=error_success)

return

false;

//第一次呼叫肯定返回錯誤,為了建立新的安全描述符 pnewsd 而得到各項的長度

if (!makeabsolutesd(porigsd,pnewsd,&dwsdlen,polddacl,&dwaclsize,psacl,&dwsaclsize,psidowner,&dwsidownlen,psidprimary,&dwsidprimlen))

}//再次呼叫才可以成功建立新的安全描述符 pnewsd

if (!makeabsolutesd(porigsd,pnewsd,&dwsdlen,polddacl,&dwaclsize,psacl,&dwsaclsize,psidowner,&dwsidownlen,psidprimary,&dwsidprimlen))

return

false;

//將具有所有訪問許可權的訪問控制列表 pnewdacl 加入到新的 安全描述符 pnewsd 中

if (!setsecuritydescriptordacl(pnewsd,bdacl,pnewdacl,bdefdacl))

return

false;

//將新的安全描述符加到 token 中

if (!setkernelobjectsecurity(htoken, dacl_security_information, pnewsd))

return

false;

//再次開啟程序的 token,這時已經具有所有訪問許可權

if (!openprocesstoken( hprocess, token_all_access, &htoken))

return

false;

//複製令牌

if (!duplicatetokenex(htoken,maximum_allowed,null,securityidentification,tokenprimary,&hnewusertoken))

return

false;

//結束程序,危險,虛擬機器測試

//terminateprocess(hprocess,0);

//不虛擬登陸使用者的話,建立新程序會提示

impersonateloggedonuser(hnewusertoken);

//建立環境

if (createenvironmentblock(&lpenv,hnewusertoken,true))

dwcreateflags=normal_priority_class|create_new_console|create_unicode_environment;

else

lpenv=null;

zeromemory(&si,sizeof

(si));

zeromemory(&pi,sizeof

(pi));

si.cb=sizeof

(si);

si.lpdesktop="

winsta0\default";

bret=createprocessasuser(hnewusertoken,executefilepath,null,null,null,false,dwcreateflags,lpenv,null,&si,&pi);

//bye

heapfree(getprocessheap(),0

,porigsd);

heapfree(getprocessheap(),

0,pnewsd);

heapfree(getprocessheap(),

0,psidowner);

heapfree(getprocessheap(),

0,psidprimary);

heapfree(getprocessheap(),

0,psacl);

heapfree(getprocessheap(),

0,polddacl);

closehandle(hsnap);

closehandle(hprocess);

closehandle(htoken);

closehandle(husertoken);

closehandle(hnewusertoken);

}

另註:亦可以用來結束系統程序。

Manjaro設定開機以root許可權執行自定義指令碼

背景 前段時間把筆記本搞成雙網絡卡,同時上內外網,每次開機都要手動設定路由,十分不方便,所以就考慮開機自動設定,但是設定route需要su許可權,所以記錄一下實現方法 sudo pacman sy systemd rc local sudo systemctl enable rc local.ser...

Ubuntu UI 以root許可權執行某個程式

之前在ubuntu中安裝了wireshark,這個程式必須用root許可權才能對某個介面抓包,就一直是在終端 sudo wireshark 來執行.最近在網上看到一種方法,在面板處新增乙個快捷方式,然後將其屬性修改一下,以後每次點選該圖示就會提示輸入sudo密碼,就可以直接以root方式開啟了.實際...

普通域控賬號以管理員許可權執行某軟體

環境介紹 本地vm 虛擬機器環境測試 ad域控windows server 2016標準版 主機windows 7旗艦版 普通賬號登入系統,但是有一款軟體需要以管理員身份執行,導致每次執行的時候提示輸入賬號和密碼 經過多次方法實踐得出解決辦法 修改主機 非域控 本地策略 修改後,同步策略,並重啟計算...