热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

KeyboardInterruptHooksafelyusingKINTERRUPT

KeyboardInterruptHooksafelyusingKINTERRUPTBy:chpiehttp:www.rootkit.comnewsread.php

Keyboard Interrupt Hook safely using KINTERRUPT
By: chpie

 

http://www.rootkit.com/newsread.php?newsid=561

[ Keyboard Interrupt Hook safely using KINTERRUPT ]

Date : Sun. 2006. 9. 3
Author : chpie (chpie@naver.com, chpie.org(not-support English page))

- Tracking Keyboard Interrupt Object using i8042prt Device Object -

Tested on : WindowsXP SP2 i386

% before read this text, i apologize for my English skill. :(

Some people used IDT hook to tracking keyboard's KINTERRUPT,
but this text shows that tracking keyboard's KINTERRUPT without IDT hook.

DDK Sample shows that i8042prt.sys has an ISR for dispatching Keyboard Interrupt.
And more, It has backup of KINTERRUPT in the i8042prt's DeviceExtension.

How was i get the DeviceObject Pointer of i8042prt ?

You can use IoGetDeviceObjectPointer() function to get a pointer the device object. IoGetDeviceObjectPointer() returns Top of stack related for arguments. Using /Device/KeyboardClass0 DeviceName, i've got the successful return value.

Is return value Pointer of i8042prt's DeviceObject? no, uncertainty.
It just a pointer Top of i8042prt's DeviceStack.

Let's tracking lower-level Object.

Tracking lower-level Object is undocumented, but here is solution.



lkd> !drvobj kbdclass
Driver object (82e12130) is for:
DriverKbdclass
Driver Extension List: (id , addr)

Device Object list:
82c6fb08  82d97600  <- /Device/KeyboardClass1, /Device/KeyboardClass0

lkd> !devobj 82d97600
Device object (82d97600) is for:
KeyboardClass0 DriverKbdclass DriverObject 82e12130
Current Irp 00000000 RefCount 1 Type 0000000b Flags 00002044
Dacl e101d164 DevExt 82d976b8 DevObjExt 82d97798
ExtensionFlags (0000000000)  
AttachedTo (Lower) 82d977e8 Driveri8042prt        <- here.
Device queue is not busy.

lkd> !devobj 82d977e8
Device object (82d977e8) is for:
  Driveri8042prt DriverObject 82e119d0
Current Irp 00000000 RefCount 0 Type 00000027 Flags 00002004
DevExt 82d978a0 DevObjExt 82d97b30
ExtensionFlags (0000000000)  
AttachedDevice (Upper) 82d97600 DriverKbdclass
AttachedTo (Lower) 82fa1900 DriverACPI
Device queue is not busy.

lkd> dt _DEVICE_OBJECT
   +0x000 Type             : Int2B
   +0x002 Size             : Uint2B
   +0x004 ReferenceCount   : Int4B
   +0x008 DriverObject     : Ptr32 _DRIVER_OBJECT   <- owner of this device object
   +0x00c NextDevice       : Ptr32 _DEVICE_OBJECT   <- Upper-level Object
   +0x010 AttachedDevice   : Ptr32 _DEVICE_OBJECT   <- Not this !!!
   +0x014 CurrentIrp       : Ptr32 _IRP
   +0x018 Timer            : Ptr32 _IO_TIMER
   +0x01c Flags            : Uint4B
   +0x020 Characteristics  : Uint4B
   +0x024 Vpb              : Ptr32 _VPB
   +0x028 DeviceExtension  : Ptr32 Void
   +0x02c DeviceType       : Uint4B
   +0x030 StackSize        : Char
   +0x034 Queue            : __unnamed
   +0x05c AlignmentRequirement : Uint4B
   +0x060 DeviceQueue      : _KDEVICE_QUEUE
   +0x074 Dpc              : _KDPC
   +0x094 ActiveThreadCount : Uint4B
   +0x098 SecurityDescriptor : Ptr32 Void
   +0x09c DeviceLock       : _KEVENT
   +0x0ac SectorSize       : Uint2B
   +0x0ae Spare1           : Uint2B
   +0x0b0 DeviceObjectExtension : Ptr32 _DEVOBJ_EXTENSION <- lower-level Object's Pointer in here.
   +0x0b4 Reserved         : Ptr32 Void

lkd> dt _DEVOBJ_EXTENSION
   +0x000 Type             : Int2B
   +0x002 Size             : Uint2B
   +0x004 DeviceObject     : Ptr32 _DEVICE_OBJECT  <- this device object
   +0x008 PowerFlags       : Uint4B
   +0x00c Dope             : Ptr32 _DEVICE_OBJECT_POWER_EXTENSION
   +0x010 ExtensionFlags   : Uint4B
   +0x014 DeviceNode       : Ptr32 Void
   +0x018 AttachedTo       : Ptr32 _DEVICE_OBJECT  <- !! It points Lower-level Device Object in
                                                         the Stack!
   +0x01c StartIoCount     : Int4B
   +0x020 StartIoKey       : Int4B
   +0x024 StartIoFlags     : Uint4B
   +0x028 Vpb              : Ptr32 _VPB



First, Get Topstack DeviceObject using IoGetDeviceObjectPointer.
And Scan-down using AttachedTo field in the _DEVOBJ_EXTENSION.

but How am i know current Pointer is i8042prt or not?

i8042prt's DeviceObject->Type field is FILE_DEVICE_8042_PORT ServiceRoutine;
KeyboardInterruptObject->ServiceRoutine = NewKeyboardHandler;


void NewKeyboardHandler(void)
{
    ..
    some processing what you want.. (ex. read 0x60 port)
    ..

    _asm jmp dword ptr [BackupHandler]
}


That's all about Keyboard Interrupt Hook safely using KINTERRUPT.

Have fun!

read comments


推荐阅读
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
author-avatar
小永劲_289
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有