当前位置:  技术问答>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不是指向进程代码段。

帮帮忙,到底错在哪了?

|
是这个道理,但一定要明确到底在调你的函数之前向栈里压入了多少字节(包括CPU压入的)

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 浙ICP备11055608号-3 iis7站长之家
  • 截获:用户按CDROM 按钮事件
  • libpcap截获两个网卡上的数据包
  • 有没有什么办法截获某一端口出入的所有数据,如果有,用哪种方式比较好呢,如保证不丢包
  • 在设备驱支里如何截获键盘中断?
  • Linux下如何截获键盘消息
  • 我想做一个截获并分析网络数据包的工具,linux windows使用哪个平台更方便
  • 怎样才能知道UNIX 下C语言的ERRNO都代表什么意思?到哪里去查,别外怎样在程序中截获这个errno我好做相应的处理。
  • 如何在servlet中截获session timeout
  • 在字符界面下用C如何截获ctrl+s按键
  • 怎样截获linux内核导出的函数?
  • 请问如何截获命令行的输出


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3