linux 内核更改,linux_kernel修改、编译、加载
linux kernel和android rom的关系不必多言
老罗-罗升阳在他android之旅中开篇就强调了kernel研究的重要性
本人最近研究一个rom安全需求,即修改tcp和udp传输内容。
本贴子就是介绍这个kernel的修改、编译、加载及测试的过程。很多都是在摸索,不敢说权威和正确!请各位大牛指正指导!
如果各位看了后,觉得有点意思,求给些加油积分!!
本人想组织同城机油会,但是现在机油等级还不够。。。。。。。
============== linux_kernel修改、编译、加载 =============================
平台:ubuntu-14.04.2-desktop-amd64 (貌似是LTS)
linux kernel的下载、编译和加载,网上均有直接的资源
kernel的下载、配置和生成
参考soararing 兄弟的博客“ubuntu下编译内核 ”:http://blog.chinaunix.net/uid-20235103-id-1970858.html
“
ubuntu不带linux内核源码,需要自己下载安装。
1,查看自己的内核版本
uname -r
2,查看源内的内核源码类表
apt-cache search linux-source
3,下载安装内核源代码
sudo apt-get install linux-source-2.6.27 //我选的是这一个,自己看着办吧
4,等待........
下载完成后,在/usr/src下会有一个文件名为linux-source-2.6.xx.tar.bz2的压缩包
5,解压缩包
tar jxvf linux-source-2.6.27.tar.bz2 //看清自己的版本
解压后会生成一个源代码目录/usr/src/linux-source-2.6.27
6,进入源码目录后,配置文件
make oldconfig
7,生成内核
make
”
kernel的加载
参考nodeathphoenix 兄弟的博客“ubuntu上编译kernel”:http://blog.csdn.net/nodeathphoenix/article/details/38364505
“
2、编译和安装
sudo make -----不加任何参数直接make,就是make all,它包含make modules了。
sudo make modules_install -----安装modules到/lib/modules下
sudo make install -----安装bzimage到/boot下,并且会它会根据/boot下的kernel版本信息自动将新安装的kernel的启动项加到/boot/grub/grub.cfg中。
至此,编译安装就完成了,你只需要restart下你的电脑 就会发现启动时Ubuntu有两个版本的kernel可选了。尽情享受吧!
重启后,选择新版本的kernel,然后查看kernel版本信息,cat /proc/version
Linux version 3.15.8 (root@jack) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #1 SMP Mon Aug 4 01:51:38 CST 2014
瞧,当前kernel是新编译安装的了吧。
3、删除kernel启动项
如果要在GRUB启动项中删除之前自己编译安装的kernel版本,则只需要将/lib/modules和/boot目录下的安装时copy过来的相关东西删除。然后再
调用sudo update-grub,它会自动删除/boot/grub/grub.cfg中对应的kernel版本的启动项。
”
本次kernel的修改需求是,修改tcp和udp传输内容。
首先查看kernel头文件文件夹,找到tcp.h和udp.h的头文件
图01:tcp.h和udp.h.jpg (123.79 KB, 下载次数: 0)
图01:tcp.h和udp.h
2015-7-11 08:07 上传
(图01:tcp.h和udp.h)
在tcp.h中看到这个函数定义tcp_sendmsg
图02:tcp_sendmsg函数定义.jpg (210.75 KB, 下载次数: 0)
图02:tcp_sendmsg函数定义
2015-7-11 08:08 上传
(图02:tcp_sendmsg函数定义)
在kernel的net下搜索tcp_sendmsg函数使用
图03:net下搜索tcp_sendmsg函数.jpg (150.5 KB, 下载次数: 0)
图03:net下搜索tcp_sendmsg函数
2015-7-11 08:09 上传
(图03:net下搜索tcp_sendmsg函数)
可以看到net里有tcp_sendmsg 的地方不多,其中框出的是tcp_sendmsg的实现,对应tcp.h里的实现是ipv4\tcp.c
图04:tcp_sendmsg搜索结果.jpg (120.83 KB, 下载次数: 0)
图04:tcp_sendmsg搜索结果
2015-7-11 08:09 上传
(图04:tcp_sendmsg搜索结果)
ipv4\tcp.c的tcp_sendmsg里传输内容关键在msghdr和iovec两个结构体里
图05:ipv4_tcp.c的tcp_sendmsg函数.png (147.58 KB, 下载次数: 3)
图05:ipv4_tcp.c的tcp_sendmsg函数
2015-7-11 08:09 上传
(图05:ipv4_tcp.c的tcp_sendmsg函数)
关于msghdr结构体的解析,可以参考ccccdddxxx 兄弟的博客“内核中用于数据接收的结构体struct msghdr”:http://blog.csdn.net/ccccdddxxx/article/details/6368337
“
sys_sendto构建一个结构体struct msghdr,用于接收来自应用层的数据包 ,下面是结构体struct msghdr的定义:
struct msghdr {
void *msg_name;// 存数据包的目的地址,网络包指向sockaddr_in
//向内核发数据时,指向sockaddr_nl
int msg_namelen;// 地址长度
struct iovec *msg_iov;
__kernel_size_t msg_iovlen;
void *msg_control;
__kernel_size_t msg_controllen;
unsigned msg_flags;
};
”
关于iovec结构体的解析,可以参考iovec的百度百科:http://baike.baidu.com/link?url= ... x-dhIhfoGUVlEi7O3_a
“
/* Structure for scatter/gather I/O. */
struct iovec
{
void *iov_base; /* Pointer to data. */
size_t iov_len; /* Length of data. */
};
”
针对这两个结构体,写了2个函数用来修改tcp的传输内容
图06:2个函数用来修改tcp的传输内容.jpg (83.05 KB, 下载次数: 1)
图06:2个函数用来修改tcp的传输内容
2015-7-11 08:10 上传
(图06:2个函数用来修改tcp的传输内容)
在tcp.c的tcp_sendmsg函数中调用自定义的tcp传输内容修改函数
图07:tcp_sendmsg函数中调用自定义的tcp传输内容修改函数.jpg (95.41 KB, 下载次数: 0)
图07:tcp_sendmsg函数中调用自定义的tcp传输内容修改函数
2015-7-11 08:10 上传
(图07:tcp_sendmsg函数中调用自定义的tcp传输内容修改函数)
之后,就是编译kernel,加载kernel
然后测试修改是否成功。
ubuntu 14.04_2 64bit的LTS的kernel是3.16.0版本的
图08:LTS的kernel是3.16.0版本.png (101.16 KB, 下载次数: 0)
图08:LTS的kernel是3.16.0版本
2015-7-11 08:10 上传
(图08:LTS的kernel是3.16.0版本)
测试结果:
1.HTTP访问失败;
2.kernel已经从3.16.0变成3.13.11;
3.ping正常,icmp正常,说明网络正常。
图09:测试结果.jpg (168.97 KB, 下载次数: 1)
图09:测试结果
2015-7-11 08:11 上传
(图09:测试结果)
存在问题:
1.本人偷懒,未做抓包验证
2.tcp.c函数应该写头文件
linux 内核更改,linux_kernel修改、编译、加载相关推荐
- 解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面
解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面 关闭unattended-upgrade 在/etc/apt/apt.conf.d目录下,查找包含Unattended- ...
- linux 4g网卡路由,openwrt编译加载龙尚U8300 4G网卡
1.修改config: make menuconfig选择: Base system ---> udev Kernel modules ---> USB Support ---> k ...
- win10支持linux内核,Win10将允许您加载自定义Linux内核
微软正在为Win10添加一个Linux内核,以支持Linux的Windows子系统.但是,猜测一下:你不必使用微软的Linux内核.您可以构建自己的自定义Linux内核供Windows使用. 此功能是 ...
- linux内核及其模块的查询,加载,卸载 lsusb等
http://blog.sina.com.cn/s/blog_53e81e2a0100zkxi.html 1,/sbin/update-modules文件,他是一个linux通用的模块管理脚本程序. ...
- linux内核启动以及文件系统的加载过程
Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...
- Linux arm 内核选项和busybox选项 加载tun模块 -- 创建/dev/tun 字符设备
Linux arm 内核选项和busybox选项 加载tun/tap模块 – 创建/dev/tun 字符设备 可以参考博客1: linux下TUN/TAP虚拟网卡的使用 可以参考博客2:ubuntu下 ...
- Linux内核的配置和编译
文章目录 前言 1.内核介绍 2.linux内核源码目录结构 3.内核配置和编译实验 4.内核的配置原理 5.menuconfig 6.Kconfig文件详解 7.menuconfig的实验 前言 以 ...
- linux内核基础和配置编译原理
2020-8-8 星期六 北京 闷热天 总结linux内核基础和配置编译原理,分两部分总结.仅作为技术积累,方便日后查阅.参考了网上的一些笔记. 第一部分:内核基础 2.14.1.内核和发行版的区别 ...
- ARM Linux启动流程-根文件系统的加载
前言 在Kernel启动的初始阶段,首先去创建虚拟的根文件系统(rootfs),接下来再去调用do_mount来加载真正的文件系统,并将根文件系统切换到真正的文件系统,也即真实的文件系统. 接下来结核 ...
- 在Linux系统中实现一个可加载的内核模块
Intro 坐标成都电讯大专, 某操作系统课老师在PPT上草草写下3个内核线程API后就要求编程, 感受一下: include/linux/kthread.h,你就看到了它全部的API,一共三个函数. ...
最新文章
- c语言翻译成php,C语言如何把它翻译成中文
- Google又放大招:高效实时实现视频目标检测 | 技术头条
- python batch normalization_python – Keras BatchNormalization,样本明智规范化究竟是什么?...
- codevs——1019 集合论与图论
- 阿里巴巴是如何管理测试环境的?
- linux网站爬取,Kali下httrack 爬取网站页面
- arduino i2c 如何写16位寄存器_arduino入门
- 微软发布 Windows XP 主题纪念毛衣:各种“致敬”堪称情怀满分
- c++ windows 蓝牙库_c++ - “是否有一个多操作系统蓝牙库?”后续:QT Linux到Windows 10蓝牙 - 堆栈内存溢出...
- 腾讯钟翔平:以数字技术驱动,做智慧交通共建者
- 硬核软件开发者 30 多年的 11 条经验教训
- paip.提升安全性------登录地区变换后进行验证
- Django(五):后台管理平台admin
- 车标识别 深度学习车标识别 cnn车标识别 神经网络车标识别 常见汽车车标识别 yolo算法 效果棒
- 实战1--航空公司客户价值分析(画图篇)
- SpringBoot+vue实现前后端分离的校园志愿者管理系统
- 李华明Himi浅谈游戏开发de自学历程!(仅供参考)
- ubuntu鼠标指针替换
- 【并发编程神器】,Worker Thread模式
- 前端页面如何获取高德地图