⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 564.htm

📁 unix高级编程原吗
💻 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 + -