从托管代码中挂钩 LoadLibrary 调用

2023-11-29

我们希望挂钩对 LoadLibrary 的调用,以便下载未找到的程序集。我们有一个 ResolveAssembly 处理程序来处理托管程序集,但我们还需要处理非托管程序集。

我们尝试通过“Microsoft Windows 的编程应用程序”中指定的技术重写导入表来挂钩 LoadLibrary 调用,但是当我们调用 WriteProcessMemory() 时,我们收到权限被拒绝错误 (998)。 (是的,我们正在以更高的权限运行)

有没有人在加载 CLR 时成功重写导入表?有人能指出我正确的方向吗?

Update:我们解决了权限被拒绝的问题,但现在当我们迭代混合程序集(托管+非托管)的导入表时,我们找到的唯一条目是 mscoree.dll。有谁知道如何找到本地进口的吗? (我们正在使用 C++/CLI).


我已成功挂接到托管代码。不过,我是通过将非托管 DLL 注入远程进程并让它重写 DllMain 中的导入表来实现的。您可能需要考虑这种方法。

这是我的挂钩函数:

//structure of a function to hook
struct HookedFunction {
public:
    LPTSTR moduleName;
    LPTSTR functionName;
    LPVOID newfunc;
    LPVOID* oldfunc;
};

