使用ASM检索寄存器值

问题描述 投票:0回答:1

我想获取用户进程的寄存器,并正在考虑使用asm这样操作:

int regVal;
asm("movl %%eax, %0" : "=r"(regVal) :);

对于调用asm的用户进程,该调用会更改进程的寄存器吗?我担心指令指针从asm调用更改为更改。

是否有一种更简单的方法可以一次存储/检索用户进程中所有寄存器的值?

编辑:我的编译器是Apple clang版本11.0.0(clang-1100.0.33.17)

c
1个回答
0
投票

由于您使用的是Apple clang,最合理的方法是创建一个单独的程序集文件,对其进行汇编并将其链接到您的项目。您可以为每个寄存器创建单独的方法,就像这样。

getregs.s

.intel_syntax noprefix
.text


.global _getrax
_getrax:
    ret


.global _getrdx
_getrdx:
    mov rax,rdx
    ret

.global _getrcx
_getrcx:
    mov rax,rcx
    ret

.global _getrbx
_getrbx:
    mov rax,rbx
    ret

在您的C代码中,您只需声明原型并调用方法

main.c

#include <stdio.h>
uint64_t getrax(void);
uint64_t getrcx(void);
uint64_t getrdx(void);
uint64_t getrbx(void);
int main(int argc, const char * argv[]) {
    printf("%p\n",getrdx());
    return 0;
}

然后在终端中组装getregs.s文件

clang -c getregs.s -o getregs.o

然后,您将编译目标文件并将其链接到main.c文件

clang main.c getregs.o -o main

然后运行

./main

它将打印您的注册信息

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