首页
社区
课程
招聘
[原创]1st :使用LPC机制进行ring0-ring3双向可靠通信
发表于: 2011-9-15 15:52 18587

[原创]1st :使用LPC机制进行ring0-ring3双向可靠通信

2011-9-15 15:52
18587

今天心情很不爽,发几篇初级贴吧,下次心情再不好的话再发点其他好玩的东东,反正放在硬盘里也是占空间

第一篇:就是本篇啦

LPC这东东大家应该都听说过,至于用没用过,那就另当别论啦。它的全称是Local Procedure Call
本地过程调用,是一种建立在PORT(端口)对象上的完整的可靠的进程间通信机制。
如果你没听过这东东,也很正常啦,微软把这么好玩的东西留着自己用来着,比如说:csrss进程。但是咱要发挥铁公鸡精神,你能用老子干嘛不能用? 

先打个广告,请问你之前进行ring0 - ring3通信是不是用以下方法:
 1:Device I/O
 2: 共享内存+同步对象
 3:其他:如stack process + read/write virtual memory

首先我并不想说使用LPC机制比你正在使用的方法更好,我只想告诉你一种也许你还不知道的方法,如果你已经知道了,飘~过~吧 

不废话了,进入正题,咱分两部分,LPC介绍和LPC的应用;

一: LPC (Local Procedure Call)? what hell is it ?

LPC机制是建立在PORT对象上的进程间通信机制,咱姑且这么理解吧。它是相对于RPC(Remote Procedure Call)远程过程调用而言的, 无论LPC或者RPC,都是一种现代人称作C/S的架构,即 客户端/服务器 模型 。扯远点,其实native api调用也是种LPC模型,应用层(client)使用api发起调用请求,ntdll中stub函数使用sysenter进入内核(server),内核处理完调用请求,将结果回送给应用层,这样就完成一次api调用。是不是很像MS的socket?

扯远了,收回来。如同windows下的网络通讯大都建立在socket(套字节)上,LPC是建立在PORT的双向通信。LPC可以发送的数据可以是如下三种:
 1:数据嵌入在报文中,大概可以发送300字节酱紫
 2:使用section对象的映射来交换大数据
 3:甚至允许直接read/write进程空间,交换超大的数据

嘿嘿,很有意思吧? 那么咱们这段就跳了,至于实现,WRK里的LPC目录里有完整源码,自己深入研究吧

二:LPC的应用? how to use it for myself ?

Q1:这可以归结为两个问题,如何在你的工程里添加用于使用LPC的API
Q2:如何使用这些API

A1: 我的解决方法是把LPC的原型写入头文件,然后动态获取函数地址,也许你说可以用
__declspec(dllimport) 来修饰,嘿嘿,对于应用层(在ntdll.dll中导出),倒是可以。但是内核只导出了NtConnectPort一个函数,其他的未导出。至于怎么获取,这个我想各有良方吧,可以用索引硬编码在KiServiceTable中找到地址;也可以打开ntdll.dll,然后自己查找这些函数对于的索引值。 我为了方便,只接用了硬编码咯。

A2:这个问题,让我的代码回答你吧

参考资料:
《undocumented windows nt secret》
《windows 2000 native api reference》

PS: 小弟才疏学浅,如有错误,欢迎指正;

******************邪恶的分割线*************************
上图:

******************邪恶的分割线**************************
上代码+bin:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (13)
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
MiniFilter的FltSendMessage更好用,虽然也是对lpc和alpc的包装.
2011-9-15 18:49
0
雪    币: 67
活跃值: (91)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
minifilter封装得太狠了,把细节给隐藏起来……说好也好,说坏也坏,萝卜青菜各有所爱 =。=
话说知道了LPC这么个东东后,自己封装下下就是轻而易举的事了
2011-9-15 19:35
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
FltSendMessage确实不错~
fltmgr在win7里变化很多~很纠结~
win8里变化也不少~~
2011-9-15 20:25
0
雪    币: 67
活跃值: (91)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
都拿win8了……坐等beta,下载preview就是占网……80KB/S网速你伤不起啊
2011-9-15 20:54
0
雪    币: 67
活跃值: (91)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
建了个小群,人少啊,无聊啊,没事来扯扯蛋……50530582
2011-9-16 19:10
0
雪    币: 12
活跃值: (773)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
以前我看到过别人用LPC通信,一直没注意,今天学习下
2011-11-4 08:35
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
难得看到有人讨论LPC了。
年初的时候我封装好了LPC.
支持内核对内核 内核对上层等双向通讯,任何一方均可主动发起。
支持PUSH模式也直接交换通讯模式。
但LPC的缺点也是有的。比如双向通讯需要双向监听的问题。
搂主你要走的路还很长。为了兼容大数据传输。我最后在LPC和Read/Write中取了个折中点。即内部数据传递使用LPC,外部数据进来使用READ/WRITE进行提交。然后我做了复杂的内存管理函数。以及维护多张管理通讯终端的2X表,目前速度应该在14万个POST_MESSAGE/秒左右。
有兴趣我可以提供我的接口库以及DEMO
2011-11-28 00:58
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
每次面试内核开发人员必问通讯这一环。。
2011-11-28 00:59
0
雪    币: 169
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
马克! 感谢!
2011-12-2 22:25
0
雪    币: 2
活跃值: (199)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
能1对多吗?
2012-1-13 17:48
0
雪    币: 274
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
收藏,学习一下~~
2012-11-30 11:51
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
这三天学习ubuntu去了,没登陆看雪,怎么出了这么多精华啊,汉~~~~
2012-12-1 01:06
0
雪    币: 56
活跃值: (505)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
研究一下
2012-12-11 16:17
0
游客
登录 | 注册 方可回帖
返回
//