///////////////////////說明: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旗艦版 普通賬號登入系統,但是有一款軟體需要以管理員身份執行,導致每次執行的時候提示輸入賬號和密碼 經過多次方法實踐得出解決辦法 修改主機 非域控 本地策略 修改後,同步策略,並重啟計算...