XTrap驱动分析

处理PUBG过CE窗口最小化检测 游戏逆向辅助开发教学 阅读详情
最近拿到一个使用XTrap的游戏,据说此物乃NP和HS之外的第三大反外挂系统,so拿来瞧了瞧。
Ring3层包括几个dll和一个进程。看里面貌似使用了pipe相关的函数,运行时也起了一个进程。所以XTrap的架构应该和NP很类似,但是实现上就要弱很多了。
1、  现在还没发现有ring3全局注入的dll。
2、  大量工作放到了作为和游戏接口的dll里面。通过dll方式提供游戏使用这点不同于NP的lib库,而更类似HS。这种方式一大弱点就是那个dll容易被模拟,并且比较难发现。
3、   驱动相对来说应该是三个系统里面最弱的了,原因下面会讲到。花了5天时间逆出了整个驱动的源码,好像没有那么多硬编码的东西,呵呵。不过倒是发现了一些编程的BUG什么的。基本的功能点只有三个:HOOK SSDT实现的跨进程访问控制、通过对IoAccessMap的设置关闭对鼠标键盘端口访问权限、通过挂接Int 1中断获得调试信息。

大概的流程如下:
1、  DriverEntry:通过PsGetVersion判断系统版本,并根据不同的版本保存要Hook的在SSDT Shadow表中服务的ID。而SSDT表中的则是由后面IoControl里面Ring3传下来的。目前来看已经支持Vista了。通过KeQuerySystemTime拿了一下系统时间并保存下来,不过后面就没有再使用了,估计以后为了反调试会做时间检查什么的东西吧。申请了0x2000长度的内存,这是用于后面设置IoAccessMap的。然后就是例行的IoCreateDevice和 IoCreateSymbolicLink,设置Dispatch例程。XTrap的IRP_MJ_DEVICE_CONTROL、 IRP_MJ_Create、IRP_MJ_CLOSE、IRP_MJ_CLEANUP是在同一个例程中处理的。最后有一个莫名其妙的调用 KfLowerIrql( KeRaiseIrqlToDpcLevel());偶的水平实在是还难以理解高丽棒子为啥要这样做,嘿嘿。
2、  剩下的就是通过DeviceIoControl来控制的了,我这个版本的XTrap一共有17个ControlCode。Dispatch例程的代码如下
NTSTATUS
XDvaDispatchAll( IN PDEVICE_OBJECT  DeviceObject, IN PIRP  Irp)
{
  PIO_STACK_LOCATION pIrpStack;
  PVOID pSystemBuffer;
  PVOID pOutBuffer;
  ULONG ulMajorFunction;
  NTSTATUS ntStatus;
  
  pIrpStack = IoGetCurrentIrpStackLocation( Irp);
  Irp->IoStatus.Status = STATUS_SUCCESS;
  Irp->IoStatus.Information = 0;
  pSystemBuffer = Irp->AssociatedIrp.SystemBuffer;
  ulMajorFunction = pIrpStack->MajorFunction;

  switch( ulMajorFunction)
  {
  case IRP_MJ_DEVICE_CONTROL:
    if( (pIrpStack->Parameters.DeviceIoControl.IoControlCode & 0x3) == 0x3)
    {
      pOutBuffer = Irp->UserBuffer;
    }
    else
    {
      pOutBuffer = pSystemBuffer;
    }
    return DoDeviceIoControl( Irp, pIrpStack->FileObject, 1, pSystemBuffer,
      pIrpStack->Parameters.DeviceIoControl.InputBufferLength,
      pOutBuffer, pIrpStack->Parameters.DeviceIoControl.OutputBufferLength,
      pIrpStack->Parameters.DeviceIoControl.IoControlCode,
      &Irp->IoStatus, DeviceObject);
  case IRP_MJ_CLOSE:
    HookSSDT( g_HookInfo.NtOpenProcessInfo.Id, (ULONG)g_pNtOpenProcess, (ULONG)NewNtOpenProcess);
    HookSSDT( g_HookInfo.NtDeviceIoControlFileInfo.Id, (ULONG)g_pNtDeviceIoControlFile, (ULONG)NewNtDeviceIoControlFile);
    HookSSDT( g_HookInfo.NtWriteVirtualMemoryInfo.Id, (ULONG)g_pNtWriteVirtualMemory, (ULONG)NewNtWriteVirtualMemory);
    HookSSDT( g_HookInfo.NtOpenSectionInfo.Id, (ULONG)g_pNtOpenSection, (ULONG)NewNtOpenSection);
    HookSSDT( g_HookInfo.NtProtectVirtualMemoryInfo.Id, (ULONG)g_pNtProtectVirtualMemory, (ULONG)NewNtProtectVirtualMemory);
    HookSSDT( g_HookInfo.NtTerminateProcessInfo.Id, (ULONG)g_pNtTerminateProcess, (ULONG)NewNtTerminateProcess);
    HookSSDT2( g_dwNtGdiGetPixelId, (ULONG)g_pNtGdiGetPixel, (ULONG)NewNtGdiGetPixel);
    HookSSDT2( g_dwNtUserSendInputId, (ULONG)g_pNtUserSendInput, (ULONG)NewNtUserSendInput);
    HookSSDT2( g_dwNtUserCallNextHookExId, (ULONG)g_pNtUserCallNextHookEx, (ULONG)NewNtUserCallNextHookEx);
    HookSSDT2( g_dwNtUserPostMessageId, (ULONG)g_pNtUserPostMessage, (ULONG)NewNtUserPostMessage);
    HookSSDT2( g_dwNtUserTranslateMessageId, (ULONG)g_pNtUserTranslateMessage, (ULONG)NewNtUserTranslateMessage);

    if( g_byIsSuccess)
    {
      g_byIsSuccess = FALSE;
    }
    if( g_byIsReboot)
    {
      _asm cli;
      WRITE_PORT_UCHAR( (PUCHAR)0x64, (UCHAR)0xFE);
      _asm hlt;
    }
    else
    {
      ntStatus = STATUS_SUCCESS;
    }
    break;
  case IRP_MJ_Create:
    if( g_arrSomeCode[0] == 0)
    {
      memcpy( g_arrSomeCode, MyInt1, 5*sizeof( ULONG));
    }
    ntStatus = STATUS_SUCCESS;
    break;
  case IRP_MJ_CLEANUP:
    ntStatus = STATUS_SUCCESS;
    break;
  default:
    Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
    ntStatus = STATUS_INVALID_DEVICE_REQUEST;
  }

  IofCompleteRequest( Irp, IO_NO_INCREMENT);
  return ntStatus;
}

