iptables 完成联网控制 (续) ,独立native进程监听。

上一篇:http://www.cnblogs.com/oscar1011/p/5243877.html

之前做的iptables 来进行的联网控制,一直耿耿于怀,想要知道系统里的netd等等是如何做到执行那些命令,并能监听的。

最近有机会又对这部分进行了一些研究。

所要做的大概就是3部分,1. native进程,这部分得用c/c++来写,

  1. framework接口。用于和native进程通信。

  2. selinux权限配置,主要就是为了赋予natvie进程

framework与native的通信这部分也是一个很有趣的地方,看了系统源码,很多模块使用了local socket进行上下层的通信。 好处就是稳定性高,而且另一点应该就是易封装,独立开来。

1.下面就来稍作介绍native 进程的部分,

native的主要作用就是接收命令和执行命令,接收framework传输的命令,执行相应的shell 命令。

此处有两个现成的类可供使用,FrameworkCommand 类,用于注册cmd,大概就是用于转发命令用的吧。

另一个是 FrameworkListener, 用于注册socket监听, 该类new的时候需要传入一个string,监听对应名称的socket。 上层也需要使用该socket进行通信。该socket要和后面framework中使用的相对应。

以下为代码部分

iptables 完成联网控制 (续) ,独立native进程监听。iptables 完成联网控制 (续) ,独立native进程监听。

1 #include <stdio.h>
 2 #incldue <stdlib.h>
 3 #define LOG_TAG "TEST"
 4 
 5 #include "CommandListener.h"
 6 
 7 int main(){
 8 
 9     CommandListener *cl;
10     cl = new CommandListener();
11     cl->startListener();     //开始监听
12     while(1){
13         sleep(10);              //循环,防止进程退出
14         ALOGE("sleep 10s ");
15     }
16 
17     return 0;
18 }

main.cppiptables 完成联网控制 (续) ,独立native进程监听。iptables 完成联网控制 (续) ,独立native进程监听。

1 #include "CommandListener.h"
 2 
 3 
 4 CommandListener::CommandListener()
 5         : FrameworkListener("test",true) {
 6     registerCmd(new FirstTestCmd());  //注册对Test
 7 }
 8 
 9 CommandListener::~CommandListener(){
10 }
11 
12 //此处的firsttest后面通信会用到
13 CommandListener::FirstTestCmd::FirstTestCmd()
14         : TestCommand("firsttest")
15 { }
16 
17 int CommandListener::FirstTestCmd::runCommand(SocketClient *cli,
18                                          int argc, char **argv) {
19     ALOGE("Test  %d",  argc );
20     //对输入的参数进行处理
21      cli->sendMsg("1");     //根据情况返回相应的信息
22     return 0;
23 }

CommandListener.cppiptables 完成联网控制 (续) ,独立native进程监听。iptables 完成联网控制 (续) ,独立native进程监听。

1 #include "TestCommand.h"
2 
3 TestCommand::TestCommand(const char *cmd) :
4               FrameworkCommand(cmd)  {
5 }

TestCommand.cpp

2.framework接口部分

这部分比较简单,只需要在service中创建一个线程,获取到socket,并提供开放接口供app调用即可。 获取socket输出流代码如下:

1 LocalSocket socket = new LocalSocket();
2 OutputStream os = null;
3 LocalSocketAddress lsa = new LocalSocketAddress("test", LocalSocketAddress.Namespace.RESERVED);
4 
5 socket.connect(lsa);
6 os = socket.getOutputStream();
7 os.write("5 firsttest abc  cdf".getBytes(StandardCharsets.UTF_8));

而向这个流写入东西的时候也是有格式限制的,必须是【数字+空格+注册的CMD+空格+内容】的结构。因为当native收到数据时会需要返回一个数据,如果没有这个【数字】进行编号,很可能会导致信息的前后不对应。数据的返回监听一般是建立一个线程单独进行监听。

3.selinux 权限

这块说实话,研究了好几天,感觉有些地方还是很难理解。这些权限的设置会直接影响到native 进程的功能。 而且权限有很多,必须得针对需要的权限进行研究添加,修改的目录一般就两个地方,external/sepolicy和device下面对应开发商的一个配置路径。

至少得加3个地方, 声明native进程的类型,因为用到了socket,还得将socket声明出来,毕竟linux下万物归为文件。还有一个是对test进程的权限声明,这里就不写出来了,毕竟自己都不是很懂,省的误导人。需要用的小伙伴可以自行研究

iptables 完成联网控制 (续) ,独立native进程监听。iptables 完成联网控制 (续) ,独立native进程监听。

/dev/socket/test    u:object_r:test_socket:s0
/system/bin/test    u:object_r:test_exec:s0

sepolicy/file_contextsiptables 完成联网控制 (续) ,独立native进程监听。iptables 完成联网控制 (续) ,独立native进程监听。

1 type test_socket, file_type;

sepolicy/file.te

原文链接: https://www.cnblogs.com/oscar1011/p/6086731.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/249564

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午3:46
下一篇 2023年2月14日 上午3:47

相关推荐