win32 输出文字时清除之前的_CoreHook:基于.NET Core运行时实现的Windows HOOK库

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

建立状态

构建服务器平台
AppVeyorwindows
Azure管道Linux,Windows
Travis CILinux

特征

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

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

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

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

有关更多信息,请参阅wiki。

支持的平台

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

平台

Architecture操作系统
x86Windows
x64Windows
ARMWindows 10 IoT Core

经过测试的平台

操作系统架构
Windows 7 SP1x86,x64
Windows 8.1x86,x64
Windows 10(Win32)x86,x64,ARM
Windows 10(UWP)x86,x64
Windows Server 2008x86,x64
Windows Server 2012x86,x64
Windows Server 2016x86,x64
Windows Server 2019x86,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。

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

  {     "runtimeOptions": {       "tfm": "netcoreapp2.2",       "framework": {         "name": "Microsoft.NETCore.App",         "version": "2.2.0       },       "additionalProbingPaths": [         "C:\\Users\\\\.dotnet\\store\\|arch|\\|tfm|",         "C:\\Users\\\\.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.Hooking和CoreHook.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](https://msdl.microsoft.com/downloads/symbols)并将它们存储在一个文件夹中供调试器使用。

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

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

精彩推荐

fe7bd9ea56467f6e7c371ef5bbd09d99.png4a8de3f00ee9b56b0dd1d2ad583bed70.pngf4121931afd518620ecf8a9ffa826b72.pngdf8884de67618318df0af1dce96b54e7.pngf3eae993cd03c11f35b481c60bf2c0bb.gifcae1be725df95a6760d4f0bc566acb1b.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值