linux-通过ASM代码处理syscall

我正在用此代码块替换/挂钩__NR_read sysall(该代码块已编译并作为操作码保存在内核模块的可执行内存中)

push rbp;
mov rbp, rsp;
sub rsp, 64; //8 bytes for rax content + 48 bytes for 6 args + 8 bytes for syscall result

mov [rsp], rax;
mov [rsp - 8], rdi;
mov [rsp - 16], rsi;
mov [rsp - 24], rdx;
mov [rsp - 32], r10;
mov [rsp - 40], r8;
mov [rsp - 48], r9;

mov rax, &atomic_inc;
mov rdi, &iter->counter;
call rax;

mov rax, [rsp];
mov rdi, [rsp - 8];
mov rsi, [rsp - 16];
mov rdx, [rsp - 24];
mov r10, [rsp - 32];
mov r8, [rsp - 40];
mov r9, [rsp - 48];
syscall;

mov [rsp - 56], rax;

mov rax, &iter->fake_syscall_function; //<-- this is inside the kernel module
mov rdi, [rsp - 8];
mov rsi, [rsp - 16];
mov rdx, [rsp - 24];
mov rcx, [rsp - 32];
mov r8, [rsp - 40];
mov r9, [rsp - 48];
call rax;

mov rax, &atomic_dec;
mov rdi, &iter->counter;
call rax;

mov rax, [rsp - 56];

mov rsp, rbp;
pop rbp;
ret;

现在,这假装要做:

>保存系统调用参数
>使用指向包含atomit_t数据的内存的参数调用atomic_inc
>调用真正的系统调用
>保存返回值
>使用先前保存的参数调用挂接的syscall(用于监视syscall,也就是使用调用的参数)
>调用atomic_dec
>将结果从调用返回到实际的syscall(将其放在rax中)

编译操作码,并在运行时修补函数的地址(伪造的syscall,atomic_int和atomic_dec).
在运行时修补后,操作码如下所示:

554889e54883ec404889042448897c24f848897424f048895424e84c895424e04c894424d84c894c24d048b860621fa0ffffffff48bf000433250088ffffffd0488b0424488b7c24f8488b7424f0488b5424e84c8b5424e04c8b4424d84c8b4c24d00f0548894424c848b8f0701fa0ffffffff488b7c24f8488b7424f0488b5424e8488b4c24e04c8b4424d84c8b4c24d0ffd048b870621fa0ffffffff48bf000433250088ffffffd0488b4424c84889ec5dc3

我正在使用http://www.onlinedisassembler.com/odaweb/来检查一切是否正确,这是正确的,但是无论如何,我尝试这些更改的virtualbox崩溃了.

我的问题是:您能发现我的代码有什么问题吗? (因为我无法提供有关该错误的更多详细信息,因为我无法自己获得这些信息).

问候

解决方法:

ODA向我显示this

.data:0x0000005d    4c8b4c24d0  mov    r9,QWORD PTR [rsp-0x30]
.data:0x00000062    0f05    syscall
.data:0x00000064    48894424c8  mov    QWORD PTR [rsp-0x38],rax

那么,SYSCALL是什么?

可能是指系统调用处理例程的CALL(例如sys_read).因此,在这种情况下,必须调用sys_read …

上一篇:linux nasm将AL中的值上移到AX


下一篇:2020年最新 C# .net 面试题,月薪20K+中高级/架构师必看(4)