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修改、编译、加载相关推荐

  1. 解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面

    解决Ubuntu自动更新Linux内核导致显卡驱动无法加载,致使循环在登录界面 关闭unattended-upgrade 在/etc/apt/apt.conf.d目录下,查找包含Unattended- ...

  2. linux 4g网卡路由,openwrt编译加载龙尚U8300 4G网卡

    1.修改config: make menuconfig选择: Base system ---> udev Kernel modules ---> USB Support ---> k ...

  3. win10支持linux内核,Win10将允许您加载自定义Linux内核

    微软正在为Win10添加一个Linux内核,以支持Linux的Windows子系统.但是,猜测一下:你不必使用微软的Linux内核.您可以构建自己的自定义Linux内核供Windows使用. 此功能是 ...

  4. linux内核及其模块的查询,加载,卸载 lsusb等

    http://blog.sina.com.cn/s/blog_53e81e2a0100zkxi.html 1,/sbin/update-modules文件,他是一个linux通用的模块管理脚本程序. ...

  5. linux内核启动以及文件系统的加载过程

    Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...

  6. Linux arm 内核选项和busybox选项 加载tun模块 -- 创建/dev/tun 字符设备

    Linux arm 内核选项和busybox选项 加载tun/tap模块 – 创建/dev/tun 字符设备 可以参考博客1: linux下TUN/TAP虚拟网卡的使用 可以参考博客2:ubuntu下 ...

  7. Linux内核的配置和编译

    文章目录 前言 1.内核介绍 2.linux内核源码目录结构 3.内核配置和编译实验 4.内核的配置原理 5.menuconfig 6.Kconfig文件详解 7.menuconfig的实验 前言 以 ...

  8. linux内核基础和配置编译原理

    2020-8-8 星期六 北京 闷热天 总结linux内核基础和配置编译原理,分两部分总结.仅作为技术积累,方便日后查阅.参考了网上的一些笔记. 第一部分:内核基础 2.14.1.内核和发行版的区别 ...

  9. ARM Linux启动流程-根文件系统的加载

    前言 在Kernel启动的初始阶段,首先去创建虚拟的根文件系统(rootfs),接下来再去调用do_mount来加载真正的文件系统,并将根文件系统切换到真正的文件系统,也即真实的文件系统. 接下来结核 ...

  10. 在Linux系统中实现一个可加载的内核模块

    Intro 坐标成都电讯大专, 某操作系统课老师在PPT上草草写下3个内核线程API后就要求编程, 感受一下: include/linux/kthread.h,你就看到了它全部的API,一共三个函数. ...

最新文章

  1. c语言翻译成php,C语言如何把它翻译成中文
  2. Google又放大招:高效实时实现视频目标检测 | 技术头条
  3. python batch normalization_python – Keras BatchNormalization,样本明智规范化究竟是什么?...
  4. codevs——1019 集合论与图论
  5. 阿里巴巴是如何管理测试环境的?
  6. linux网站爬取,Kali下httrack 爬取网站页面
  7. arduino i2c 如何写16位寄存器_arduino入门
  8. 微软发布 Windows XP 主题纪念毛衣:各种“致敬”堪称情怀满分
  9. c++ windows 蓝牙库_c++ - “是否有一个多操作系统蓝牙库?”后续:QT Linux到Windows 10蓝牙 - 堆栈内存溢出...
  10. 腾讯钟翔平:以数字技术驱动,做智慧交通共建者
  11. 硬核软件开发者 30 多年的 11 条经验教训
  12. paip.提升安全性------登录地区变换后进行验证
  13. Django(五):后台管理平台admin
  14. 车标识别 深度学习车标识别 cnn车标识别 神经网络车标识别 常见汽车车标识别 yolo算法 效果棒
  15. 实战1--航空公司客户价值分析(画图篇)
  16. SpringBoot+vue实现前后端分离的校园志愿者管理系统
  17. 李华明Himi浅谈游戏开发de自学历程!(仅供参考)
  18. ubuntu鼠标指针替换
  19. 【并发编程神器】,Worker Thread模式
  20. 前端页面如何获取高德地图

热门文章

  1. MacBook Pro M1外接显示器模糊解决之分辨率调节
  2. win10 uwp 录制任意应用屏幕
  3. 用计算机信息术语感恩老师,赞美老师锦旗用语大全 感恩老师的句子
  4. 基于Arduino、STM32进行红外遥控信号接收
  5. windows开机老显示请选择要启动的操作系统
  6. 图片打印设置之适应边框打印
  7. 《指弹:风居住的街道》
  8. 【技术公开课】iOS App研发的最后冲刺:内测与部署
  9. MA5671 上海联通配置指南
  10. Cisco服务器硬盘状态jbod,2018-11-06 JBOD模式下LSI9361RAID卡操作步骤