当前位置: 技术问答>linux和unix
截获系统调用的模块中,如何获得发生系统调用eip
来源: 互联网 发布时间:2015-11-12
本文导语: 将系统调用的处理函数指向如下函数: void stub_kad(void) { __asm__ ( ".globl my_stub_int80n" ".align 4,0x90n" "my_stub_int80:n" "pushl %%eaxn" //是不是需要? "pushl %%esn" "pushl %%dsn" "pushl %%eaxn" "pushl %%ebpn" "pushl %%edin" "pushl %%...
将系统调用的处理函数指向如下函数:
void stub_kad(void)
{
__asm__ (
".globl my_stub_int80n"
".align 4,0x90n"
"my_stub_int80:n"
"pushl %%eaxn" //是不是需要?
"pushl %%esn"
"pushl %%dsn"
"pushl %%eaxn"
"pushl %%ebpn"
"pushl %%edin"
"pushl %%esin"
"pushl %%edxn"
"pushl %%ecxn"
"pushl %%ebxn"
"call my_handler n" //my_handle
"popl %%ebxn"
"popl %%ecxn"
"popl %%edxn"
"popl %%esin"
"popl %%edin"
"popl %%ebpn"
"popl %%eaxn"
"popl %%dsn"
"popl %%esn"
"popl %%eaxn"
"jmp *old_stub" //原先的系统调用处理函数
::
);
}
我试图在my_handle之前通过模拟SAVE_ALL操作使得内核栈有pt_regs,然后:
int my_handler(struct pt_regs regs) //处理函数,用来获得相关信息
{
...
double ip = regs.eip;
double sp = regs.esp;
...
}
可是,这样得到的结果,一个进程任何系统调用发生时刻的eip都是相同的。
而且用该eip不是指向进程代码段。
帮帮忙,到底错在哪了?
void stub_kad(void)
{
__asm__ (
".globl my_stub_int80n"
".align 4,0x90n"
"my_stub_int80:n"
"pushl %%eaxn" //是不是需要?
"pushl %%esn"
"pushl %%dsn"
"pushl %%eaxn"
"pushl %%ebpn"
"pushl %%edin"
"pushl %%esin"
"pushl %%edxn"
"pushl %%ecxn"
"pushl %%ebxn"
"call my_handler n" //my_handle
"popl %%ebxn"
"popl %%ecxn"
"popl %%edxn"
"popl %%esin"
"popl %%edin"
"popl %%ebpn"
"popl %%eaxn"
"popl %%dsn"
"popl %%esn"
"popl %%eaxn"
"jmp *old_stub" //原先的系统调用处理函数
::
);
}
我试图在my_handle之前通过模拟SAVE_ALL操作使得内核栈有pt_regs,然后:
int my_handler(struct pt_regs regs) //处理函数,用来获得相关信息
{
...
double ip = regs.eip;
double sp = regs.esp;
...
}
可是,这样得到的结果,一个进程任何系统调用发生时刻的eip都是相同的。
而且用该eip不是指向进程代码段。
帮帮忙,到底错在哪了?
|
是这个道理,但一定要明确到底在调你的函数之前向栈里压入了多少字节(包括CPU压入的)