从具有此代码段的模块代码中,我尝试更改CS寄存器的值:
asm("pushq %rax");
asm("mov $0x10,%rax");
asm("mov %rax,%cs");
asm("popq %rax");
Run Code Online (Sandbox Code Playgroud)
实际上,CS寄存器包含段选择器- $0x10,也是内核宏返回的该值__KERNEL_CS。我想做的是用完全相同的值重写CS寄存器。不幸的是,我遇到了错误,没有摘要,则没有错误。
Aug 1 20:26:37 myhost kernel: [ 2905.693297] invalid opcode: 0000 [#1] SMP
Aug 1 20:26:37 myhost kernel: [ 2905.694223] CPU: 0 PID: 7140 Comm: insmod Tainted: P OE 4.4.0-148-generic #174~14.04.1-Ubuntu
Aug 1 20:26:37 myhost kernel: [ 2905.694362] task: ffff88007a0edb00 ti: ffff880068c54000 task.ti: ffff880068c54000
Aug 1 20:26:37 myhost kernel: [ 2905.694420] RIP: 0010:[<ffffffffc114e114>] [<ffffffffc114e114>] hello_init+0x44/0xe0 [hello_module]
Aug 1 20:26:37 myhost kernel: [ 2905.694497] RSP: 0018:ffff880068c57ca0 EFLAGS: 00010282 …Run Code Online (Sandbox Code Playgroud) 我发现可能是通过SGDT汇编命令读取GDTR。我将这段程序集插入我的C代码中Error: operand type mismatch for 'sgdt'
unsigned long j;
asm("sgdt %0" : "=r"(j));
Run Code Online (Sandbox Code Playgroud)