系统调用

Linux内核系统调用劫持之kallsyms

扶醉桌前 提交于 2020-01-19 19:01:11
1.通过kallsyms方式 基于Linux 5.0/Linux5.3 的X86-64系统. 1. 通过kallsyms_lookup_name查找sys_call_table地址. 2. 关闭写保护 3. 修改sys_call_table Linux5.0上直接调用write_cr0接口,能够顺利的修改CR0寄存器,而内核版本更新到Linux5.3以后,发现对CR0的修改进行了保护,所以这里需要自定义write_cr0的实现,直接从Linux5.0中把相关代码静态编译进入模块中.这样也可以绕过对CR0的保护. #include<linux/module.h> #include<linux/printk.h> #include<linux/kobject.h> #include<linux/kernel.h> #include<asm/unistd_64.h> #include<linux/syscalls.h> #include<linux/delay.h> #include<linux/kallsyms.h> #include<asm/syscall.h> #include<asm/paravirt.h> #include <asm/nops.h> static unsigned long __lkm_order; static inline unsigned long lkm

linux 内核与用户空间通信之netlink使用方法

戏子无情 提交于 2020-01-19 13:50:05
转自:http://blog.csdn.net/haomcu/article/details/7371835 Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Named Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared Memory),信号量(Semaphore),套接字(Socket)。通过这些IPC机制,用户空间进程之间可以完成互相通信。为了完成 内核空间 与 用户空间 通信,Linux提供了基于socket的Netlink通信机制,可以实现内核与用户空间数据的及时交换。 本文第2节概述相关研究工作,第3节与其他IPC机制对比,详细介绍Netlink机制及其关键技术,第4节使用KGDB+GDB组合调试,通过一个示例程序演示Netlink通信过程。第5节做总结并指出Netlink通信机制的不足之处。 2 相关研究 到目前Linux提供了9种机制完成内核与用户空间的数据交换,分别是内核启动参数

linux 内核与用户空间通信之netlink使用方法

邮差的信 提交于 2020-01-19 13:49:19
1 引言 Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Named Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared Memory),信号量(Semaphore),套接字(Socket)。通过这些IPC机制,用户空间进程之间可以完成互相通信。为了完成内核空间与用户空间通信,Linux提供了基于socket的Netlink通信机制,可以实现内核与用户空间数据的及时交换。 本文第2节概述相关研究工作,第3节与其他IPC机制对比,详细介绍Netlink机制及其关键技术,第4节使用KGDB+GDB组合调试,通过一个示例程序演示Netlink通信过程。第5节做总结并指出Netlink通信机制的不足之处。 2 相关研究 到目前Linux提供了9种机制完成内核与用户空间的数据交换,分别是内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file

0.3 系统调用os模块

ぃ、小莉子 提交于 2020-01-19 03:41:20
os 模块提供了很多允许你的程序与操作系统直接交互的功能 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 1 print(os.getcwd()) 2 #结果:E:\python\模块 返回指定目录下的所有文件和目录名:os.listdir() 1 print(os.listdir('E:/python')) 2 #结果:['py练习1', 'qqbot', 'qq机器人', '函数', '框架', '模块', '海归画图', '类的练习', '练习', '练习2', '联系3', '项目练习'] 函数用来删除一个文件:os.remove() 1 os.remove('asd') 2 #删除工作目录下,asd这个文件也可以指定目录os.remove(r'E:/python/模块/os_moduley.py') 删除多个目录:os.removedirs(r“c:\python”) 检验给出的路径是否是一个文件:os.path.isfile() 1 print(os.path.isfile('E:/python/模块/os_moduley.py')) 2 在就返回True,不在就返回False 检验给出的路径是否是一个目录:os.path.isdir() 判断是否是绝对路径:os.path.isabs() 检验给出的路径是否真地存:os.path

Socket 专题

♀尐吖头ヾ 提交于 2020-01-19 01:16:21
Socket小白篇-附加TCP/UDP简介 Socket 网络通信的要素 TCP和UDP Socket的通信流程图 1.Socket 什么是Socket Socket:又称作是套接字,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为Socket。 Socket是对TCP/IP的协议的封装,Socket本身并不是协议,而是一个调用的接口,只有通过Socket我们才能使用TCP/IP。   Socket是和网络紧密相关的,网络上的两个程序一般就是指web服务器和我们的客户端,数据交换的过程就是我们客户端发一个请求到HTTP服务器、服务器返回数据,这个过程就是数据交换的过程。客户端和服务器之间的数据交换是需要一个双向的通信连接,两者之间是需要一个通道去实现连接的。 通信管道就是通信连接,有了这个管道,我们就可以进行数据传输。客户端到服务器端必须要有一个通道才能实现数据的交互。如果有座大山挡着了道路我们就会在山中开辟一个隧道,这样我们才能走到山的另一端。Socket就可以理解为这个隧道的两个端口,一个入口一个出口。 一个网络请求并不是我们所认为的请求-相应的过程,它的底层是开辟了一个通信管道的。所以应用程序通常是通过Socket(套接字)向网络发出请求或者应答网络请求。 流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。

