从 x64 进程将 x86 代码注入到 x86 进程

2023-12-01

我意识到标题有点复杂,所以让我解释一下我想要做什么:

我刚刚完成了一个简单的 DLL 注入器的编写,用于验证我正在尝试编写的概念。该程序拍摄当前进程的快照,枚举进程树,并将 DLL 注入其直接父进程。现在,在理想条件下,效果很好:32 位版本的注入器可以注入到 32 位父进程中,64 位版本的注入器可以注入到 64 位父进程中。

不过,我现在想做的是将 32 位 DLL 从 x64 注入器注入到 32 位父进程中。注入该 DLL 后,我希望注入对所注入 DLL 导出的函数之一的调用。但我不确定这是否真的可行。 (我已经编写了一些代码来识别父进程是 32 位进程还是 64 位进程,所以这不会成为问题)

现在,我已经找到了一些似乎可以完成第一部分的代码将预编译的机器代码注入进程中。 (至少,我认为这就是它正在做的事情)通常,在注入对 LoadLibraryW 的调用之后,我会获取该调用返回的地址,将相对偏移量添加到我想要调用的导出函数,然后注入对该函数的调用功能。但在这种情况下,我无法将 32 位库加载到我的 64 位注入器中,因此我无法使用以下命令找到函数的相对偏移量获取进程地址就像我平常会做的那样。我通过执行以下操作解决了这个问题:

由于我无法使用正常方法找到 32 位 DLL 的函数偏移量,因此我当前正在将文件读入缓冲区,并使用该缓冲区填充IMAGE_NT_HEADERS32struct,并枚举 IMAGE_EXPORT_DIRECTORY 以查找所有导出函数的名称和相对偏移量。

所以此时,我有以下几点:

  • 加载到32位进程中的32位DLL
  • 在 32 位进程中运行以下代码时,该值相当于 funcAddr:

Code:

HMODULE hInjectedDLL = LoadLibrary("mydll.dll");
DWORD funcAddr = (DWORD)GetProcAddress(hInjectedDLL, "ExportedFunc") - (DWORD)hInjectedDLL;

理论上,我现在需要的只是 hInjectedDLL 的值,并且我应该能够调用该函数。但不幸的是,我对汇编或机器代码了解不够,不知道如何获取该值。

有任何想法吗?

(另外,我知道,只需编译两个版本的注入器,并在父进程的处理器架构不匹配时让一个版本运行另一个版本,我就可以省去很多麻烦。我试图避免去不过这条路线。)

Edit:我认为这可能有助于解释我在这个概念验证中实际想要完成的任务。

我正在尝试一个想法,我必须允许在当前控制台中执行子进程,而不需要原始进程等待子进程完成。由于没有内置 API 可以在控制台应用程序中执行此操作,因此您通常会陷入进程树中,所有进程都在等待各自的子进程完成。为了促进此功能,我想要执行以下操作:

注射

DLL注入器将扮演“执行进程”的角色。 (通常必须等到子进程完成的进程)运行时,它确定其父进程的平台,以及父进程是否是基于控制台的应用程序。如果不是,该过程简单地使用exec 函数族运行所需的子进程,立即退出。如果父进程是控制台应用程序,则注入器确定使用哪个DLL,挂起最初创建注入器进程的线程,然后将DLL注入到父进程中。

解决我们的函数

