首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Ptrace在子进程中读取errno值

Ptrace是一个系统调用,用于跟踪和控制进程的执行。它可以在子进程中读取errno值,errno是一个全局变量,用于表示最近发生的错误代码。

在子进程中读取errno值可以通过以下步骤实现:

  1. 使用fork()系统调用创建一个子进程。
  2. 在子进程中使用ptrace(PTRACE_TRACEME, 0, NULL, NULL)启用跟踪。
  3. 子进程执行需要被跟踪的代码,当发生错误时,errno会被设置为相应的错误代码。
  4. 子进程使用ptrace(PTRACE_PEEKUSER, child_pid, sizeof(long) * (offsetof(struct user, u_error)), NULL)读取子进程的errno值。
  5. 子进程使用ptrace(PTRACE_DETACH, child_pid, NULL, NULL)结束跟踪。

Ptrace的优势在于它可以实现对进程的全面跟踪和控制,包括读取和修改寄存器、内存和文件等。它在调试、性能分析和安全审计等领域有广泛的应用。

在云计算领域,Ptrace可以用于监控和调试云上的应用程序,帮助开发人员快速定位和修复问题。腾讯云提供了一系列与云计算相关的产品,如云服务器、云函数、容器服务等,可以帮助用户构建和管理云上的应用环境。

腾讯云产品链接:

  • 云服务器:https://cloud.tencent.com/product/cvm
  • 云函数:https://cloud.tencent.com/product/scf
  • 容器服务:https://cloud.tencent.com/product/tke

请注意,以上答案仅供参考,具体的技术实现和产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux Hook 笔记

系统调用号59是__NR_execve, 由进程调用的execl产生. 在上面的例子我们可以看见, 父进程fork了一个进程,并且进程中进行系统调用....执行调用前,进程运行了ptrace,并设置第一个参数为PTRACE_TRACEME, 这告诉内核当前进程正在被追踪. 因此当进程运行到execl时, 会把控制权转回父进程....当系统调用出现的时候, 内核会保存原始的rax寄存器(其中包含系统调用号), 我们可以从子进程的USER段读取这个, 这里是使用ptrace并且设置第一个参数为PTRACE_PEEKUSER....系统调用追踪, 常见的流程如下图所示: ptrace 读取系统调用参数 系统调用的参数按顺序存放在rbx,rcx…之中,因此以write系统调用为例看如何读取寄存器的: #include <sys...程序WIFEXITED函数(宏)用来检查进程是被ptrace暂停的还是准备退出, 可以通过wait(2)的man page 查看详细的内容.

2.7K60

如何利用Ptrace拦截和模拟Linux系统调用

但问题在于,一个进程一次只能够绑定一个tracer,因此我们无法调试进程(GDB)的过程模拟出一套外部操作系统,而另一个问题就是模拟系统调用将耗费更多的资源开销。..., 0, 0, 0); execvp(argv[1], argv + 1); FATAL("%s", strerror(errno)); } 父进程将使用wait(2)来等待进程的...PTRACE_TRACEME,当wait(2)返回之后,进程将会被挂起: wait pid(pid,0, 0); 允许进程继续运行之前,我们将告诉操作系统tracee应该跟它的父进程一起终止。...下一步就是收集系统调用信息,不同的系统架构这一步的实现方式也不同。x86-64,系统调用号是通过rax传递的,参数(最大为6)将传递给rdi、rsi、rdx、r10、r8和r9。...读取寄存器还需要其他的Ptrace调用,但这里就不需要wait(2)了,因为tracee并不会改变状态。

1.8K70

如何在父进程读取(外部)进程的标准输出和标准错误输出结果

最近接手一个小项目,要求使用谷歌的aapt.exe获取apk软件包的信息。依稀记得去年年中时,有个同事也问过我如何获取被调用进程的输出结果,当时还研究了一番,只是没有做整理。...这个问题,从微软以为为我们考虑过了,我们可以从一个API可以找到一些端倪——CreateProcess。...它是我们启动进程时,控制进程启动方式的参数。...我们之后将hWrite交给我们创建的进程,让它去将信息写入管道。而我们父进程,则使用hRead去读取进程写入管道的内容。...delete [] pBuffer; wprintf(L"%s", cstrBuffer); } return 0; }         这样,我们就可以拿到进程输出结果并加以分析

3.7K10

Linux ptrace 的实现

