阅读:2407回复:0
[恢复]hook sysenter的问题
这是在 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 |
|
最新喜欢:yeaipi...
|