一旦 DLL 就位,注入器就会确定 DLL 导出的函数的地址。 (通常,我会通过调用来做到这一点创建远程线程进行初始注射,然后使用获取退出代码线程在该线程上获取父进程中 DLL 的基地址。一旦我有了它,就可以通过简单的算术找到导出函数的地址,然后我可以用它来注入对该函数的第二次调用。

调用我们的函数

导出的函数将类似于:

BOOL RewriteHProcess(HANDLE hProcess)

注入器将再次使用 CreateRemoteThread 从父进程的上下文中调用此函数,其中 hProcess 是注入器进程的句柄。在 DLL 方面,该函数将执行两件事之一(考虑到跨线程内存访问的安全限制,我不太确定我的第一个想法是否可行,因此我将第二个想法放在一起进行回退,如果首先是行不通的。)

  1. RewriteHProcess会打开之前挂起的线程进行读写,并使用读取进程内存,它将在进程的内存中搜索我们的注入器进程的句柄。 (我们假设父进程当前正在阻止进一步执行等待单个对象功能。我知道命令提示符至少可以做到这一点,这也是我目前关注的焦点)DLL 然后调用一个内部函数来创建我们想要的子进程,关闭旧句柄,并用新句柄覆盖内存子进程。此时,它会清理它能清理的内容,然后返回。然后,注入器将执行所需的任何剩余清理工作,恢复挂起的线程,关闭进程和线程的句柄,然后退出,使父进程在等待新子进程结束时继续阻塞。

  2. 如果该路线不可行,我的后备方案是挂起注入器的阻塞线程,在注入的 DLL 中创建新的子进程,清理并退出注入器,然后在 DLL 中等待,直到子进程完成。此时,DLL 将进行清理、恢复挂起的线程并自行卸载。 (不过,此路线的缺点是父进程从注入器返回的返回代码可能与目标子进程的返回代码不同)


Use VirtualAllocEx()在目标进程内部分配一块可执行内存,然后使用WriteProcessMemory()根据需要将 x86 或 x64 机器指令写入该内存块。让这些指令调用LoadLibrary(), GetProcAddress(),根据需要导出的 DLL 函数。然后使用CreateRemoteThread()来执行内存块。如果导出的 DLL 函数在单独的进程中运行,则注入器无法直接调用该函数。导出的函数必须在目标进程的上下文中加载和调用。并且不减去返回值LoadLibrary()从返回值GetProcAddress(). GetProcAddress()返回指向该函数的直接内存指针,以便可以直接调用它。

Update:一种变体是,当使用以下命令调用它时,将所有注入的代码放入 DLL 的入口点内(或者让入口点生成一个线程来运行代码)DLL_ATTACH_PROCESS原因。因此无需从 DLL 中导出任何函数。然后你可以使用VirtualAllocEx() and WriteProcessMemory()将DLL的路径存储到目标进程中,然后使用CreateRemoteThread()调用LoadLibrary()直接地。内核函数在进程之间始终具有相同的内存地址,因此您的注入进程可以调用GetProcAddress()在自己的地址空间内获取地址LoadLibrary()然后将该指针传递给lpStartAddress的参数CreateRemoteThread()。这样,您就不必担心编写任何 x86/x64 汇编代码。

该技术更详细地描述于第三节本文的:

将代码注入另一个进程的三种方法

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

从 x64 进程将 x86 代码注入到 x86 进程 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 按成员序列化

    我已经实现了template
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • Office365 REST API - 创建带有附件的日历事件

    我无法使用 Office365 的 Rest API 创建带有附件的日历事件 创建没有附件的事件不是问题 尝试创建带有附件的事件会创建事件 但不会添加我发送的文件 服务器以 201 响应代码进行响应 我正在向以下地址发送 POST 请求 h
  • 按上次修改日期时间过滤 Onedrive 项目

    我尝试通过 lastModifiedDatetime 属性从 Microsoft Graph 端点中筛选 OneDrive 项目 像这样的东西 https graph microsoft com beta me drive special
  • 如何使用 Groovy 的正则表达式获取部分匹配的布尔值?

    Groovy 有一个正则表达式 匹配运算符 The 文档说它返回一个布尔值 但需要 严格匹配 它没有定义 严格匹配 我不熟悉该表达式所在的任何正则表达式系统false 但是 这就是 Groovy 告诉我的 foo bar baz bar g
  • 为什么不捕获一般异常

    我的VS刚刚告诉我 警告 2 CA1031 Microsoft Design 修改 Program Main string 以捕获比 Exception 更具体的异常或重新引发异常 我为什么要那么做 如果我这样做 并且没有捕获所有异常来处理
  • 如何实时回显输出(在脚本完成之前)?

    在脚本执行完毕之前如何输出到浏览器 例如 下面的代码将一次输出所有 100 个 hi 我该如何制作 以便在读取 处理该代码部分后立即输出 例如 PHPBB3论坛显示了逐步安装过程 在循环之前调用 ob implicit flush 请注意
  • 进入振奋精神; Qi还是X3?

    我正在和一个朋友一起为一个小型个人项目做一名口译员 我们开始实现所有类和通用结构 其中代码将被翻译然后执行 只是为了推迟将实际解析代码放入这些结构中 现在我们必须构建解析器 经过一番搜索 我发现到处都有帖子和人们谈论spirit Qi和sp
  • whereArrayContains 限制为 10

    我要过滤问题集合基于tagIDs 一切工作正常但是其中数组包含最多适用于 10 个 id 我怎样才能提高我的结构工作超过10年tagIDs并且确保尽可能少地调用服务器减少金钱支出 Firestore root questions colle
  • 如何使用 Robot 在 IE11 中打开保存对话框弹出窗口

    我正在 IE11 上执行测试 无法使用任何其他浏览器 在执行时 我会弹出下载窗口 并希望将文件下载到 TestResult 文件夹中 我如何使用 Robot 来实现这一目标 我也读过有关 AutoIT 的内容 但不确定 因为我对这些还很陌生
  • AS3 - Flash/AIR 套接字通信 writeUTFBytes 仅有效一次

    我有一个套接字服务器侦听 2 个端口 其中 1 个端口用于套接字服务器 1 个端口用于策略服务器 我的代码如下 在这种情况下 数据发送和接收完全正常 但是 例如 如果我添加一个带有简单按钮的按钮 socket writeUTFBytes M
  • Exoplayer - 保存和恢复片段内旋转的状态

    我有一个托管 SimpleExoplayer 的片段 我想确保我正确处理屏幕旋转 现在 播放器重置到屏幕旋转的起点 我已经在 onStart 和 onResume 中实现了方法 所以我很好奇我需要哪些额外的代码 Override publi
  • 更改 Asp.Net 5 中的组件视图位置

    在 ASP NET 5 上 组件视图必须位于以下两个位置之一 Views NameOfControllerUsingComponent Components ComponentName Default cshtml Views Shared
  • 在 SQL 中计算连续缺勤

    我需要计算 SQL 中在某个日期范围内连续缺勤 X 次的所有员工 我们有一个缺勤表 其中包含员工每天缺勤的 1 条记录 还有一个日历表 其中包含一年中的工作日 tblAbsences EmployeeID int AbsenceDate d
  • excel VBA 不应该发生溢出错误

    Sub TestFunction Dim var As Double var 25 24 23 22 21 20 End Sub 我收到此 vba 操作的溢出错误 当我在具有函数的单元格中运行它时 我得到 127 512 000 这可能是什
  • 如何使用python(maya)多线程

    我一直在看其他人的例子 但我似乎无法让它正常工作 它要么使用单个核心 要么如果处理太多 基本上会冻结 Maya 但我似乎从来没有让多个核心同时工作 例如 这就是我希望它在非常基本的层面上做的事情 主要只是让每个循环在具有不同值的不同处理器上
  • OpenGL 上的多线程渲染

    我有一个多线程应用程序 我试图在其中使用不同的线程进行渲染 首先 我尝试在所有线程之间使用相同的渲染上下文 但我为其他线程获取了 NULL 当前上下文 我在互联网上读到 一个上下文一次只能在一个线程中存在 所以我决定做一些不同的事情 我创建
  • searchlogic 可以与 Rails 3 一起使用吗?

    如果不是 我的替代方案是什么 元空间 http metautonomo us projects metawhere 看起来是一个有前途的替代方案 ps 通过 ruby flow com 发现metawhere 元搜索 http metaut
  • DBI begin_work 不适用于存储过程调用

    我正在尝试以简化形式从事务中调用存储过程 my dbh DBI gt connect my sth dbh gt prepare call sp get workitems 1 1 dbh gt begin work or die dbh
  • Ruby on Rails 变形错误 - 未初始化常量

    我正在使用 Ruby on Rails 为我玩的游戏创建一个网站 我有一个User模型和一个Starbase模型 我试图建立的关系就像这样 class User lt ActiveRecord Base has many starbases
  • Django 2.2 破坏了以前工作的视图/url

    决定使用 Django 2 2 进行测试 项目当前运行的是 2 1 8 现在我什至无法启动服务器 我维护这个项目已经近两年了 这应该是一个小的更新 该错误似乎与我的观点有关 但我在中找不到任何内容发行说明这在 2 1 8 和 2 2 之间发
  • 从 x64 进程将 x86 代码注入到 x86 进程

    我意识到标题有点复杂 所以让我解释一下我想要做什么 我刚刚完成了一个简单的 DLL 注入器的编写 用于验证我正在尝试编写的概念 该程序拍摄当前进程的快照 枚举进程树 并将 DLL 注入其直接父进程 现在 在理想条件下 效果很好 32 位版本