这里选用了 1.2.13 的早期版本,原理是类似的,新版内核代码过多,没必要陷入过多细节。 1 进程调试 ptrace 系统调用的实现包含了很多功能,首先来看一下单步调试的实现。...通过 ptrace 实现单步调试的方式有两种。 1. 父进程执行 fork 创建一个进程,通过 ptrace 设置进程为 PF_PTRACED 标记,然后执行 execve 加载被调试的程序。...,可以通过 sys_ptrace 控制进程,sys_ptrace 还提供了很多功能,比如读取进程的数据。...// pid 为进程 id num = ptrace(PTRACE_PEEKUSER, pid, ORIG_RAX * 8, NULL); 这个就不展开了,主要是内存的校验和数据读取。...也就是说,进程执行一个指令后,就会被中断,然后系统会给被调试进程发送 SIGTRAP 信号。同样,被调试进程信号处理函数里,通知父进程,从而控制权又回到了父进程手中,如此循环。

1.4K20

【Android 逆向】代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )

逆向】代码调试器开发 ( 代码调试器功能简介 | 设置断点 | 读写内存 | 读写寄存器 | 恢复运行 | Attach 进程 ) , 介绍了 attach 被调试进程 ; 之后需要 等待 被调试...进程的状态改变 , 如果进入处于被调试的状态下 , 其进程的状态会发生变化 ; 被调试进程一旦进程处于被调试状态 , 就会处于 WUNTRACED 状态 , WUNTRACED 是宏定义 为 2 ;...被调试进程 if (ptrace(PTRACE_ATTACH, nPid, NULL, 0) < 0) { LOGE("error[%d][%s]", errno, strerror(errno...为 2 waitpid(nPid, &status, WUNTRACED); return PTERR_SUCCESS; } 需要状态返回变化时 , 才需要调用 waitpid() 方法 , 等待进程状态改变...; 本操作不需要等待 被调试进程 状态返回变化 ; 三、调试中继续运行程序 PTRACE_CONT ---- 调试过程 , 如果需要被调试进程继续运行 , 运行到下一个断点或者运行一行代码 , 调用

34910

Node.js 通过进程操作标准输入输出

翻译:疯狂的技术宅 原文:http://2ality.com/2018/05/child-process-streams.html ,我们 Node.js 把 shell 命令作为进程运行。...进程运行 shell 命令 首先从进程运行 shell 命令开始: 1const {onExit} = require('@rauschma/stringio'); 2const {spawn... A 行,我们将进程的 stdin 连接到当前进程的 stdin。 B 行等待该过程完成。 等待进程通过 Promise 退出 函数 onExit()如下所示。...从子进程读取数据 下面的代码使用异步迭代(C行)来读取进程的 stdout 的内容: 1const {chunksToLinesAsync, chomp} = require('@rauschma...进程之间进行管道连接 在下面的例子,函数transform() 将会: 从 source 进程的 stdout 读取内容。 将内容写入 sink 进程的 stdin。

3.2K30

.NETC# 64 位进程读取 32 位进程重定向后的注册表

我们知道,32 位程序在读取注册表的时候,会自动将注册表的路径映射到 32 位路径下,即在 Wow6432Node 节点下。但是 64 位程序不会映射到 32 位路径下。...如何在 64 位程序读取 32 位注册表路径 前面我们的例子代码是这样的: 1 var value = RegistryHive.LocalMachine.Read(@"SOFTWARE\Walterlv..."); 可以看到,相同的代码, 32 位和 64 位进程下得到的结果是不同的: 32 位进程 32 位系统上,64 位进程 64 位系统上,读取的路径会是传入的路径; 32 位进程 64 位系统上...那么如何在 64 位进程读取 32 位注册表路径呢? 方法是在打开注册表项的时候,传入 RegistryView.Registry32。...1 RegistryKey.OpenBaseKey(root, RegistryView.Registry32); Walterlv.Win32 可以我的 GitHub 仓库查看完整的实现。

22830

python threading如何处理主进程线程的关系

1.使用join函数后,主进程会在调用join的地方等待线程结束,然后才接着往下执行。...这里创建了5个线程,每个线程随机等待1-10秒后打印退出;主线程分别等待5个线程结束。最后结果是先显示各个子线程,再显示主进程的结果。 2....如果使用的setDaemon函数,则与join相反,主进程结束的时候不会等待线程。...、如果没有使用join和setDaemon函数,则主进程创建线程后,直接运行后面的代码,主程序一直挂起,直到线程结束才能结束。...:2.9418249130249023秒 以上这篇python threading如何处理主进程线程的关系就是小编分享给大家的全部内容了,希望能给大家一个参考。

2.7K10

调试器之工作原理

以x86的INT3指令为例,一个位置设置断点后会保存该位置的原指令,之后该位置写入INT3,当执行到这条指令的时候发生软中断,内核向进程发送SIGTRAP信号,之后这个信号转发给父进程,此时再用保存的指令替换之前写入的...x86 debug register - Wikipedia cpu执行代码之前会先确定要执行的地址是否保存在中断寄存器,同时确认访问的地址是否处于设置了硬件断点的区域内,满足条件后会触发INT1断...ptrace Linux我们可以直接通过ptrace来打断点、读取信息或者是单步执行等。...而调试器进程本身则是通过wait去等待进程停下来,等wait返回后就可以查看进程的信息或者对子进程进行操作。...其他系统 以上ptrace的实现都是基于Linux的api来讲的,macOS的ptrace的request缺少非常多基本功能,比如说读取寄存器的

58610

linux-沙盒入门,ptrace从0到1

简介 Ptrace 可以让父进程控制进程运行,并可以检查和改变子进程的核心image的功能(Peek and poke 系统编程是很知名的叫法,指的是直接读写内存内容)。...当使用了ptrace跟踪后,所有发送给被跟踪的进程的信号(除了SIGKILL),都会被转发给父进程,而进程则会被阻塞,这时进程的状态就会被系统标注为TASK_TRACED,而父进程收到信号后,就可以对停止下来的进程进行检查和修改...,然后让进程继续运行。...3.代码注入 ptrace是Unix系列系统的系统调用之一,其主要功能是实现对进程的追踪,对目标进程,进行流程控制,用户寄存器读取和写入操作,内存进行读取和修改。...PTRACE_PEEKTEXT, PTRACE_PEEKDATA 从内存地址读取一个字节,内存地址由addr给出 PTRACE_ATTACH 跟踪指定pid 进程 PTRACE_GETREGS 读取所有寄存器的

3.4K30

自己动手写一个GDB|基本功能

所以,本文的约定是:在编写程序的过程,使用到的功能才会进行详细介绍。 简易的 GDB 我们要实现一个有如下功能的 GDB: 可以对一个可执行程序进行调试。 可以调试程序时,设置断点。...addr:如果要读取或者修改进程某个内存地址的内容,就可以通过这个参数指定。 data:如果要修改进程某个地址的内容,要修改的可以通过这个参数指定,配合 addr 参数使用。...EIP 寄存器指向的内存地址的 */ instr = ptrace(PTRACE_PEEKTEXT, debug_pid, regs.rip, 0); /* 打印当前执行的指令信息...*/ ptrace(PTRACE_SINGLESTEP, debug_pid, 0, 0); /* 5) 等待被调试进程(进程)发送信号 */ wait...通过调用 ptrace(PTRACE_GETREGS...) 来获取当前进程所有寄存器的。 4. 通过调用 ptrace(PTRACE_PEEKTEXT...) 来获取某个内存地址的。 5.

1.1K40

自己动手写一个 strace

之后,我们就会在 进程 运行被跟踪的程序,而在 父进程 运行跟踪进程的代码。 运行被跟踪程序 前面说过,被跟踪的程序需要在进程运行,而要运行一个程序,可以通过调用 execl() 系统调用。...所以可以通过下面的代码,进程运行 ls 命令: #include #include int main(int argc, char *argv[])...这是因为当在进程调用 ptrace(PTRACE_TRACEME, 0, NULL, NULL) 后,并且调用 execl() 系统调用,那么子进程会发送一个 SIGCHLD 信号给父进程(跟踪进程)...由于上面的代码,父进程(跟踪进程)并没有发送任何调试命令就退出运行,所以进程(被跟踪进程没有运行的情况下就跟着父进程一起退出了,那么就不会看到任何效果。 现在我们开始编写跟踪进程的代码。...结构定义如下(文件 sys/user.h ): struct user_regs_struct { unsigned long r15,r14,r13,r12,rbp,rbx,r11,r10

47520

如何读取Linux进程的代码段和数据段

当运行这个程序时,系统也会给这个进程创建虚拟内存,然后把ELF的数据分别加载到内存的对应位置。本文整理了用cpp程序读取内存的代码段和rodata数据段的方法。...sys/ptrace.h。.../proc/pid/mem mem是内核创建的虚拟文件,是Linux的”一切皆文件”进程上的体现,但是这个文件无法直接进行读取,需要先利用ptrace进行绑定操作。...用ptrace绑定之后就可以用read来读取这个“文件”了,但是要注意输入读取的地址不对,也读不出数据来。...用程序读取内存的代码段和rodata数据段 以tcpdump程序为例,用程序读取代码段和radata的过程如下: 1.查看tcpdump的进程ID。

3.5K20

为什么无法用SIGTERM终止容器1号进程

kubernetes官网资料介绍停止一个pod时会先发送SIGTERM给Pod各个容器的1号进程实现优雅退出,实际使用容器时会有用户没有关注到如果容器1号进程执行的程序或者脚本如果缺少注册SIGTERM...返回sig_task_ignored的上一级函数sig_ignored,通过live crash可以看到进程的t->ptrace为0,所以最终 返回的是sig_task_ignored的返回: crash...SIGTERM信号,先获取下该终端的进程pid [root@VM-0-20-centos ~]# echo $$ 3492032 再另外一个终端执行perf trace跟pid 3492032发送的信号...= SIGKILL) return 0; .... } 当容器1号进程没有被strace时,ptrace为0,当执行了strace后被strace的进程...ptrace被设置为非0 crash> task_struct.ptrace ffff88815f908000 -x ptrace = 0x10289 crash> 当对容器1号进程做了strace

545111

【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器并存档 )

文章目录 一、调试进程 ATTACH 附着目标进程 二、读取目标函数寄存器并存档 1、主要操作流程 2、ptrace 函数 PTRACE_GETREGS 读取寄存器 一、调试进程 ATTACH 附着目标进程...---- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具的 main 函数分析 ) 博客 , main 函数获取了 进程号 PID , 下面开始将...); return 0; } 二、读取目标函数寄存器并存档 ---- 1、主要操作流程 声明两个结构体 , 分别用于寄存器操作 和 存档 , 存档的结构体一定不要写入数据 , 之后恢复寄存器时需要用到..., 调用 ptrace_getregs 函数 , 读取目标进程的寄存器 ; /* 获取寄存器 */ if (ptrace_getregs(target_pid, ®s) == -1)...读取寄存器 ptrace_getregs 函数 , 调用 ptrace(PTRACE_GETREGS, pid, NULL, regs) 方法 , 获取目标进程的寄存器数据 , 传入 PTRACE_GETREGS

