WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
阅读:2407回复:0

[恢复]hook sysenter的问题

楼主#
更多 发布于:2007-01-02 21:30
  这是在 2006年12月12日 07:34:16 GMT 检索到的 http://bbs.driverdevelop.com/read.php?tid=109355 的 G o o g l e 缓存内容。
G o o g l e 已先预览各网页,拍下网页的快照存档。
这网页可能有更新的版本,请按此查看最新版。
本缓存网页可能引用了已经不存在的图片。单击此处,只查看缓存文本。
请使用网址 http://www.google.com/search?&q=cache:gYzVp8lGLk8J:bbs.driverdevelop.com/read.php%3Ftid%3D109355+hook+sysenter%E7%9A%84%E9%97%AE%E9%A2%98&hl=zh-CN&gl=cn&ct=clnk&cd=1 链接此页或将其做成书签。


Google 和网页作者无关,不对网页的内容负责。
这些搜索字词都已标明如下:  hook  sysenter  问题  
 
 

--------------------------------------------------------------------------------
  
 
控制面板 | 短消息 | 搜索 | 会员 | 帮助 | 社区 | 首页 | 无图版  
 

   密码忘了...怎么办?邮件收不到....
欢迎使用驱网身份认证服务。
发送 ARCK#UserName#Password 到 93891152 进行身份认证。
认证后可以用手机直接取回密码。


 驱动程序开发网技术社区 -> Kernel Mode discussion and Soft Driver -> hook sysenter的问题 转到动态网页  
 

    
--> 本页主题: hook sysenter的问题 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题  
FirefoxXP


 


 
级别: 驱动牛犊
精华: 0
发帖: 4
威望: 4 点
积分: 40 分
贡献值: 0 点
注册时间:2004-06-19
        

hook sysenter的问题

看了网上的资料
想要动手编写一个hook sysenter的程序

源代码如下:


#include "ntddk.h"
#include "windef.h"
#include "HookMon.h"

#define NT_DEVICE_NAME L"\\Device\\HookMon"     //设备名称
#define DOS_DEVICE_NAME L"\\DosDevices\\HookMon"   //符号连接

//函数声明

VOID    MY_PROC();
VOID    MY_SYSENTER_PROC();
VOID    HookService();
VOID    UnHookService();
VOID    GetMSR_EIP();
VOID    SetNewMSR_EIP();
VOID    SetOldMSR_EIP();

NTSTATUS    DriverDispatch(    IN PDEVICE_OBJECT DeviceObject,
                          IN PIRP pIrp
                          );
NTSTATUS    DriverEntry(IN PDRIVER_OBJECT DriverObject,
                       IN PUNICODE_STRING RegistryPath
                       );
VOID    UnloadDriver(IN PDRIVER_OBJECT pDriverObject);


#pragma pack(1)
typedef    struct _GDT
{
   WORD    GdtLimit;
   DWORD    GdtBase;
}GDT,*PGDT;


#pragma pack()
ULONG RawMSR_SYSENTER_EIP; //保存原始的MSR_SYSENTER_EIP内容
ULONG NewMSR_SYSENTER_EIP;
ULONG Val_1;
ULONG j;
GDT gdt;
WORD tr;

//截获系统服务
VOID    HookService(){

   MmLockPagableDataSection( (PVOID) &RawMSR_SYSENTER_EIP);
   MmLockPagableCodeSection( (PVOID) &MY_SYSENTER_PROC);
   GetMSR_EIP();
   SetNewMSR_EIP();                //将mySYSENTER_Proc设置为SYSENTER的入口

   return;
}


//解除hook
VOID        UnHookService(){
   SetOldMSR_EIP();
   MmPageEntireDriver( (PVOID) &DriverEntry);

   return;
}


//*********************************************************
// 读出MSR[ECX]的值,此处为SYSENTER_EIP_MSR
//*********************************************************
VOID GetMSR_EIP()
{
   _asm{
       pushad
       mov ecx,0x176
       RDMSR
       mov RawMSR_SYSENTER_EIP,eax
       popad
   }

   return;
}

//*****************************************************
// 设置MSR[ECX]的值,此处为SYSENTER_EIP_MSR
//*****************************************************
VOID SetNewMSR_EIP()
{
       _asm{
           pushad
           CLI
           xor edx,edx
           mov eax,MY_SYSENTER_PROC
           mov ecx,0x176
           WRMSR
           STI
           popad
       }

   return;
}


