首页
社区
课程
招聘
[求助]堕落天才的<另一种sysenter hook方法>中一段代码的问题
发表于: 2007-11-16 13:08 5179

[求助]堕落天才的<另一种sysenter hook方法>中一段代码的问题

2007-11-16 13:08
5179
下面这段是堕落天才的<另一种sysenter hook方法>(地址:http://bbs.pediy.com/showthread.php?t=42705)一文中的一段代码,是在KiFastCall中跳转到自己的这段代码

__declspec(naked) void MyKiFastCallEntry(void)
{
  __asm
  {
   pop edi     //因为用到了edi来跳转 这里恢复
   mov i, eax  //得到服务ID
  }
  __asm
  {  
   pushad
      push fs
      push 0x30
      pop fs
  }

  DbgPrint("sysenter was hooked! Get service ID:%X",i); //证明自己存在

  __asm
  {
      pop fs
      popad
      jmp pMovedSysenterCode //第二跳,跳转到原来的函数头代码 
  }
  
}


上面跳进来后,保存了eax中的服务ID,然后pushad
然后下面的popad对应上面的pushad,按理说我按照下面这样在popad后面修改eax的值应该没有什么不妥的吧?

__declspec(naked) void MyKiFastCallEntry(void)
{
  __asm
  {
   pop edi     //因为用到了edi来跳转 这里恢复
   mov i, eax  //得到服务ID
  }
  __asm
  {  
   pushad
      push fs
      push 0x30
      pop fs
  }

  DbgPrint("sysenter was hooked! Get service ID:%X",i); //证明自己存在

  __asm
  {
      pop fs
      popad
      mov eax, i
      jmp pMovedSysenterCode //第二跳,跳转到原来的函数头代码 
  }
  
}


我这样测试的目的是想在这期间修改服务ID为自己添加在SSDT中的自己构造的处理函数的服务ID
因为暂时还只测试到这里,在这期间我并没有修改全局变量i中的值,就是说前面mov i, eax到mov eax, i这里eax的值根本就没变过.
但是我这样改之后,加载驱动后系统要不就卡死,要不就蓝屏....注释掉mov eax, i这句就又一切正常...
请问下为什么额?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一下.....知道的高手帮帮啊.....
2007-11-16 14:38
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
在KiFastCallEntry的过程中可能会调度   你的全局变量i(在sys中)不仅仅是process内共享。。其实是全系统共享的。。。说不定之前mov i,eax然后立刻就调度了  等再调回来的时候i都乱套了。。。。

这种东西还是使用寄存器来得好。
2007-11-16 17:59
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
4
Spinlock
2007-11-16 18:13
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
自旋锁也可以解决。
2007-11-16 18:43
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
貌似usermode下改个地址就能hook这个,8过不是全局的
2007-11-16 19:34
0
游客
登录 | 注册 方可回帖
返回
//