x86-64 相关问题

x86-64是Intel x86架构的64位扩展

在汇编 x86-64 中使用 64 位乘积和 32 位整数的商

开始学习汇编x86-64,我正在编写一个程序,获取整数数组并对其进行一些计算,目的与问题无关,但计算包括

回答 1 投票 0

在汇编 x86-64 中使用大整数

开始学习汇编x86-64,我正在编写一个程序,获取整数数组并对其进行一些计算,目的与问题无关,但计算包括

回答 1 投票 0

我的内核模块不挂钩系统调用,如何解决这个问题?

内核模块代码 #包括 #包括 #包括 #包括 #包括 #包括 内核模块代码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/kprobes.h> #include <linux/syscalls.h> #include <linux/uaccess.h> #include <linux/fs.h> MODULE_LICENSE("GPL"); static void my_write_cr0(long value) { __asm__ volatile("mov %0, %%cr0" :: "r"(value) : "memory"); } #define disable_write_protection() my_write_cr0(read_cr0() & (~0x10000)) #define enable_write_protection() my_write_cr0(read_cr0() | 0x10000) unsigned long* sys_call_table_address; asmlinkage int (*original_chmod)(const char __user*, umode_t); static struct kprobe kp = { .symbol_name = "kallsyms_lookup_name" }; typedef unsigned long (*kallsyms_lookup_name_t)(const char* name); unsigned long* get_sys_call_table_address(void) { kallsyms_lookup_name_t kallsyms_lookup_name; int ret = register_kprobe(&kp); if (ret < 0) { printk(KERN_ERR "InterceptChmod: register_kprobe failed, returned %d\n", ret); return NULL; } kallsyms_lookup_name = (kallsyms_lookup_name_t)kp.addr; unregister_kprobe(&kp); if (!kallsyms_lookup_name) { printk(KERN_ERR "InterceptChmod: kallsyms_lookup_name not found\n"); return NULL; } unsigned long* address = (unsigned long*)kallsyms_lookup_name("sys_call_table"); if (!address) { printk(KERN_ERR "InterceptChmod: sys_call_table not found\n"); } else { printk(KERN_INFO "InterceptChmod: sys_call_table address: %p\n", address); } return address; } asmlinkage int custom_chmod(const char __user* filename, umode_t mode) { char fname[256]; // Copy the filename from user space to kernel space if (strncpy_from_user(fname, filename, sizeof(fname)) > 0) { fname[sizeof(fname) - 1] = '\0'; // Ensure null termination printk(KERN_INFO "InterceptChmod: chmod intercepted for file: %s, mode: %o\n", fname, mode); } else { printk(KERN_INFO "InterceptChmod: chmod intercepted, failed to get filename, mode: %o\n", mode); } // Call the original chmod system call return original_chmod(filename, mode); } static int __init intercept_chmod_init(void) { printk(KERN_INFO "InterceptChmod: Loading module\n"); sys_call_table_address = get_sys_call_table_address(); if (!sys_call_table_address) { printk(KERN_ERR "InterceptChmod: Failed to get sys_call_table_address\n"); return -EFAULT; } printk(KERN_INFO "InterceptChmod: sys_call_table address: %p\n", sys_call_table_address); original_chmod = (void*)sys_call_table_address[__NR_chmod]; printk(KERN_INFO "InterceptChmod: Original chmod address: %p\n", original_chmod); disable_write_protection(); sys_call_table_address[__NR_chmod] = (unsigned long)custom_chmod; enable_write_protection(); printk(KERN_INFO "InterceptChmod: Hooked chmod system call, new address: %p\n", (void*)sys_call_table_address[__NR_chmod]); return 0; } static void __exit intercept_chmod_exit(void) { if (sys_call_table_address) { disable_write_protection(); sys_call_table_address[__NR_chmod] = (unsigned long)original_chmod; enable_write_protection(); printk(KERN_INFO "InterceptChmod: Restored original chmod system call, address: %p\n", (void*)sys_call_table_address[__NR_chmod]); } printk(KERN_INFO "InterceptChmod: Module unloaded\n"); } module_init(intercept_chmod_init); module_exit(intercept_chmod_exit); 我使用 Linux 6.8.11-amd64、OracleVM VirtualBox 和 X86_64 处理器。 我使用以下方式加载模块: sudo insmod lkm_chmod.ko 然后我测试他的使用命令 sudo chmod 755 testfile他没有记录这个。 我的日志看起来像这样。 [ 9245.540511] InterceptChmod: Loading module [ 9245.561100] InterceptChmod: sys_call_table address: 00000000d760dd16 [ 9245.561105] InterceptChmod: sys_call_table address: 00000000d760dd16 [ 9245.561106] InterceptChmod: Original chmod address: 0000000014a7fad1 [ 9245.561110] InterceptChmod: Hooked chmod system call, new address: 00000000ce1988d5 [ 9330.452750] InterceptChmod: Restored original chmod system call, address: 0000000014a7fad1 [ 9330.452766] InterceptChmod: Module unloaded 我不明白为什么他不工作,我的日志中没有错误。我尝试将 __NR_chmod 更改为 __NR_open 或 __NR_close,但他不起作用。 我尝试使用 ChatGPT,他只说废话,只是重复我的代码。 好吧,我在这个答案中找到了解决方案answer。感谢 Ian Abbott 指出在 6.9 及更早版本中 sys_call_table 不再有效。 现在我修复了代码,他开始使用kprobes工作。 #include <linux/kprobes.h> #include <linux/ptrace.h> static int sys_read_kprobe_pre_handler(struct kprobe* p, struct pt_regs* regs) { printk(KERN_NOTICE "ROOTKIT: read(%ld, 0x%lx, 0x%lx)\n", regs->di, regs->si, regs->dx); return 0; } struct kprobe syscall_kprobe = { .symbol_name = "__x64_sys_read", .pre_handler = sys_read_kprobe_pre_handler, }; static int __init startup(void) { int err; err = register_kprobe(&syscall_kprobe); if (err) { pr_err("register_kprobe() failed: %d\n", err); return err; } printk(KERN_NOTICE "ROOTKIT: Starting of due"); return 0; } static void __exit shutdown(void) { unregister_kprobe(&syscall_kprobe); printk(KERN_NOTICE "ROOTKIT: Ending"); } module_init(startup); module_exit(shutdown); MODULE_LICENSE("GPL");