//把MSR_EIP设置回原来的值
VOID SetOldMSR_EIP()
{
   _asm{
       pushad
       CLI
       xor edx,edx
       mov eax,RawMSR_SYSENTER_EIP
       mov ecx,0x176
       WRMSR
       STI
       popad
   }

   return;
}

//替代系统调用处理过程
void __declspec(naked)MY_SYSENTER_PROC()
{
   _asm{
       sgdt gdt                    //设置内核RING0堆栈
       str word ptr[tr]

       movzx ecx,tr
       add ecx,gdt.GdtBase
       mov esp,dword ptr[ecx+2]
       and esp,0ffffffh
       mov ecx,dword ptr[ecx+4]
       and ecx,0ff000000h
       or esp,ecx                    //esp->tss
       mov esp,dword ptr[esp+4]

       pushad
       pushfd
       push fs
       mov bx,0x30
       mov fs,bx
       push ds
       push es

       call MY_PROC;

       pop es
       pop ds
       pop fs
       popfd
       popad
       jmp RawMSR_SYSENTER_EIP;        
   }
}

NTSTATUS    DriverDispatch(    IN PDEVICE_OBJECT DeviceObject,
                           IN PIRP pIrp
                           )
{
   NTSTATUS ntStatus=STATUS_SUCCESS;
   PIO_STACK_LOCATION IrpStack=NULL;   //IRP堆栈
   ULONG IoControlCodes=0;         //I/O控制代码

   pIrp->IoStatus.Status=STATUS_SUCCESS;
   pIrp->IoStatus.Information=0;

   IrpStack=IoGetCurrentIrpStackLocation(pIrp);

   switch(IrpStack->MajorFunction) {

   case IRP_MJ_CREATE:                    //创建和关闭时只需要返回成功就可以
       break;
   case IRP_MJ_CLOSE:
       break;

   case IRP_MJ_DEVICE_CONTROL:                //接收到控制指令

       IoControlCodes=IrpStack->Parameters.DeviceIoControl.IoControlCode;

       switch(IoControlCodes) {

       case IOCTRL_HOOK_SERVICE:        //截获windows系统中断

           HookService();

           break;
       case IOCTRL_UNHOOK_SERVICE:        //释放windows系统中断

           UnHookService();

           break;
       default:
           break;
       }
       break;

   default:
       break;
   }
  
   ntStatus=pIrp->IoStatus.Status;
   IoCompleteRequest(pIrp,IO_NO_INCREMENT);

   return ntStatus;
}


//卸载驱动程序
VOID    UnloadDriver(IN PDRIVER_OBJECT pDriverObject)
{
   UNICODE_STRING DeviceLinkString={0};
   PDEVICE_OBJECT DeviceObjectTemp1=NULL;
   PDEVICE_OBJECT DeviceObjectTemp2=NULL;



   RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME);

   IoDeleteSymbolicLink( &DeviceLinkString);
   IoDeleteDevice( pDriverObject->DeviceObject );
  
}

//驱动程序入口
NTSTATUS    DriverEntry(IN PDRIVER_OBJECT DriverObject,
                       IN PUNICODE_STRING RegistryPath
                       )
{
   NTSTATUS        ntStatus=STATUS_SUCCESS;
   PDEVICE_OBJECT    lpDeviceObject=NULL;
   UNICODE_STRING    DeviceNameString={0};     //设备名称
   UNICODE_STRING    DeviceLinkString={0};     //符号连接


   RtlInitUnicodeString(&DeviceNameString,NT_DEVICE_NAME);
   RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME);

   ntStatus=IoCreateDevice(DriverObject,0,&DeviceNameString,\
                           FILE_DEVICE_UNKNOWN,0,FALSE,&lpDeviceObject);

   if(!NT_SUCCESS(ntStatus)){            //建立驱动程序不成功,则直接返回
       return ntStatus;
   }

   ntStatus=IoCreateSymbolicLink(&DeviceLinkString,&DeviceNameString);

   if(!NT_SUCCESS(ntStatus)){
       if(lpDeviceObject)
           IoDeleteDevice(lpDeviceObject);    //删除驱动程序
   }

   //设置IRP派遣例程和卸载例程
  
   DriverObject->MajorFunction[IRP_MJ_CREATE]=DriverDispatch;
   DriverObject->MajorFunction[IRP_MJ_CLOSE]=DriverDispatch;
   DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DriverDispatch;
   DriverObject->DriverUnload=UnloadDriver;

  
   return ntStatus;        //返回成功状态
}


