首页
论坛
课程
招聘
[原创]1st :使用LPC机制进行ring0-ring3双向可靠通信
2011-9-15 15:52 16731

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

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

第一篇:就是本篇啦

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:

看雪2022 KCTF 秋季赛 防守篇规则,征题截止日期11月12日!(iPhone 14等你拿!)

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