求大佬解释下ptrace的pt_regs的定义,而且分为i386 arm x86和aarch64的不同分支
2017-08-17 09:40
2541 查看
下个linux kernel,通常在arch/xxx/include下有ptrace.h(通常是,但不总是,找不到时不妨grep下),里面有相应结构的定义
收起回复
2楼
2017-08-12 11:41
举报 |个人企业举报垃圾信息举报
futureIDE: 我有看过asm/ptrace.h
linux/ptrace.h sys/ptrace.h的定义,但是只有i386和arm在asm/ptrace.h定义了pt_regs这个结构,x86和aarch64的没有
2017-8-12 12:03回复
futureIDE: 最主要的是,i386的pt_regs.eip或者arm的pt_regs.ARM_pc这种调用在aarch64下不能编译,我推测用了条件判断来定义了不同的pt_regs结构,但是我却找不到,只有i386和arm的
2017-8-12 12:07回复
futureIDE: 不好意思,说错了,是条件编译#if
2017-8-12 12:10回复
a126285: 回复 futureIDE :arch下按构架作目录划分,需要的定义得到相应的构架目录下去找,x86_64在arch/x86/include/uapi/asm/ptrace.h,有x86和x86_64两个的定义;aarch64在arm64/include/uapi/asm/ptrace.h,叫user_pt_regs
2017-8-12 12:52回复
a126285: 回复 futureIDE :那个uapi是user-space
api的缩写,给应用用的相关定义。内核自己用的结构定义在例如说include/asm下,aarch64的arm64/include/asm/ptrace.h里也定义了pt_regs,前半部分结构就是user_pt_regs,后半有多余的内容,但不一定会通过ptrace返回(需要看实现确定),所以,用uapi里面的较好
2017-8-12 12:55回复
我也说一句
还有3条回复,点击查看
a126285
小吧主
12
举个例子,有伪代码夹杂:
struct x86_regs {
uint32_t ebx, ecx, edx, esi;
uint32_t edi, ebp, eax, xds;
uint32_t xes, xfs, xgs, orig_eax;
uint32_t eip, xcs, eflags, esp;
uint32_t xss;
};
struct amd64_regs {
uint64_t r15, r14, r13, r12;
uint64_t rbp, rbx, r11, r10;
uint64_t r9, r8, rax, rcx;
uint64_t rdx, rsi, rdi, orig_rax;
uint64_t rip, cs, eflags, rsp;
uint64_t ss, fs_base, gs_base, ds;
uint64_t es, fs, gs;
};
if (x86平台) {
if (进程是64位) {
amd64_regs regs;
iov.iov_base = ®s;
iov.iov_len = sizeof(regs);
ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov);
// 使用_regs.eip等寄存器
} else {
x86_regs regs;
iov.iov_base = ®s;
iov.iov_len = sizeof(regs);
ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov);
// 使用_regs.rip等寄存器
}
}
收起回复
3楼
2017-08-12 13:35
举报 |个人企业举报垃圾信息举报
futureIDE:
多谢大佬
收起回复
2楼
2017-08-12 11:41
举报 |个人企业举报垃圾信息举报
futureIDE: 我有看过asm/ptrace.h
linux/ptrace.h sys/ptrace.h的定义,但是只有i386和arm在asm/ptrace.h定义了pt_regs这个结构,x86和aarch64的没有
2017-8-12 12:03回复
futureIDE: 最主要的是,i386的pt_regs.eip或者arm的pt_regs.ARM_pc这种调用在aarch64下不能编译,我推测用了条件判断来定义了不同的pt_regs结构,但是我却找不到,只有i386和arm的
2017-8-12 12:07回复
futureIDE: 不好意思,说错了,是条件编译#if
2017-8-12 12:10回复
a126285: 回复 futureIDE :arch下按构架作目录划分,需要的定义得到相应的构架目录下去找,x86_64在arch/x86/include/uapi/asm/ptrace.h,有x86和x86_64两个的定义;aarch64在arm64/include/uapi/asm/ptrace.h,叫user_pt_regs
2017-8-12 12:52回复
a126285: 回复 futureIDE :那个uapi是user-space
api的缩写,给应用用的相关定义。内核自己用的结构定义在例如说include/asm下,aarch64的arm64/include/asm/ptrace.h里也定义了pt_regs,前半部分结构就是user_pt_regs,后半有多余的内容,但不一定会通过ptrace返回(需要看实现确定),所以,用uapi里面的较好
2017-8-12 12:55回复
我也说一句
还有3条回复,点击查看
a126285
小吧主
12
举个例子,有伪代码夹杂:
struct x86_regs {
uint32_t ebx, ecx, edx, esi;
uint32_t edi, ebp, eax, xds;
uint32_t xes, xfs, xgs, orig_eax;
uint32_t eip, xcs, eflags, esp;
uint32_t xss;
};
struct amd64_regs {
uint64_t r15, r14, r13, r12;
uint64_t rbp, rbx, r11, r10;
uint64_t r9, r8, rax, rcx;
uint64_t rdx, rsi, rdi, orig_rax;
uint64_t rip, cs, eflags, rsp;
uint64_t ss, fs_base, gs_base, ds;
uint64_t es, fs, gs;
};
if (x86平台) {
if (进程是64位) {
amd64_regs regs;
iov.iov_base = ®s;
iov.iov_len = sizeof(regs);
ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov);
// 使用_regs.eip等寄存器
} else {
x86_regs regs;
iov.iov_base = ®s;
iov.iov_len = sizeof(regs);
ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov);
// 使用_regs.rip等寄存器
}
}
收起回复
3楼
2017-08-12 13:35
举报 |个人企业举报垃圾信息举报
futureIDE:
多谢大佬
相关文章推荐
- ZBar 支持i386 armv6 armv7 armv7s x86_64 arm64
- arm, arm64, i386, x86_64
- iOS armv7,armv7s,arm64,i386,x86_64 概念及制作对应的静态库
- iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a以及 FrameWork 的创建
- ZBar 支持i386 armv6 armv7 armv7s x86_64 arm64
- iOS 中的 armv7,armv7s,arm64,i386,x86_64 都是什么
- iOS 中的 armv7,armv7s,arm64,i386,x86_64
- IOS生成同时支持armv7,armv7s,i386 x86_64的静态库.a文件
- iOS关于armv7,armv7s,arm64,i386,x86_64等问题
- IOS中armv7,armv7s,arm64以及i386和x86_64讲解
- Xcode 中armv6 armv7 armv7s arm64 ,i386 x86_64 归纳
- 制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a
- Mac OS X10.10_xcode6.1_ios8.1环境下,编译lame静态库libmp3lame.a,支持arm64 armv7s x86_64 i386 armv7指令集
- iOS 中的 armv7,armv7s,arm64,i386,x86_64
- 制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a
- iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a
- iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a
- Mac OS X10.10_xcode6.1_ios8.1环境下,编译lame静态库libmp3lame.a,支持arm64 armv7s x86_64 i386 armv7指令集
- Android arm64(aarch64)中的so注入(inject) - 兼容x86 and arm
- ios 中armv7,armv7s,arm64,i386,x86_64是什么意思