📄 564.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="15.htm">上一层</a>][<a href="565.htm">下一篇</a>]
<hr><p align="left"><small>发信人: cloudsky (小四), 信区: Security <br>
标 题: RPC/XDR/NFS系列之----远程过程调用 <br>
发信站: 武汉白云黄鹤站 (Wed Feb 23 17:27:31 2000), 站内信件 <br>
scz注:这里我们需要讨论一个问题。rpc server启动之后杀掉portmapper。自己编写 <br>
rpc client,不向远程主机的portmapper查询rpc server的动态端口,而是直 <br>
接使用通过其他手段获知的端口号建立socket通信,有什么问题?个人觉得可 <br>
行。于是可以绕过portmapper的一些监视功能,是这样吗?比如可以用 <br>
rpcinfo -p先查询到rpc server的端口,然后从命令行参数指定给rpc client <br>
使用。 <br>
portmapper在周知端口111上被动打开,这里存在另外一些问题。根据Douglas <br>
的说法,rpc server注册以及rpc client查询都是直接通过111端口进行的。 <br>
在Stevens的著作中,portmapper本身就是一个rpc server,提供了四个远程 <br>
过程,rpcinfo用到了这些远程过程。portmapper作为rpc server会向自己注册 <br>
, <br>
只不过注册的端口号不是操作系统动态分配得到的,而是固定使用111。 <br>
rpc server注册动态端口时使用了RPC,portmapper提供注册和反注册两个远程 <br>
<br>
过程供rpc server启动时调用。rpc client查询时也使用了RPC,portmapper提 <br>
供 <br>
了查询远程过程供rpc client查询时调用。portmapper提供的第四个远程过程 <br>
是返回所有已经注册的条目,rpcinfo -p调用了这个远程过程。 <br>
必须理解的是,进行RPC调用与使用固定端口还是使用动态端口无关,RPC调用 <br>
本身是通过socket通信发送RPC报文完成的。所以portmapper使用111、nfs使用 <br>
<br>
2049与它们提供远程过程不冲突。这里也该记住,不是所有的RPC Server都动态 <br>
<br>
获取端口,不是所有的RPC Client都向portmapper查询,基于portmapper的保护 <br>
<br>
机制是可以突破的。 <br>
★ ONC RPC的报文格式(Redhat) <br>
在/usr/include/rpc/rpc_msg.h中有如下定义: <br>
/* <br>
* Body of a reply to an rpc request. <br>
*/ <br>
struct reply_body { <br>
enum reply_stat rp_stat; <br>
union { <br>
struct accepted_reply RP_ar; <br>
struct rejected_reply RP_dr; <br>
} ru; <br>
#define rp_acpt ru.RP_ar <br>
#define rp_rjct ru.RP_dr <br>
}; <br>
/* <br>
* Body of an rpc request call. <br>
*/ <br>
struct call_body { <br>
u_long cb_rpcvers; /* must be equal to two */ <br>
u_long cb_prog; <br>
u_long cb_vers; <br>
u_long cb_proc; <br>
struct opaque_auth cb_cred; <br>
struct opaque_auth cb_verf; /* protocol specific - provided by clien <br>
t */ <br>
}; <br>
/* <br>
* The rpc message <br>
*/ <br>
struct rpc_msg { <br>
u_long rm_xid; <br>
enum msg_type rm_direction; <br>
union { <br>
struct call_body RM_cmb; <br>
struct reply_body RM_rmb; <br>
} ru; <br>
#define rm_call ru.RM_cmb <br>
#define rm_reply ru.RM_rmb <br>
}; <br>
#define acpted_rply ru.RM_rmb.ru.RP_ar <br>
#define rjcted_rply ru.RM_rmb.ru.RP_dr <br>
enum msg_type { <br>
CALL=0, <br>
REPLY=1 <br>
}; <br>
struct rpc_msg结构定义了RPC报文的格式。 <br>
struct call_body结构定义了RPC请求报文体。 <br>
struct reply_body结构定义了RPC应答报文体。 <br>
现在我们来看RPC请求报文体struct call_body,RPC协议版本号用于 <br>
保证rpc client和rpc server使用相同的RPC协议版本,目前必须等于 <br>
2,注意到注释/* must be equal to two */。远程程序号、远程程序 <br>
版本号以及远程过程号用于唯一确定RPC请求的接收者,最后两个成员 <br>
用于远程过程鉴别rpc client的身份。 <br>
我们将在后面的系列中通过协议分析软件抓包来观察一个完整的RPC <br>
报文。和系统安全有关的结构成员主要是RPC请求报文体的最后两个 <br>
成员,这个安全问题将在后续系列中介绍。 <br>
★ 对远程过程的参数进行序列化 <br>
在一个RPC请求报文中,鉴别成员之后含有远程过程的参数,参数的个数 <br>
以及参数类型取决于被调用的远程过程。RPC机制将使用XDR转换远程过程 <br>
使用的每个参数。 <br>
scz注:如果远程过程的某个参数由链表那样复杂的数据结构组成,此时 <br>
必须使用相对指针代替绝对地址,比如使用索引。然后进行XDR编 <br>
码并发送。 <br>
术语序列化(marshal)、线性化(linearize)或者串行化(serialize)都是指 <br>
这种对远程过程所使用参数进行XDR编码的过程。一般说,rpc client <br>
将参数序列化,rpc server进行参数的反序列化。尽管允许远程过程使用 <br>
复杂的参数类型,但序列化和反序列化需要大量的时间的资源,不推荐 <br>
远程过程使用链表这类的参数。 <br>
scz注:搞过java编程的朋友,可能对序列化这个术语并不陌生,可是你当 <br>
初是否真正理解过这个概念呢,反正我97年的时候感到这个概念很 <br>
不好理解。现在再回头看看xdr_example函数,不就是对struct example <br>
进行序列化的么。既然结构可以序列化,那么class也可以序列化。 <br>
所以大多数对象都可以序列化。 <br>
-- <br>
我问飘逝的风:来迟了? <br>
风感慨:是的,他们已经宣战。 <br>
我问苏醒的大地:还有希望么? <br>
大地揉了揉眼睛:还有,还有无数代的少年。 <br>
我问长空中的英魂:你们相信? <br>
英魂带着笑意离去:相信,希望还在。 <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="15.htm">上一层</a>][<a href="565.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -