CoreHook:基于.NET Core运行时实现的Windows HOOK库 – 作者:周大涛

今天为大家介绍一款基于.NET Core运行时实现的Windows HOOK库,CoreHook

建立状态

构建服务器 平台
AppVeyor windows
Azure管道 Linux,Windows
Travis CI Linux

特征

1.拦截公共API函数,如CreateFile

2.如果符号文件可用,则按地址或名称拦截内部函数;

3.支持插件库的NuGet包引用;

4.支持插件的多种架构;

有关更多信息,请参阅wiki

支持的平台

CoreHook支持在运行Windows的各种体系结构上进行应用程序函数调用拦截。还计划了Linux和macOS支持。

平台

Architecture 操作系统
x86 Windows
x64 Windows
ARM Windows 10 IoT Core

经过测试的平台

操作系统 架构
Windows 7 SP1 x86,x64
Windows 8.1 x86,x64
Windows 10(Win32) x86,x64,ARM
Windows 10(UWP) x86,x64
Windows Server 2008 x86,x64
Windows Server 2012 x86,x64
Windows Server 2016 x86,x64
Windows Server 2019 x86,x64

依赖

1..NET核心

2.CoreHook.Hooking

3.CoreHook.Host

例子

1.FileMonitor – 通用Windows平台(UWP)

2.FileMonitor – Windows桌面应用程序(Win32)

插件示例

1.可以在此存储库中找到更多插件示例

用法

windows

如果要构建CoreHook项目(例如,使用dotnet build)而不发布它,则必须按如下所述设置项目配置。

项目配置

该项目提供了两个配置运行时的选项:

名为CoreHook.CoreLoad.runtimeconfig.json (位于CoreHook.CoreLoad.dllCoreHook输出目录中的程序集)的本地配置文件,用于初始化CoreCLR。

全局配置文件dotnet.runtimeconfig.json

主机模块将首先尝试使用本地配置文件,然后它将检查全局配置文件(如果存在),最后它将使用CoreHook.CoreLoad.dll程序集的目录来解析依赖项。

runtimeconfig文件必须包含用于在目标应用程序中托管.NET Core的框架信息。构建任何.NET Core应用程序时,会将这些文件生成到输出目录。有关配置选项的更多信息,请参见此处

你可以使用CoreHook.FileMonitor.runtimeconfig.jsonCoreHook.FileMonitor.runtimeconfig.dev.json构建输出目录中文件作为创建全局或本地配置文件的参考。

运行时配置文件应如下所示,其中additionalProbingPaths包含主机模块可以检查其他依赖项的文件路径。本指南假设您已.NET Core 2.2为x86和x64体系结构安装了运行时或SDK。

注意:使用<user> 本地计算机用户名替换或修改指向NuGet软件包安装位置的路径。看看CoreHook.FileMonitor.runtimeconfig.dev.json在输出目录中找到。

  { 
"runtimeOptions": {
  "tfm": "netcoreapp2.2",
  "framework": {
    "name": "Microsoft.NETCore.App",
    "version": "2.2.0
  },
  "additionalProbingPaths": [
    "C:\\Users\\<user>\\.dotnet\\store\\|arch|\\|tfm|",
    "C:\\Users\\<user>\\.nuget\\packages",
    "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
  ]
}
}

本地配置

要使用本地配置,请创建一个包含上述内容的文件,CoreHook.CoreLoad.runtimeconfig.json并将其保存到所在的项目输出目录中CoreHook.CoreLoad.dll

全局配置

要使用全局配置,请首先dotnet.runtimeconfig.json使用上述内容创建一个文件并将其保存到文件夹中。这将是项目用于初始化目标进程中的运行时的全局配置文件。在此示例中,我们的文件保存在C:\CoreHook\dotnet.runtimeconfig.json

x86x64应用程序的环境变量设置为运行时配置文件的目录。这允许您为应用程序32-bit64-bit应用程序提供不同的配置文件。

例如(如果您将文件保存为另一个安装目录或驱动器,请确保使用该路径):

1.设置CORE_ROOT_32C:\CoreHook32-bit应用。

2.设置CORE_ROOT_64C:\CoreHook64-bit应用。

setx  CORE_ROOT_64  “C:\ CoreHook”  
setx CORE_ROOT_32 “C:\ CoreHook”

或者将它们设置为当前命令提示会话:

set CORE_ROOT_64=C:\CoreHook 
set CORE_ROOT_32=C:\CoreHook

然后,您可以打开CoreHook解决方案Visual Studio或运行dotnet build以构建库和示例。

安装依赖项

CoreHook.HookingCoreHook.Host构建或下载二进制版本。您可以使用download-deps脚本,该脚本将最新的二进制版本下载到deps项目根目录中调用的文件夹中。将coreload32.dll (X86, ARM)和/或coreload64.dll (X64, ARM64)二进制文件放在程序的输出目录中。然后,将corehook32.dll (X86, ARM)和/或corehook64.dll (X64, ARM64)二进制文件放在同一个输出目录中。这些是使用上述示例所需的所有文件。

然后,您可以启动上面构建的程序。

Windows 10 UWP

您可以使用此脚本获取为FileMonitor示例启动UWP应用程序所需的应用程序用户模型标识(AUMID)

  $installedapps = get-AppxPackage 

$aumidList = @()
foreach ($app in $installedapps)
{
  foreach ($id in (Get-AppxPackageManifest $app).package.applications.application.id)
  {
      $aumidList += $app.packagefamilyname + "!" + $id
  }
}

$aumidList

您可以使用$aumidList变量打印列表。

注意:目前无法在.NET Core平台上的管道上设置正确的访问控制,此处正在跟踪问题,因此我们使用P / Invoke kernel32.dll!CreateNamedPipe直接调用。

Windows 10物联网(ARM)

Raspberry Pi本身仅作为部署目标受支持,但也有不受支持的SDK版本。按照此链接阅读有关发布过程的更多信息。

对于Windows 10 IoT Core,您可以通过运行publish.ps1 PowerShell脚本来发布应用程序。

.\publish -example win32 -runtime win-arm

确保还要复制coreload32.dllcorehook32.dll程序目录。例如,应用程序目录结构应如下所示:

  [+]Publish\win32\win-arm\ 
  [+]Hook\
      ...
      [-] CoreHook.FileMonitor.Hook.deps.json
      [-] CoreHook.FileMonitor.Hook.dll
      ...
  ...    
  [-] CoreHook.FileMonitor.dll
  [-] CoreHook.FileMonitor.exe
  [-] corehook32.dll
  [-] coreload32.dll
  ...

然后,您可以将该文件夹复制到您的设备并启动该CoreHook.FileMonitor.exe程序。

发布脚本

PowerShell脚本publish.ps1允许您将示例发布为自包含的可执行文件。默认配置是Release,输出将在Publish目录中,在与发布脚本相同的位置创建。

.\publish -example [uwp|win32] -runtime [Runtime IDentifier] -configuration [Debug|Release] 

例如,命令

.\publish -example win32 -runtime win10-arm    

将创建一个名为Publish/win32/win10-arm/包含该CoreHook.FileMonitor示例的文件夹。

Windows符号支持

CoreHook支持从PDB查找符号名称以获取使用的函数地址LocalHook.GetProcAddress。要使符号查找起作用,您必须将PDB文件放在要挂钩的目标程序的目录中,或将环境变量_NT_SYMBOL_PATH设置为符号服务器。您可以从此处的Microsoft文档中了解有关Windows符号支持的更多信息。

要点:要使用完整的符号查找,您需要同时拥有dbghelp.dll(提供符号查找API)和symsrv.dll(提供符号服务器查找)并在DLL搜索路径中。您可以将这些文件添加到目标程序的目录中,也可以将它们添加到路径中。您可以通过安装 Windows调试工具来获取这两个DLL 。

您可以找到dbghelp.dll和的示例位置symsrv.dll

1.%PROGRAMFILES(X86)%\ Windows Kits \ 10 \ Debuggers \ x86(适用于32位应用程序)

2.%PROGRAMFILES(X86)%\ Windows Kits \ 10 \ Debuggers \ x64(适用于64位应用程序)

您可以将环境变量设置为的示例_NT_SYMBOL_PATH如下:

srv*C:\SymbolCache*https://msdl.microsoft.com/downloads/symbols 

C:\SymbolCache文件夹是本地缓存目录,可以存储或下载符号文件。当Windows需要检索DLL的PDB时,它可以从中下载它们https://msdl.microsoft.com/downloads/symbols并将它们存储在一个文件夹中供调试器使用。

您可以通过运行符号测试来确认是否正确配置了符号支持。

*参考来源:github,FB小编周大涛编译,转载请注明来自FreeBuf.COM

来源:freebuf.com 2019-06-08 15:00:08 by: 周大涛

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论