VOID MY_PROC(){
   _asm{
       int    3
   }
   return;
}






链接的时候出现错误:
BUILD: Computing Include file dependencies:
BUILD: Examining d:\hookmon directory for files to compile.
Compiling d:\hookmon directory ********************
'nmake.exe /c BUILDMSG=Stop. -i NTTEST= UMTEST= NOLINK=1 NOPASS0=1 386=1'
cl -nologo -Ii386\ -I. -Id:\WINDDK\2600\inc -Id:\WINDDK\2600\inc\ddk\wxp -Iobjchk\i386 -Id:\WINDDK\2600\inc\wxp -Id:\WINDDK\2600\inc\wxp -Id:\WINDDK\2600\inc\ddk\wdm\wxp -Id:\WINDDK\2600\inc\crt -D_X86_=1 -Di386=1 -DSTD_CALL -DCONDITION_HANDLING=1   -DNT_INST=0 -DWIN32=100 -D_NT1X_=100 -DWINNT=1 -D_WIN32_WINNT=0x0501 /DWINVER=0x0501 -D_WIN32_IE=0x0600   -DWIN32_LEAN_AND_MEAN=1 -DDBG=1 -DDEVL=1 -D__BUILDMACHINE__=WinDDK -DFPO=0 -DNDEBUG -D_DLL=1     /c /Zel /Zp8 /Gy -cbstring /W3 /WX /Gz /QIfdiv- /QIf /G6 /Gi- /Gm- /GX- /GR- /GF -Z7 /Od /Oi /Oy-   -FId:\WINDDK\2600\inc\wxp\warning.h   .\hookmon.cpp
hookmon.cpp
d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(2152) : error C2220: warning treated as error - no object file generated
d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(2152) : warning C4162: '_ReturnAddress' : no function with C linkage found
d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(6852) : warning C4162: '_InterlockedExchange' : no function with C linkage found
d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(6878) : warning C4162: '_InterlockedIncrement' : no function with C linkage found
d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(6891) : warning C4162: '_InterlockedDecrement' : no function with C linkage found
d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(6905) : warning C4162: '_InterlockedExchangeAdd' : no function with C linkage found
d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(6935) : warning C4162: '_InterlockedCompareExchange' : no function with C linkage found
d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(6987) : warning C4162: '_InterlockedOr' : no function with C linkage found
d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(6997) : warning C4162: '_InterlockedAnd' : no function with C linkage found
d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(7007) : warning C4162: '_InterlockedXor' : no function with C linkage found

Stop.
Compile errors: not linking d:\hookmon directory ********************

希望各位指点一下是怎么回事

以前用了wowocock的汇编代码替换sysenter
总是蓝屏,一头雾水中………………
 
高速无限下载文件,请申请vip会员
 
[楼 主] Posted:2006-04-15 23:32|  
 
 
wowocock


 

 
 
级别: 驱动老牛
精华: 1
发帖: 4073
威望: 484 点
积分: 4767 分
贡献值: 1 点
注册时间:2002-04-08
        



你是什么OS??什么CPU??还有如果用了SOTFICE和不用SOFTICE汇编代码上会有所不同,必须分开处理.....
 
高速无限下载文件,请申请vip会员
 
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠  
[1 楼] Posted:2006-04-16 09:51|  
 
 
FirefoxXP


 


 
级别: 驱动牛犊
精华: 0
发帖: 4
威望: 4 点
积分: 40 分
贡献值: 0 点
注册时间:2004-06-19
        



wowocock大牛
呵呵,昨晚还跟cardmagic讨论呢
我的CPU是奔四,本来应该在前面加入CPUID指令判断一下的
机器上装的是XP,DriverStudio 3.2

请多指教
谢谢
 
高速无限下载文件,请申请vip会员
 
[2 楼] Posted:2006-04-16 13:00|  
 
 
FirefoxXP


 


 
级别: 驱动牛犊
精华: 0
发帖: 4
威望: 4 点
积分: 40 分
贡献值: 0 点
注册时间:2004-06-19
        