IRP_MJ_DEVICE_CONTROL 的处理是在另外一个函数里面,由于太复杂,影响blog的美观,就不写出来了,哈哈。这里面可以看到,XTrap采用了和NP一样的办法重起电脑,就是往 64端口写0xFE。挺白痴的是居然通过WRITE_PORT_UCHAR,难道以为只有他会Hook~
IRP_MJ_Create里面把自己的Int 1 函数的代码复制了一段出来,这个会用于后面再覆盖回去,是用于对付Inline hook的伎俩。
其他就没什么好说的了。
3、  关于SSDT的Hook
SSDT 中Hook的函数有以下几个:NtOpenProcess、NtDeviceIoControlFile、NtWriteVirtualMemory、 NtOpenSection、NtProtectVirtualMemory、NtTerminateProcess
Shadow Table中Hook的函数有下面几个:NtGdiGetPixel、NtUserSendInput、NtUserCallNextHookEx、NtUserPostMessage、NtUserTranslateMessage。
所有函数Hook的目的都很清楚,没有什么古怪的地方,呵呵。不过相当部分的钩子都只是简单的pass过去,并没有任何实质性的处理。可以看出来XTrap仍然是一个非常不完善的系统,这些部分应该都是留到以后进行功能扩充的。
关于Shadow Table的处理有一些特别的地方。Shadow Table的地址获取采用了硬编码+验证的方式。这一点偶个人觉得还是在 KeAddSystemServiceTable中去取比较好,至少说在出现新的系统的时候很大可能并不用修改代码。另外,取到Shadow Table 地址之后,除了将KSERVICE_TABLE_DESCRIPTOR地址保存之外,还将Shadow Table的Base保存到了 KeServiceDescriptorTable第二项的Base中,以后在Hook或者其他操作的时候就直接到 KeAddSystemServiceTable地址+0x10去取了。这一点我也觉得有些奇怪,保存到全局变量什么的不就好了,为什么要去修改系统本身的东西,虽然目前那个位置并没有什么用。大约是为了反调试。
4、  关于Int 1的处理
这里貌似也没什么好说的,记录了一下断点被触发的次数、dr0到dr4的内容什么的,然后IoControl里面Ring3会取走这些信息。不过有个很搞笑的BUG,Hook中断的函数里面的cli没有对应的sti。
5、  关于IoAccessMap的处理
这里没什么好说的,是由Ring3触发,Ring0实现。贴一段DeviceIoContrl里面的代码就明白了。
case 0x85000044:
    ntStatus = STATUS_INVALID_PARAMETER;
    if( !pSystemBuffer || ulInputBufferLength != 4)
    {
      break;
    }
    PsLookupProcessByProcessId( *((ULONG*)pSystemBuffer), pSystemBuffer);
    ((PUCHAR)g_pIoAccessMap)[0x0C] |= 0xFF;
    ((PUCHAR)g_pIoAccessMap)[0x0D] |= 0xFF;
    Ke386IoSetAccessProcess( pSystemBuffer, 1);
    Ke386SetIoAccessMap( 1, g_pIoAccessMap);
    ntStatus = STATUS_SUCCESS;
    break;
          现在模拟键盘的所谓硬件模式,大部分人都是使用了网上一些开源工具,例如WinIo,基本原理就是通过IoAccessMap打开ring0的端口读写权限(啰嗦一句,上次看到某人拿来的一个sys,貌似将整个机器的io都打开了,实在是无比暴力……。寒一个)。所以对应办法就是也通过改写 IoAccessMap关闭掉权限。