回答 1 投票 0

ModR/M 历史记数法 /0.../7

在学习x64时,我很难理解intel手册中的一些符号。 我们来看看0xC7 MOV: 关于 /0../7 它说: 从历史上看,该文档仅指定了 ModR/M.reg ...

回答 1 投票 0

8 字节 std::array 比较似乎会为 char 与 std::byte 生成不同的程序集,这是否有原因?

我注意到 8 字节 std::array 比较似乎产生与 bit_casting 不同的程序集。 GCC 似乎做了我对 char 数组的期望,但是 clang 生成了一个额外的 mov 指令(溢出...

回答 1 投票 0

为什么在这个例子中gcc没有为局部变量分配空间? [重复]

这是我用gcc编译的C代码 - #包括 #包括 int sum(int arr[20]) { 整数s = 0; 对于 (int i = 0; i < 20; i++) s += arr[i]; retur...

回答 1 投票 0

手动添加的部分对 PE 文件的切片引用错误

我正在用 Rust 制作一个打包器。打包器/src/main.rs: #[link_section = ".pe"] #[用过的] 静态 mut PE: &[u8] = &[]; fn 主() { 不安全{ rspe::reflective_loader(常见::

回答 1 投票 0

为什么 for 循环复制无法在一个核心上实现峰值 CPU-RAM 带宽?

我希望使用简单的 for 循环复制数组来实现我的机器的峰值带宽,但事实并非如此。我使用输入 3GB 运行以下示例代码,确保它不会交换。它...

回答 1 投票 0

64 位 DLL wine 包装器的规范文件

尝试为 Windows 64 位 DLL 的 WINE 包装器创建规范文件。 在 32 位等效项目中,spec 文件可能包含如下内容: @stdcall foo(long ptr)Proxyfoo 我...

回答 1 投票 0

在x86_64 Linux NASM中,一行上可以有多个操作码吗?

在 C 语言中,你可以在一行中包含多个内容,如下所示: 整数a;整数 b = 1; a = b; 你能在装配中做到这一点吗? 我尝试在许多网站上搜索此内容并在一些问题上寻求帮助...

回答 1 投票 0

如何跨不同架构更改Docker镜像中文件的扩展属性并保存更改?

我正在跨不同架构(x86_64 和 ARM)使用 Docker 映像。我需要更改这些 Docker 映像中一些可执行文件的扩展属性 (xattrs) 并保存这些

回答 1 投票 0

为什么这个三元组比等效的 if 生成更多的 Assembly?

所以论坛上有人问为什么这个C函数(我添加了const和restrict,以防万一): void foo(int *const 限制 dest, const int *const 限制源) { *目的地=(*来源!= -...

回答 1 投票 0

ld 和 gcc 无法链接 glibc 获取汇编代码

我正在尝试编译一个调用 C 函数的汇编程序。作为测试,我正在创建一个可怕的 hello world,从 stdio.h 调用 printf 。 C 版本应该类似于 #包括<

回答 1 投票 0

C 中有 256 位整数类型吗?

操作系统:Linux (Debian 10) 抄送:海湾合作委员会8.3 CPU:i7-5775C GCC中有一个unsigned __int128/__int128,但是GCC中有没有办法有一个uint256_t/int256_t? 我读过一个 __m256i,它似乎来自

回答 3 投票 0

使用指令集扩展进行编译

据我了解,当我在 Visual Studio for x64 中进行编译时,它使用的是 x86-64 ISA 的某些基线版本。 英特尔的较新指令集是旧指令集的超集,所以如果我愿意

回答 1 投票 0

程序集 ASCII 验证的意外行为

我对汇编非常陌生,目前正在尝试编写一个程序,该程序使用用户指定的密钥和用户指定的内容执行凯撒加密。键和内容必须是 a-z 或...

回答 2 投票 0

无法在使用 Python 3.10.12 的 Ubuntu 22.04 上安装 TensorFlow 2.16.1

我尝试使用 pip 在 Ubuntu 22.04 系统上安装 TensorFlow 2.16.1,但我一直遇到错误,提示找不到匹配的发行版。以下是我的系统的详细信息: 操作系统:

回答 1 投票 0

在 x86-64 上编码“MOV EAX,moffs32”

我在尝试理解 x86-64 时偶然发现了“MOV EAX, moffs32”指令。 据我所知,这条指令将被编码(moffs32 为 0x12345678)为 j...

回答 1 投票 0

现在在 x86-64 上还值得使用 Quake 快速逆平方根算法吗?

具体来说,这是我正在谈论的代码: 浮点 InvSqrt(浮点 x) { 浮点数 xhalf = 0.5f*x; int i = *(int*)&x; // 警告:严格别名 UB,请使用 memcpy 代替 我 = 0x5f375a8...

回答 1 投票 0

64 位 ELF 可执行文件中的数据和堆栈对齐

我在主函数的开头声明了这些变量: 字符 v4[44]; int fd; 无效*缓冲区; int v7; 调试可执行文件(64 位),我注意到有一个 4 字节填充

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.