i/o模型

五迷三道 提交于 2020-01-17 06:58:27
I/O模型 简单表示一下数据从外部磁盘向运行中进程的内存区域移动的过程: 这张图片明显忽略了很多细节,只涉及了基本操作,下面分析一下这张图。 用户空间和内核空间 一个计算机通常有一定大小的内存空间,如一台计算机有4GB的地址空间,但是程序并不能完全使用这些地址空间,因为这些地址空间是被划分为用户空间和内核空间的。 程序只能使用用户空间的内存 ,这里所说的使用是指程序能够申请的内存空间,并不是真正访问的地址空间。下面看下什么是用户空间和内核空间: 1、用户空间 用户空间是常规进程所在的区域,什么是常规进程,打开任务管理器看到的就是常规进程: JVM就是常规进程,驻守于用户空间,用户空间是非特权区域,比如在该区域执行的代码不能直接访问硬件设备。 2.内核空间   内核空间运行时所使用的用于程序调度,虚拟内存的使用或者连接硬件资源等的程序逻辑。内核代码有特别的特权,能与设备控制器通讯,控制着整个用于整个区域进程的运行状态,所有io都直接或间接通过内核空间。 划分内核空间和用户空间是为了保证操作系统的稳定性和安全性。用户程序不可以直接访问硬件资源,如果用户程序需要访问硬件资源必须调用系统提供的接口,这个调用接口的过程也就是系统调用。每次系统调用都会存在两个内存空间直接的切换。通常的网络传输也是一次系统调用,通过网络传输的数据 是先从内核空间接收到远程主机的数据

内核调试工具——strace

a 夏天 提交于 2020-01-16 06:07:33
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 输出参数含义 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0 brk(0) = 0xab1000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) ... brk(0) = 0xab1000 brk(0xad2000) = 0xad2000 fstat(1, {st_mode=S_IFCHR

中断&异常

五迷三道 提交于 2020-01-16 04:00:33
中断分类      类别 原因 返回行为 例子 广义 中断 异步中断 ( 狭义中断 ) 中断 ( interrupt) 可屏蔽中断 来自 I/O 设备的信号 总是返回到下一条指令 所有的 IRQ 中断 不可屏蔽中断 电源掉电和物理存储器奇偶校验 同步中断 ( 也称异常 ) 陷阱 (trap) 有意的异常 总是返回到下一条指令 系统调用、信号机制 ( 通过软中断实现 ) 故障 (fault) 潜在可恢复的错误 返回到当前指令 缺页异常、除 0 错误、段错误 终止 (abort) 不可恢复的错误 不会返回 硬件错误 注: 80386有两根引脚INTR和NMI接受外部中断请求信号,INTR接受可屏蔽中断请求。在80386中,标志寄存器EFLAGS中的IF标志决定是否屏蔽可屏蔽中断请求。 中断的定义( wikipedia ) 中断 是指由于接收到来自外围硬件(相对于 中央处理器 和 内存 )的 异步 信号或来自 软件 的 同步 信号,而进行相应的硬件/软件处理。硬件中断导致处理器通过 一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令(汇编中的int 指令),以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。软中断陷入内核,常被用于实现系统调用(int 80等)。

定义指令流

青春壹個敷衍的年華 提交于 2020-01-15 17:07:32
程序嘛,简单的定义以下就是一组指令序列,这个指令序列大多数并不是连续的(从被CPU"吸入"的第一个段指令开始(想象吸面条的样子)),假设我们写一个程序, main( ){ int i = 1; i++; i++; open("a file"); close("a file"); } 没有判断操作产生的指令分支切换、也没有循环(当然,程序很丑),这个程序的指令序列会像一根面条一样丝滑的执行完吗?程序中的代码编译出的指令序列即为被执行的指令流吗? 很明显不是的,它调用了open/close这些系统调用,当然,严格来讲,他们并不是系统调用,而是一些库,一些操作系统调用的库,只不过他们总是代表着执行系统调用,所以这么说也算是有所依据;如果看过<ARMv8指令集下的一次异常>系列的文章就会知道,执行到真实的系统调用后,后续CPU执行的代码就不是我们写的。这与动态库的原理有些相似,动态库的代码也不是我们写的,但那些代码并不能在改变CPU硬件状态后继续执行。 于是,程序的指令序列的界限应该在哪里?很明显不能包含CPU状态改变后执行的指令序列,甚至都不能包含公有动态库的部分。 而指令流就可以被理解为跨越程序、动态库、内核代码的一柄闪闪发光的大刀:在程序出发后,将要被CPU执行的指令序列的集合。 完美表达出目标含义。 来源: CSDN 作者: ytfy339784578 链接