用匯編語言編寫Linux內核模塊

我不喜歡被當今互聯網產業吹噓到比冥王哈迪斯還該死的所謂業務邏輯,我只喜歡機器本身,所以我不會編程,是的,這是報應。

我只會C語言和彙編,但是並不很。

但我覺得C語言編譯器自動生成的那些push RBP之類的指令簡直糟糕透了,所以我更喜歡更加純粹的彙編。

我曾經是一個用Java寫過界面的人,我也是一個直接用機器碼打開別人開不了機的人,我是一個不懂UML但曾經動用過改錐編程的人,至少我崇拜那樣的人。

本文,我來展示一個用匯編寫的Linux內核模塊,沒有gcc生成的prologue & epilogue,也不用include那麼一坨頭文件,簡單直接,請看:

; test.asm
global init_module
global cleanup_module

extern printk

section .data
    msg    db "浙江溫州皮鞋溼,下雨進水不會胖\n", 32, 0

section .text

init_module:
	mov    rdi, $msg
	call printk
    xor rax, rax
    ret

cleanup_module:
    ret

Makefile如下:

obj-m += mod.o
mod-objs = test.o

KDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)
default:
	nasm -f elf64 test.asm -o test.o
	make -C $(KDIR) M=$(PWD) modules

直接make,效果如下:

[root@localhost test]# dmesg
[ 1076.387265] 浙江溫州皮鞋溼,下雨進水不會胖

試試看如何打印出當前的內核版本?

好辦!

[root@localhost ~]# cat /proc/kallsyms |grep linux_banner
ffffffff8164c0e0 R linux_banner

代碼如下:

global init_module
extern printk

section .text

init_module:
	mov    rdi, 0xffffffff8164c0e0
	call printk
    mov rax, -1
    ret

效果如下:

[root@localhost test]# insmod ./mod.ko
insmod: ERROR: could not insert module ./mod.ko: Operation not permitted
[root@localhost test]# dmesg
[ 1757.595004] Linux version 3.10.x86_64 (admin@2969c2e8d7c0) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC) ) #1 SMP Thu Jan 25 10:26:17 CST 2018

浙江溫州皮鞋溼,下雨進水不會胖!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章