这也是我现在比较推荐使用的方法,对使用WinIo的按键精灵什么的外挂,都有药到病除的疗效。而且,影响范围比较小,只关闭了有限的端口。对于某些特殊情况下的程序,也可以发现之后再单独处理。不过对于自己写驱动读写端口的一类外挂来说,任何办法都没用了。 In~~~out~~~~in~~~~out~~~~~in~~~~~~out~~~~~~?
6、  下面选一些函数贴出来吧?
ULONG __stdcall
NewNtGdiGetPixel( PVOID hDC, LONG XPos, LONG YPos)
{
  BOOLEAN blIsBlock = TRUE;
  if ( g_dwCurrentProcessId == (ULONG)PsGetCurrentProcessId())
  {
    blIsBlock = FALSE;
  }

  //这里奇怪,不知道为什么这么搞
  if ( XPos == 0)
  {
    if( YPos != 0)
    {
      if( YPos == 0x5A)
      {
        blIsBlock = FALSE;
      }
    }
    else
    {
      blIsBlock = FALSE;
    }
  }

  if( g_byIsSuccess == TRUE && blIsBlock == TRUE)
    return 0;
  return g_pNtGdiGetPixel( hDC, XPos, YPos);
}


ULONG
__stdcall NewNtUserSendInput(
               ULONG nInputs,
               LPINPUT pInput,
               ULONG cbSize)
{
  if( (g_byIsSuccess != TRUE) || (g_byAllowUserSendInput == TRUE))
  {
    return g_pNtUserSendInput( nInputs, pInput, cbSize);
  }
  else
  {
    return 1;
  }
}

NTSTATUS
__stdcall NewNtOpenProcess (
              PHANDLE ProcessHandle,
              ACCESS_MASK DesiredAccess,
              POBJECT_ATTRIBUTES ObjectAttributes,
              PCLIENT_ID ClientId
              )
{
  if( g_dwCurrentProcessId != 0)
  {
    if( (ULONG)ClientId->UniqueProcess == g_dwCurrentProcessId)
    {
      if( DesiredAccess != 0x478)
      {
        DesiredAccess &= 0xFFFFFFCF;//清掉PROCESS_VM_READ和PROCESS_VM_WRITE
      }
    }
  }

  if( g_dwProtectPid2 != 0)
  {
    if( g_dwProtectPid2 == (ULONG)ClientId->UniqueProcess)
    {
      DesiredAccess &= 0x0FFFFFFFE; //清掉PROCESS_TERMINATE
    }
  }

  if( g_dwCurrentProcessId == (ULONG)ClientId->UniqueProcess)
  {
    g_dwIsSomeoneOpenMe = 1;
  }
  return g_pNtOpenProcess( ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);
}

