Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 150 Vote(s) - 3.62 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Writing x86_64 linux kernel module in assembler

#1
I try write simple kernel module (v3.6) in nasm, but insmod say me:

$ sudo insmod ./hello.ko
insmod: ERROR: could not insert module ./hello.ko: Invalid module format
$ echo $?
1

I compile my code with:

$ nasm -f elf64 -o hello.m hello.asm
$ ld -m elf_x86_64 -r -o hello.ko hello.m

and my module code:

section .modinfo
__mod_kernel_version db "kernel_version=3.6.8", 0
__mod_license db "license=GPL", 0
__mod_author db "author=actics", 0
__mod_description db "description=hello world module in nasm", 0


section .data
init_mess db "init_module", 10, 0
cleanup_mess db "cleanup_module", 10, 0


section .text
global init_module
global cleanup_module

extern printk

init_module:
push rbp
mov rbp, rsp

xor rax, rax
mov rdi, init_mess
call printk

xor rax, rax
mov rsp, rbp
pop rbp
ret

cleanup_module:
push rbp
mov rbp, rsp

xor rax, rax
mov rdi, cleanup_mess
call printk

xor rax, rax
mov rsp, rbp
pop rbp
ret

Please help. In internets i found 1 link with equal code for 2.4, but he doesnt work too
My system - archlinux with 3.6.8 kernel

UPDATE:
in nasm forum i find thread with interesting solution. It's work for me, if my module do return 0 and exit :) But if i try add "extern printk" the insmod say me next:

ERROR: could not insert module hello.ko: Invalid parameters

What i'm doing wrong? my code:

[bits 64]

global init_module
global cleanup_module

;extern printk

section .modinfo
__mod_description8 db 'description=Simple module',0
align 16,db 0
__mod_author7 db 'author=That´s me',0
__mod_license6 db 'license=GPL',0
align 16,db 0
__module_depends db 'depends=',0
align 32,db 0
__mod_vermagic5 db 'vermagic=3.6.8-1-ARCH SMP preempt mod_unload modversions ',0 ;from a .ko module of my system

section __versions
____versions db 0xdf, 0xbc, 0xbf, 0x8c, 0, 0, 0, 0, "module_layout" ;from a .ko module of my system
align 64,db 0

section .data
init_mess db "init_module", 10, 0
cleanup_mess db "cleanup_module", 10, 0


section .text

init_module:
xor rax, rax
ret

cleanup_module:
xor rax, rax
ret

section .gnu.linkonce.this_module
times 24 db 0
__name: db 'Simple', 0
times (0x168 - 24 - 7) db 0
__init_module: dq init_module
times 0x2ac db 0
__cleanup_module: dq cleanup_module
times 1152 db 0

this code work with:
nasm -f elf64 hello.asm -o hello.o

but if i uncomment printk this no working!)
Reply

#2
k you have to use gcc to compile it k and link it with the kernel directory...
Reply

#3
change the Makefile to:

obj-m += memory_asm.o
memory_asm-objs := module.o main.o
$(KBUILD_EXTMOD)/main.o: $(src)/main.asm
nasm -f elf64 -o $@ $^ && echo "" > $(src)/.main.o.cmd
Reply

#4
What I did was write a small C wrapper using the standard module macros and link it with the main module code that's written in asm. Use the normal kernel build system to build it.

*module.c:*
```c
#include <linux/module.h>
MODULE_AUTHOR("A. U. Thor");
MODULE_DESCRIPTION("Description");
MODULE_LICENSE("GPL");
extern int asm_init(void);
int main_init(void)
{
return asm_init();
}
module_init(main_init);
```
*main.asm:*
```x86asm
[bits 64]
global asm_init
asm_init:
xor rax, rax
ret
```
*Makefile:*

obj-m += test.o
test-objs := module.o main.o
$(KBUILD_EXTMOD)/main.o: main.asm
nasm -f elf64 -o $@ $^

obj-m += memory_asm.o
memory_asm-objs := module.o main.o
$(KBUILD_EXTMOD)/main.o: $(src)/main.asm
nasm -f elf64 -o $@ $^ && echo "" > $(src)/.main.o.cmd

Build using command: `make -C <path_to_kernel_src> M=$PWD`
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through