x86-64 相关问题

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

SIMD 性能减慢两倍,无需额外复制

我一直在优化一些代码,并偶然发现了一些特殊的情况。 下面是两个汇编代码: ;快速地 lea rcx,[rsp+50h] 调用 qword ptr [Random_get_float3] ;这个函数...

回答 1 投票 0

Visual Studio 中的外部汇编文件

我搜索后发现无法在Visual Studio中的x64中使用__asm。相反,我必须使用外部汇编文件。 如何将外部程序集文件添加到我的 Win32 控制台项目中? 我怎样才能...

回答 1 投票 0

我可以使用“gcc -m64”而不是“x86_64-elf-gcc”

我在网上下载了一个小项目,该项目的管理员使用x86_64-elf-gcc,但我这里没有,我可以使用gcc -m64代替吗 如果不是,安装 x86_64-elf-gcc 的最快方法是什么,

回答 2 投票 0

带有 VEX 前缀的指令的 REX 编码

[x64] 是否有一些通用算法可以用来确定 rex 字节的相关寄存器?我对带有 VEX 前缀的指令的 REX 计算特别感兴趣(所以...

回答 1 投票 0

如何修复汇编计算器代码中的 IMUL 和 DIV 错误?

我目前正在学习汇编语言并尝试编写一个简单的计算器程序。该程序应该从 stdin 读取两个数字和一个运算符(+、-、*、/),执行指定的

回答 1 投票 0

无法在arm64上启动完整的colima和docker引擎作为x86_64

上个月我花了相当多的时间试图弄清楚如何在我的 Mac Pro M2 Max 上以 x86_64 运行 colima 和 docker 引擎。 一切都来自于缺失的兼容架构......

回答 1 投票 0

调试程序集以调用 IUnknown::Release - 阴影空间正确吗?

我遇到一个错误,有时此代码可以工作,有时却不能: 48 8B 41 08 ; MOV RAX, [RCX + 0x08] 获取引用计数 48 FF C8;十月 RAX ;递减

回答 1 投票 0

clang (LLVM) 内联汇编 - 具有无用溢出/重新加载的多重约束

clang / gcc:当操作数可以满足寄存器或内存位置时,某些内联汇编操作数可以满足多个约束,例如“rm”。举个例子,...

回答 1 投票 0

如何让 NASM 使用符号扩展的 16 位立即数对推送进行编码?

使用 nasm 组装以下内容时: 位 64 推32767 我得到 68 ff 7f 00 00 这对我来说很有趣,因为这是 32b 编码(push dword) - 为什么它不诉诸 16b

回答 1 投票 0

NASM 生成的奇怪推送指令编码

使用 nasm 组装以下内容时: 位 64 推32767 我得到 68 ff 7f 00 00 这对我来说很有趣,因为这是 32b 编码(push dword) - 为什么它不诉诸 16b

回答 1 投票 0

在汇编 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

© www.soinside.com 2019 - 2024. All rights reserved.