NTSTATUS
__stdcall NewNtWriteVirtualMemory(
                  HANDLE ProcessHandle,
                  PVOID BaseAddress,
                  CONST VOID *Buffer,
                  SIZE_T BufferSize,
                  PSIZE_T NumberOfBytesWritten
                  )
{
  BOOLEAN blIsNeedSkip = FALSE;
  PROCESS_BASIC_INFORMATION stProcessInfo;
  HANDLE Handle;
  HANDLE hCurrentPid;
  RtlZeroMemory( &stProcessInfo, sizeof(stProcessInfo));

  if( STATUS_SUCCESS ==
    ZwDuplicateObject( (HANDLE)0xFFFFFFFF,
              ProcessHandle,
              (HANDLE)0xFFFFFFFF,
              &Handle,
              0x400,
              0,
              0)
    )
  {
    ZwQueryInformationProcess( Handle, 0, &stProcessInfo, 0x18, 0);
    ZwClose( Handle);
  }

  if( g_dwCurrentProcessId == (ULONG)stProcessInfo.UniqueProcessId)
  {
    blIsNeedSkip = TRUE;
  }

  hCurrentPid = PsGetCurrentProcessId();
  if( (ULONG)hCurrentPid == g_dwSafePid1 ||
    (ULONG)hCurrentPid == g_dwSafePid2 ||
    (ULONG)hCurrentPid == g_dwSafePid3)
  {
    blIsNeedSkip = FALSE;
  }

  if( (ULONG)hCurrentPid == g_dwCurrentProcessId)
  {
    if( (g_dwFromUser2 | 0xFFFFF0F) == 0xFFFFF1F)
    {
      blIsNeedSkip = FALSE;
    }
  }

  if ( !g_byIsSuccess || !blIsNeedSkip)
  {
    return g_pNtWriteVirtualMemory( ProcessHandle, BaseAddress, Buffer, BufferSize, NumberOfBytesWritten);
  }
  return 0;
}

ULONG __stdcall NewNtUserTranslateMessage(PMSG lpMsg, ULONG dwhkl)
{
  CHAR ucScanCode, ucScanCode2;
  UCHAR blNeedSkip = FALSE;
  if( lpMsg->message == 0x100 || lpMsg->message == 0x101)
  {//WM_KEYDOWN,WM_KEYUP
    ucScanCode2 = IsNeedSkipKeyMsg( lpMsg->wParam);
    if( ucScanCode2)
    {
      ucScanCode = (lpMsg->lParam & 0x00FF0000) >> 16;
      if( ucScanCode == ucScanCode2)
      {
        blNeedSkip = TRUE;
      }
    }
  }
  if( !g_byIsSuccess || !blNeedSkip)
  {
    return g_pNtUserTranslateMessage( lpMsg, dwhkl);
  }
  return 1;
} 
 
Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健) SHADOWSSDTHOOK HOOK和UNHOOKSHADOWSSDT跟之前的HOOK/UNHOOKSSDT类似,区别是查找SSSDT的特征码,以及根据索引计算函数地址的公式,还有一个就是吧跳转函数写在什么位置,SSDT的时候是写在蓝屏函数里了。 一、获得wKeServiceDescriptorTableShadow的地址 这个跟获得KeServi... 阅读详情

相关推荐

掌握Windows API中的PostMessage函数:进程间与线程间通信

在Windows编程中,函数是Windows API中一个关键的函数,它允许一个进程向另一个进程的窗口发送消息。不管目标窗口的线程是否正在等待消息,消息都会被加入到接收窗口的消息队列中,并且函数会立即返回,不会等待消息被处理。

weixin_42300144的博客 1284

windows内核情景分析--窗口消息

消息与钩子 众所周知,Windows系统是消息驱动的,现在我们就来看Windows的消息机制. 早期的Windows的窗口图形机制是在用户空间实现的,后来为了提高图形处理效率,将这部分移入内核空间,在Win32k.sys模块中实现。这个模块作为一个扩展的内核模块,提高了一个扩展额系统服务表,专用于窗口图形操作,相应的,这个模块中添加了一个扩展系统调用服务表Shadow SSDT,以及一个扩

maomao171314的专栏 3715

Autowired的使用介绍

我们都知道在spring中@Autowired注解,是用来自动装配对象的。@Service@Autowired没错,这样是能够装配成功的,因为默认情况下spring是按照类型装配的,也就是我们所说的byType方式。此外,@Autowired注解的required。

白话机器学习 1351

Windows内核新手上路2——挂钩shadow SSDT

Windows内核新手上路2——挂钩shadow SSDT          文章核心内容:安全软件窗口保护、安全输入、截屏保护的一些思路。挂钩NtUserFindWindowEx、NtUserGetForegroundWindow、NtUserBuildHwndList、NtUserQueryWindow、NtUserWindowFromPoint、NtUserSetParent、NtUser

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 2028

手把手教你离线部署Jupyter Notebook及高效插件配置

