系统调用,ptrace,go语言syscall

系统调用

内核实现了很多系统调用函数,为每个函数提供一个标识,也就是系统调用号,在不同的架构中可能不同。
通过syscall(2) man page可以看到完整的系统调用列表

系统调用的执行流程:

  1. 用户程序调用C库或者直接通过自身的汇编指令进行系统调用,需要传递的变量及系统的调用编号保存在CPU寄存器中;
  2. 进程进入内核态,通过寄存器保存的系统调用编号识别系统函数,并执行系统调用;
  3. 系统调用结束后,结果、返回值和参数保存在寄存器,用户程序获取结果

go提供了syscall包直接通过汇编代码进行系统调用。

ptrace

定义

long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
  • pid:要跟踪的进程ID
  • request:使用的ptrace请求

Go - syscall

数据结构

寄存器数据:syscall.PtraceRegs
状态数据:syscall.WaitStatus

封装的系统调用

PTRACE_ATTACH:func PtraceAttach(pid int) (err error)
PTRACE_DETACH:func PtraceDetach(pid int) (err error)
PTRACE_SYSCALL:func PtraceSyscall(pid int, signal int) (err error)
PTRACE_GETREGS:func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error)
等待状态改变:func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error)

存储位置

参考:https://man7.org/linux/man-pages/man2/syscall.2.html

x86_64

Orig_rax:系统调用时系统调用号
Rax:返回时返回值
regs.rdi - Stores the first argument
regs.rsi - Stores the second argument
regs.rdx - Stores the third argument
regs.r10 - Stores the fourth argument
regs.r8 - Stores the fifth argument
regs.r9 - Stores the sixth argument

arm/EABI

调用参数r0-r6
返回值r0,r1
调用号r7

读取方式

文件描述符int fd,通过/proc/pid/fd/%llu来读取filepath

sprintf(fdpath,"/proc/%u/fd/%llu",proc,regs.rdi);
size = readlink(fdpath, filepath, 256);  //this gives the filepath for a particular fd
filepath[size] = '\0';
printf("File-%s-\n", filepath);

指向缓冲区的指针void *buf,通过PTRACE_PEEKDATA / PTRACE_PEEKTEXT读取,ptrace一次返回8字节,所以要迭代读取数据,同时需要一个指针指向内存的开始位置,用于后续读取字符串。比如read参数第二个参数指示缓冲区位置,第三个参数指示长度

char message[1000];
char* temp_char2 = message;
int j = 0;
long temp_long;

while( j < (regs.rdx/8) ) //regs.rdx stores the size of the input buffer
{
    temp_long = ptrace(PTRACE_PEEKDATA, proc, regs.rsi + (j*8) , NULL);
    memcpy(temp_char2, &temp_long, 8);
    temp_char2 += sizeof(long);
    ++j;
}
message[regs.rdx] = '\0';
printf("Message-%s-\n\n", message);

参考链接

https://github.com/eaburns/ptrace
LinuGo - 用Go看到进程中发生的系统调用
linux 系统调用号表
ptrace手册
Linux System Call Table for x86 64
Extracting system call name and arguments using ptrace
strace 源码分析 (快速分析源码,半小时搞懂)
ptrace函数深入分析
strace 是如何工作的

go语言类似strace的项目

jfrabaute/libtrace
jfrabaute/gotrace
eaburns/ptrace
agis/gtrace(看起来还可以)
maebashi/go-strace
hugelgupf/go-strace(这个库很不错)
hugelgupf/go-strace/strace 文档

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Linux Hook 系统调用是指在 Linux 操作系统中,通过修改系统调用表来拦截和修改系统调用的行为。这种技术可以用于实现各种功能,如监控系统调用、实现安全策略、实现虚拟化等。Hook 系统调用的实现方式有多种,如使用内核模块、使用 LD_PRELOAD 环境变量、使用 ptrace 等。但是,Hook 系统调用也可能会带来一些安全风险,因此需要谨慎使用。 ### 回答2: Linux系统中的hook是一种通过修改系统内核来实现对系统或应用程序行为的改变的技术手段。hook技术的实现方式有很多种,比如LD_PRELOAD,在程序运行前拦截系统调用,重定向到用户编写的函数中,实现对系统调用进行Hook;也可以修改内核源代码,在内核中添加对指定系统调用的Hook函数,并重新编译部署内核。 在Linux系统中,Hook技术被广泛运用于安全防护、性能优化、监控记录等领域。安全防护方面,通过Hook技术可以拦截进程的系统调用,实现对安全攻击的检测和防范;在性能优化方面,Hook技术可以记录系统资源使用情况,进行优化分析;在监控记录方面,Hook技术可以通过修改系统调用返回值,实现对应用程序的状态监控和记录等功能。 Hook技术的实现需要一定的计算机专业知识和技能,同时也需要了解目标系统的内部运行机制和系统调用的使用方法。在使用时需要注意,Hook技术对系统稳定性和性能会产生影响,需要谨慎使用和调试。同时,在使用Hook技术时需要考虑到实现方式的兼容性、对日后维护的影响等问题,从而保证Hook技术的稳健性和长期有效性。 综上所述,在Linux系统中,Hook技术是一种应用广泛、有效性高的技术手段,可以实现对系统和应用程序行为的灵活定制和改变,通过对系统调用的拦截和修改,实现安全防护、性能优化、监控记录等多种功能。不过,在使用时需要注意风险和影响,选择合适的实现方式,从而确保Hook技术的有效性和稳健性。 ### 回答3: Linux 系统调用是操作系统的一个重要组成部分,它提供了应用程序与操作系统之间通信的桥梁,使得应用程序可以利用操作系统的功能进行各种操作。然而,在某些情况下,用户可能需要修改某些系统调用的行为或者监控它们的使用情况,这就需要使用 Linux hook 系统调用。 Linux hook 系统调用,也称为系统调用钩子,是一种在系统调用进行时拦截和修改系统调用的技术。其主要作用是通过程序实现拦截和修改系统调用的行为,以达到特定的目的。比如,通过修改文件访问系统调用的行为,可以对文件进行加密、解密和防止恶意软件操作等。 Linux hook 系统调用的实现方式有很多种,其中最常见的方式就是使用内核模块实现。内核模块是一种动态加载到内核中的代码,可以通过内核提供的对模块的管理函数进行加载、卸载和修改等操作。利用内核模块,可以实现对指定系统调用的拦截与修改,具体实现方法是通过在模块中添加指定系统调用的替代函数来实现。 除此之外,还可以使用 LD_PRELOAD 环境变量或者 ptrace 系统调用来实现 Linux hook 系统调用。其中,LD_PRELOAD 环境变量是一种可以动态加载库文件的方法,通过在 LD_PRELOAD 中指定某个库文件,可以在程序运行时优先加载该库文件,从而实现对系统调用的拦截;而 ptrace 系统调用则是一种常用的系统调用监控方法,可以用来检测系统调用调用次数、参数和返回结果等信息。 总体来说,Linux hook 系统调用是一种非常实用的技术,可以用来实现各种监控和安全保障功能。但是,在使用时需要注意保证系统的稳定性和安全性,避免出现非预期的系统崩溃或安全漏洞。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏打呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值