今天跟踪的时候发现sysenter执行之后进入了一个函数
ZwYieldExecution(奇怪,为什么不是KiFastCallEntry)
代码如下:
.text:00406C74 ZwYieldExecution proc near
.text:00406C74
.text:00406C74 arg_0       = dword ptr 4
.text:00406C74
.text:00406C74           mov   eax, 116h
.text:00406C79           lea   edx, [esp+arg_0]
.text:00406C7D           pushf
.text:00406C7E           push   8
.text:00406C80           call   sub_407631
.text:00406C85           retn
后面那个call指令跳到的程序没有命名,参数很多。
 
高速无限下载文件,请申请vip会员
 
[3 楼] Posted:2006-04-16 13:12|  
 
 
FirefoxXP


 


 
级别: 驱动牛犊
精华: 0
发帖: 4
威望: 4 点
积分: 40 分
贡献值: 0 点
注册时间:2004-06-19
        



又取出了MSR_EIP的值
用windbg看了一下:
lkd> u 0x804df6f0
nt!ZwYieldExecution+0xa7c:
804df6f0 b923000000     mov   ecx,0x23
804df6f5 6a30         push   0x30
804df6f7 0fa1         pop   fs
804df6f9 8ed9         mov   ds,ecx
804df6fb 8ec1         mov   es,ecx
804df6fd 8b0d40f0dfff   mov   ecx,[ffdff040]
804df703 8b6104       mov   esp,[ecx+0x4]
804df706 6a23         push   0x23
 
高速无限下载文件,请申请vip会员
 
[4 楼] Posted:2006-04-16 13:13|  
 
 
9545421


 


 
级别: 驱动牛犊
精华: 0
发帖: 7
威望: 6 点
积分: 61 分
贡献值: 0 点
注册时间:2004-12-04
        



解决问题了


[ 此贴被9545421在2006-10-27 10:55重新编辑 ]
 
高速无限下载文件,请申请vip会员
 
[5 楼] Posted:2006-10-26 16:47|  
 
 

  快速跳至 >> 初学者入门  |- c/c++入门(含vc使用)  |- InnoSetup 中文讨论区  |- Keil C 使用  |- 电子技术基础  |- ABC初学者  |- 驱动及应用程序安装程序制作 >> 安全技术  |- 反流氓、反木马和rootkit  |- 网络安全技术  |- 病毒技术分析 >> 阅读与交流  |- windows 源码解读  |- 书评 >> 各取所需  |- 求职专区  |- 合作开发  |- 供需信息 >> 驱动开发  |- 每周话题  |- vista & x64 驱动程序  |- WDF 学习与研究  |- Kernel Mode discussion and Soft Driver  |- USB驱动开发  |- 非USB硬件驱动开发  |- 图形设备驱动版(打印、扫描、显示...驱动)  |- Mac 驱动开发  |- NDIS网络接口开发  |- LINUX&UNIX核心开发  |- 开发工具使用  |- (IEEE1394)FireWire  |- 文件系统(过滤)驱动程序开发  |- 软件工程在驱动开发中的应用  |- 总结、原创区 >> 硬件开发  |- DSP & PLD &FPGA  |- 硬件设计  |- FirmWare  |- 集成电路设计(IC) >> SNMP网管  |- SNMP网管软件开发 >> 嵌入式系统及掌上设备  |- 嵌入式系统开发  |- Wince 程序开发  |- VxWorks >> 程序人生  |- 疯狂灌水  |- 新闻,要闻,花边  |- 情感小屋  |- I love English  |- 程序人生  |- 志宁自语  |- MP3 & FLASH 共享  |- 艺术&帖图区  |- 漂流一族 >> 其它事务  |- 用户留言  |- 软件使用与交流 >> 公司黑白名单  |- 白名单  |- 黑名单 >> 合作网站技术支持论坛  |- 驱动开发网在线商城  |- syser debugger  |- S1系列PCI开发板、FPGA开发板支持  |- PLX PCI 开发板支持  |- DriverStudio 技术支持  

 驱动程序开发网技术社区 -> Kernel Mode discussion and Soft Driver
    

快速发帖 顶端
 
内容:
HTML 代码不可用

使用签名
Wind Code自动转换

[查看帖子长度]  标题:  
表情:        
      

     按 Ctrl+Enter 直接提交    


 


Powered by PHPWind v4.3.2 Code ? 2003-05 PHPWind
This is html template view this page faster

You can contact us

最新喜欢:

yeaipingyeaipi...
驱动开发者 呵呵
游客

返回顶部