本文详细介绍了如何在离线环境中部署Jupyter Notebook及配置高效插件,包括离线安装步骤、依赖管理、核心扩展安装及常见问题排查。特别针对金融、科研等封闭网络场景,提供完整的whls包和requirements.txt解决方案,帮助开发者和数据分析师突破网络限制,提升工作效率。

weixin_28839549的博客 585

游戏安全逆向实战:如何用010Editor绕过ACE反作弊的文件校验(附详细步骤)

本文详细介绍了如何通过逆向工程思维和010Editor工具,针对PC游戏中ACE反作弊系统的文件校验机制进行分析与绕过。文章以实战案例为核心,逐步拆解了定位校验逻辑、解析校验数据文件、计算并替换哈希值的关键步骤,为安全研究人员提供了一种在用户态(Ring 3)层面进行轻量化对抗的思路与方法。

iii12的专栏 743

Windows消息机制

消息队列在哪 消息队列 进程-->消息队列 消息队列-->鼠标 消息队列-->键盘 消息队列-->其他进程的消息 消息队列放在哪里 这个模式怎么区分消息属于谁,是通过一个专门进程处理消息,这样问题是有跨进程通信太费时。Windows不是这样,Linux是这样。微软是把消息队列存到了0环。 怎么找到消息结构体,是KThread(任何一个线程都有个内核结构...

kernweak的博客 3002

从零到一:基于STM8的125KHz RFID读卡器实现与曼彻斯特码解析实战

本文详细介绍了基于STM8单片机的125KHz RFID读卡器实现过程,重点解析了曼彻斯特码的编码原理与解码算法。通过硬件电路设计、软件实现及性能优化,帮助开发者低成本构建稳定读取EM4100卡片的系统,适用于门禁、考勤等应用场景。

weixin_42525211的博客 236

转XTrap驱动分析

最近拿到一个使用XTrap的游戏,据说此物乃NP和HS之外的第三大反外挂系统,so拿来瞧了瞧。 Ring3层包括几个dll和一个进程。看里面貌似使用了pipe相关的函数,运行时也起了一个进程。所以XTrap的架构应该和NP很类似,但是实现上就要弱很多了。 1、 现在还没发现有ring3全局注入的dll。 2、 大量工作放到了作为和游戏接口的dll里面。通过dll方式提供游戏使用这点

Tommy(凌飞)的专栏 1426

【雷达通信】雷达信号处理仿真【含Matlab源码 2509期】

雷达信号处理仿真 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 905

教你写出高质量SQL(实践必备)

1、查询SQL尽量不要使用select * ,而是select具体字段。 //反例子 select * from sys_user; //正例子 select id,name from sys_user; 理由: 只取需要的字段,节省资源、减少网络开销;select * 进行查询时,很可能就不会使用到覆盖索引,就会造成回表查询; 覆盖索引:只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。 例如: 回表查询:先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记..

ANGEL CITY 9996

探秘Xstrap:一款强大的前端开发利器

探秘Xstrap:一款强大的前端开发利器 去发现同类优质开源项目:https://gitcode.com/ 项目简介 是一个由社区驱动的前端构建工具,它旨在简化和加速现代Web应用的开发过程。通过集成一系列流行的前端框架和技术,如Vue、React、Angular等,Xstrap提供了一套开箱即用的工作流程,帮助开发者快速搭建高质量的应用。 技术分析 Xstrap 基于 Webpack 进行构建...

gitblog_00022的博客 498

Centos 7 Linux 安装单机 Hadoop(HDFS):下载、安装、配置、测试

本文详细介绍了在 CentOS 7 系统上安装与配置单机 Hadoop(HDFS)的完整流程,涵盖 JDK 环境准备、Hadoop 安装包下载与部署、核心配置文件(core-site.xml、hdfs-site.xml 等)修改、SSH 免密登录设置、HDFS 格式化及服务启动,并通过命令行与 Web 界面验证 HDFS 和 YARN 功能,适合 Hadoop 初学者快速搭建本地测试环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 3239

从开源时代进入到逆向时代

生命不熄,奋斗不止! 记得十年前决定开发操作系统和编译器的时候,我已经解接触了开源软件,但是接触开源代码还是后来的事。 开源软件产生是为了反对微软垄断和高收费,让人们用上免费软件,今天已经大功告成!进入2013年,我发现开源社区的激情似乎已经慢慢消失,推出的新的各种开源项目计划似乎已经越来越不行了,至少我在nix下面看到,gnome3,kde4.10已经不行了,漏洞百出,不堪使用。我也在今年发...

weixin_30879833的博客 168

解决开着代理情况下pip或魔搭下载失败

最近由于经常配环境导致,老是要来回切clash关掉代理,非常的不方便如下面的,魔搭模型下载失败如下面的,pip换源后下载失败。

风吹落叶的博客 2950

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

windows message manager

SendMessage窗口过程函数的调用有两个入口,一个是自己的线程给自己窗口发通知,这样直接调用内部函数进行调用,使用IntCallMessageProc来调用函数,另一种方式是转换用户消息为内核消息,调用NtUserMessageCall来传递消息。LRESULT WINAPI SendMessageW(HWND Wnd, UINT Msg, WPARAM wParam

飞鸟的专栏 1907

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

分析了一下360安全卫士的hook(zt)

分析了一下360安全卫士的hook(zt)2010-6-3 18:36阅读(12) 分析了一下360的HOOK,通过直接hook KiFastCallEntry实现以所有系统调用的过滤。 我分析的版本如下: 主程序版本: 6.0.1.1003 HookPort.sys版本: 1, 0, 0, 1005 HookPort.sys的TimeStamp: 4A8D4AB8 简

lionzl的专栏 3505

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

沙盘Sandboxie 原理分析

Sandboxie. Process isolation with kernel hooks. May 23rd, 2011 Posted in Uncategorized Write comment 1. Introduction: Sandboxie

xcntime的专栏 7791

WPF自定义控件——顶级控件

作为一个WPF程序员,我最希望看到的是WPF的应用,或者更确切的说是绚丽的应用,虽然限于自身的实力还不能拿出成绩来,但看到别人的作品时,心里还是有很大的宽慰——WPF是可以做出更加动人地产品的,只要你坚定的走下去,带着不满现状的追求走下去。 下图是Telerik的WPF控件,我相信很多人也下过他的DEMO,研究过他的代码,并由此激起对WPF的信心。今天我们就来仿造他的Drag...

weixin_30892037的博客 738

Win32k(2) 报文驱动的通信机制

一.应用层的apiint APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,intnCmdShow){ WNDCLASSEXwcex; wcex.lpfnWndProc ...

weixin_30782331的博客 234

Shadow SSDT

 A、Shadow SSDT表基址定位    B、Shadow SSDT表结构    C、Shadow SSDT HOOK KeServiceDescriptorTable //系统描述符表 extern KeServiceDescriptorTableShadow //影子系统描述符表  win32k.sys bp win32k!NtUserPostMessage bp win32k...

crkres9527 597

Windows Message 消息队列,消息循环,Post消息,Send消息

MessageQueue The system does not automatically create a messagequeue for each thread. Instead, the system creates a message queue only for threads that performoperations which require a message queu

yyw610879290的专栏 2013

鼠标静止不动时候的消息

优化程序的时候发现鼠标放在控件上不动也会不停的收到WM_MOUSEMOVE消息。 1, 于是想了各种办法寻找是哪儿触发的。 bp USER32!PostMessageW ".echo PostMessageW_Breakpoint_hit; g" bp USER32!SendMessageW ".echo SendMessageW_Breakpoint_hit; g" *Message没...

weixin_30553837的博客 354

简单实现了下SSDT SHADOW HOOK

介绍: SSDT SHADOW HOOK可用于安全软件窗口保护、安全输入、截屏保护等。例如:挂钩NtUserFindWindowEx、NtUserGetForegroundWindow、NtUserBuildHwndList、NtUserQueryWindow、NtUserWindowFromPoint、NtUserSetParent、NtUserPostMessage、NtUserMes...

huobengle 842

分析了一下360安全卫士的HOOK

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!                by: achilli

jgftyfc的博客 520

说说猎豹安全浏览器

最近金山也加入了浏览器大军,推出了其首款浏览器 - “猎豹”,主打安全牌,直指360安全浏览器。我在第一时间拿到了猎豹浏览器的安装包,使用感受是,总体来说还不错,但是需要完善的地方还有很多。 其中其主打宣称的BIPS (Browser Intrusion Prevention System)安全系统有种令人眼前一亮的赶脚,是否真的有这么神奇吗?于是我操起IDA简单的分析了一下。 1.猎豹浏览器

莫灰灰的专栏 5663
上一篇: 绕过xp sp2防火墙的代码
下一篇: 关于HOOK截入中文输入
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值