42720

Android tombstone文件是如何生成的

现实生活墓碑一般是给死人准备的,而在android系统“墓碑”则是给进程准备的。 为何Android要设计出这样一个东西呢?...这里以微信app为例子说明 微信app首先是存储UFS,EMMC指令的存储设备上 当用户去点击微信app图标时,操作系统则会将微信app从Flash load到主存 肯定要去通过fork类似命令去创建对应的进程...)); return 1; } 伪线程通过fork去创建线程,新创建的线程调动通过execle系统调用去执行crash_dump64程序,而父进程则在这里等待crash_dump进程退出...fork出一个新进程,父进程通过read去等待进程,而进程继续执行crash_dump的任务 // Get the process name (aka cmdline)....::move(info); } } for循环遍历这个进程的所有线程,对每一个进程的线程进程ptrace操作,对目标线程读取其crashinfo。

5.2K20

用图文带你彻底弄懂GDB调试原理

/test的时候,操作系统里发生了很多复杂的事情: 系统首先会启动gdb进程,这个进程会调用系统函数fork()来创建一个进程,这个子进程做两件事情: 调用系统函数ptrace(PTRACE_TRACEME...“程序”描述的是一个静态的概念,就是一堆数据躺着硬盘上,而“进程”描述的是动态的过程,是这个程序被读取、加载到内存上之后,操作系统中有一个任务控制块(一个数据结构),专门用来管理这个进程的。...在上面的讲解进程调用ptrace系统函数时使用的参数是PTRACE_TRACEME,注意橙色文字:是进程调用ptrace,相当于进程对操作系统说:gdb进程是我的爸爸,以后你有任何想发给我的信号...如果想对一个已经执行的进程B进行调试,那么就要在gdb这个父进程调用ptrace(PTRACE_ATTACH,[其他参数]),此时,gdb进程会attach(绑定)到已经执行的进程B,gdb把进程B收养成为自己的进程...所以,不论是调试一个新程序,还是调试一个已经处于执行状态的服务程序,通过ptrace系统调用,最终的结果都是:gdb程序是父进程,被调试程序是进程进程的所有信号都被父进程gdb来接管,并且父进程

4.8K53

原来gdb的底层调试原理这么简单

“程序”描述的是一个静态的概念,就是一堆数据躺着硬盘上,而“进程”描述的是动态的过程,是这个程序被读取、加载到内存上之后,操作系统中有一个任务控制块(一个数据结构),专门用来管理这个进程的。...ptrace 系统函数是 Linux 内核提供的一个用于进程跟踪的系统调用,通过它,一个进程(gdb)可以读写另外一个进程(test)的指令空间、数据空间、堆栈和寄存器的。...这就涉及到 ptrace 系统函数的第一个参数了,这个参数是一个枚举类型的,其中重要的是2个:PTRACE_TRACEME,PTRACE_ATTACH。...在上面的讲解进程调用 ptrace 系统函数时使用的参数是PTRACE_TRACEME,注意橙色文字:是进程调用ptrace,相当于进程对操作系统说:gdb 进程是我的爸爸,以后你有任何想发给我的信号...把进程B收养成为自己的进程,而进程B的行为等同于它进行了一次 PTRACE_TRACEME 操作。

1.6K40
领券