- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为了熟悉寄存器,我一直在重新编码一个没有使用 PTRACE_SYSCALL 的迷你 strace 程序。
因此在我的代码中使用 ptrace(PTRACE_GETREGS, ...) 设置 user_reg_struct 字段后,我使用 ptrace(PTRACE_PEEKDATA, ...) 从中读取数据。
我真的不知道如何处理该函数的返回以使用它的数据(系统调用等...),我开始查看一些代码并遇到类似的事情:
int is_a_syscall() {
struct user_reg_struct regs;
unsigned short int ret;
ret = ptrace(PTRACE_PEEKDATA, pid, regs.rip, 0);
if (ret == 0xFFFF) {
perror("failed")
exit(1); }
if (ret == 0x80CD || ret == 0x50F)
return (true);
return (false);
}
现在有人可以向我解释 if() 语句中的数字是什么,也就是:
我想知道它们是什么,我在哪里可以找到它们,我可以解释它们以及我如何使用它们来获取我的系统调用和它们的参数。
最佳答案
您包含的代码有些不同寻常,所以我将解释它的作用,然后展示一种不同的实现方式。
unsigned short int ret;
ret = ptrace(PTRACE_PEEKDATA, pid, regs.rip, 0);
Linux 上的 ptrace 返回一个 long,而不是一个 unsigned short。代码的作者只是在查看 ptrace 返回的 4 或 8 字节中的低位 2 字节。因为 x86 是 little-endian ,这样就完成了工作,但我稍后会展示另一种方法。
if (ret == 0xFFFF) {
perror("failed")
exit(1); }
ptrace 失败时返回 -1。由于代码仅存储返回值的低位 2 个字节,并将该值视为无符号,因此 -1 的测试改用 0xFFFF
。
由于 ptrace(PTRACE_PEEKDATA, ...)
即使在成功时也可以返回 -1,因此最好也查看 errno
(我将展示这个稍后)。
if (ret == 0x80CD || ret == 0x50F)
return (true);
return (false);
您可以在 http://ref.x86asm.net/coder64.html 等网站上找到操作码列表. CD
是 int
而 CD80
是 int 80
而 0F05
是 syscall
。这是 x86 Linux 中用于执行系统调用的两个操作码。更多信息请访问 What is better “int 0x80” or “syscall”? .
这是检查系统调用指令的另一种方法(未经测试):
int is_a_syscall(regs)
struct user_reg_struct regs;
{
long ret;
unsigned char primary, secondary;
extern int errno;
errno = 0;
ret = ptrace(PTRACE_PEEKTEXT, pid, regs.rip, 0);
if (ret == -1 && errno != 0) {
perror("failed")
exit(1);
}
primary = (unsigned)0xFF & ret;
secondary = ((unsigned)0xFF00 & ret) >> 8;
if (primary == 0xCD && secondary == 0x80 || primary == 0x0F && secondary == 0x05)
return true;
return false;
}
我使用了 ptrace 返回值的全宽。如果它是 -1 并且 errno
已被设置,则表示错误。我还使用 PTRACE_PEEKTEXT
而不是 PTRACE_PEEKDATA
,尽管在 x86 上这无关紧要。位掩码用于获取主要和次要操作码字节。
how can I use them to get my system calls and their arguments.
为此,请参阅此详细答案:What are the calling conventions for UNIX & Linux system calls on x86-64 .
关于c - 如何解释 PTRACE_PEEKTEXT 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43412297/
为了熟悉寄存器,我一直在重新编码一个没有使用 PTRACE_SYSCALL 的迷你 strace 程序。 因此在我的代码中使用 ptrace(PTRACE_GETREGS, ...) 设置 user_
我是一名优秀的程序员,十分优秀!