BOOL Hook(HMODULE Module, struct HookedFunction Function) {
    //parse dos header
    IMAGE_DOS_HEADER* dos_header = (IMAGE_DOS_HEADER*)Module;
    if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return 0; //not a dos program

    //parse nt header
    IMAGE_NT_HEADERS* nt_header = (IMAGE_NT_HEADERS*)(dos_header->e_lfanew + (SIZE_T)Module);
    if (nt_header->Signature != IMAGE_NT_SIGNATURE) return 0; //not a windows program

    //optional header (pretty much not optional)
    IMAGE_OPTIONAL_HEADER optional_header = nt_header->OptionalHeader;
    if (optional_header.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) return 0; //no optional header

    IMAGE_IMPORT_DESCRIPTOR* idt_address = (IMAGE_IMPORT_DESCRIPTOR*)(optional_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + (SIZE_T)Module);
    if (!optional_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size) return 0; //no import table

    //enumerate the import dlls
    BOOL hooked = false;
    for(IMAGE_IMPORT_DESCRIPTOR* i = idt_address; i->Name != NULL; i++)
        //check the import filename
        if (!_stricmp(Function.moduleName, (char*)(i->Name + (SIZE_T)Module)))
            //enumerate imported functions for this dll
            for (int j = 0; *(j + (LPVOID*)(i->FirstThunk + (SIZE_T)Module)) != NULL; j++)
                //check if the function matches the function we are looking for
                if (!_stricmp(Function.functionName, (char*)(*(j + (SIZE_T*)(i->OriginalFirstThunk + (SIZE_T)Module)) + (SIZE_T)Module + 2) )) {
                    //replace the function
                    LPVOID* memloc = j + (LPVOID*)(i->FirstThunk + (SIZE_T)Module);
                    if (*memloc != Function.newfunc) { //not already hooked
                        DWORD oldrights;
                        DWORD newrights = PAGE_READWRITE;
                        VirtualProtect(memloc, sizeof(LPVOID), newrights, &oldrights);
                        if (Function.oldfunc && !*Function.oldfunc)
                            *Function.oldfunc = *memloc;
                        *memloc = Function.newfunc;
                        VirtualProtect(memloc, sizeof(LPVOID), oldrights, &newrights);
                    }
                    hooked = true;
                }

    return hooked;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从托管代码中挂钩 LoadLibrary 调用 的相关文章

  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • *.tlb 文件在运行时使用过吗?

    我正在开发一个通过 COM 互操作公开一些 NET API 的产品 作为构建的一部分 我们为所有此类程序集生成 tlb 文件 并将它们作为单独 SDK 包的一部分提供 我们的客户可以在我们的产品之上安装 SDK 并创建使用我们的 COM A
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 打开“DEBUG”宏值

    在我的代码中 我想有条件地执行一些操作 ifdef DEBUG NSLog I m in debug mode endif 我已配置 项目 gt 编辑项目设置 gt 构建 选项卡 以便 DEBUG 列为用户定义设置 其值为 1 在 配置 下
  • Tkinter 侧边栏

    我想创建一个像上面那样可折叠的侧栏 在折叠形式中 侧栏仅包含选项的图标 当您将鼠标悬停在侧栏上时 侧栏将展开 显示图标的描述 名称 如果您单击该图标 它将带您进入该图标指定的功能 例如设置页面 右侧是带有很多按钮的主页 我不知道你会如何做到
  • 使用 Sails.js 进行个性化聊天

    sails js 中是否有一种方法或教程可以帮助我使用套接字 例如 pubnub 构建点对点聊天 我正在尝试使用 sails js 实现个性化聊天功能 这意味着我的应用程序中有多个用户 并且一个用户可以与另一个用户聊天 因此 如果用户 A
  • 如何通过Matlab正确读取串口数据

    我正在使用 Matlab 从微处理器的串行端口读取数据 数据为十六进制格式 每个样本为 4 个字节 32 位 当我读取这些数据时 我得到一些与传输的数据不匹配的随机数字序列 下面是我的代码 s serial COM16 assigns th
  • 在 JavaScript 中更改所选文本的字体样式

    我正在使用 javascript 没有任何库 现在我只想更改文本区域所选文本的字体样式 我使用以下函数提取了选择的文本 有人可以帮忙吗 function ShowSelectionInsideTextarea editor var text
  • 使用 SessionRegistry 获取登录用户

    我有一个完全由 Weblogic 容器保护的 Web 应用程序 现在我必须列出当前登录的用户 我必须使用 Spring Security 2 0 4 在 web xml 中我定义了必要的监听器和过滤器
  • 如何更改 Bash 中的命令行参数?

    有没有办法更改 Bash 脚本中的命令行参数 例如 Bash 脚本的调用方式如下 foo arg1 arg2 有没有办法更改脚本中 arg1 的值 就像是 1 chintz 您必须重置所有参数 改变例如争论 3 set 1 2 new ar
  • 如何获取 UTF-8 JSON

    我正在使用 LitJSON 库 但事情变得有点奇怪 你知道有什么 JSON 库可以在转换时保留重音符号吗 这是测试 测试 json id CS 001 name L l ment type T t id CS 002 name L outr
  • Django - 使用 PostgreSQL 和 Elasticsearch 进行全文搜索

    我有一个Django and Django REST Framework供电的 RESTful API 与PostgreSQLDB后端 支持对特定模型进行过滤 现在我想添加全文搜索功能 是否可以使用Elasticsearch进行全文搜索 然
  • 通过发送 SOAP 请求来实现 Air API

    我有一个 php 网站 这里我需要实现机票搜索和预订功能 为了做到这一点 我使用了 ARZOO 网站的付费 API 我从 ARZOO 获取了所有文档 我已阅读整个文档 医生说 Accessing this service requires
  • MPAndroidChart - 如何最好地将 X 轴值设置为字符串/日期?

    我对此有点迷失MPAndroid图表库 我开始了初学者的例子here 它建议使用 getValueX 和 getValueY 方法创建一个对象数组 列表 然后将其添加为条目 如下所示 List
  • 如何编写“sed”脚本,用另一个文件的内容替换两个标记之间的文本

    我正在尝试写一个sed用另一个文件的内容替换两个标记之间的文本的脚本 假设我有以下带有标记的文件 and index html p Old content p 我想用该文件的内容替换随附的文本 snippet html p New cont
  • 理解@interface声明中“(Private)”的这种用法

    我见过一些这样写的代码 interface AViewController Private 我想知道是否是这样 Private 提交到 App Store 时意味着什么 一般而言 这意味着什么 这是一个名为 私人 的类别 看看类别和扩展Ob
  • TimeSlider 插件和传单 - 标记未按顺序出现

    更新了一个JSFIDDLE 链接 我正在使用 LeafletJS 构建带有时间轴滑块的网络地图 我正在使用LeafletSlider插件显示一组基于名为的 GEOJSON 属性的标记DATE START 这是我的数据对象的示例 var ca
  • PDF 发送意图上的 Android SecurityException

    我在执行期间遇到以下异常ACTION SEND数据类型的意图application pdf java lang SecurityException Permission Denial starting Intent act android
  • ios - 在 WkWebView 中禁用 Youtube 自动播放

    我在用着WKWebView打开pages in Youtube 问题是 打开后他们开始播放视频并进入全屏 这是不想要的行为 视频未嵌入 它是带有描述 评论等的整个页面 有办法阻止他们玩吗 有用 请阅读评论 import UIKit impo
  • 您是否必须在 Redis 脚本中提前声明您的密钥?

    我的计划是将一些现有的 Redis 键存储在哈希中 稍后从 Redis Lua 脚本中获取并执行操作 我读到 最佳实践是在调用时提供脚本中使用的所有键EVAL 我的问题是 运行运行时没有提供任何密钥的脚本是否安全EVAL 但对从以下位置获取
  • `DS.attr()` 中的嵌套对象不受 `DS.rollbackAttributes()` 影响

    我有一个模型User如下 import DS from ember data const attr Model DS export default Model extend name attr string properties attr
  • templateUrl 更改时 AngularJS Modal 不显示

    到目前为止 我所拥有的是 Angular UI 示例 控制器 var ModalDemoCtrl function scope modal scope open function var modalInstance modal open t
  • 从托管代码中挂钩 LoadLibrary 调用

    我们希望挂钩对 LoadLibrary 的调用 以便下载未找到的程序集 我们有一个 ResolveAssembly 处理程序来处理托管程序集 但我们还需要处理非托管程序集 我们尝试通过 Microsoft Windows 的编程应用程序 中