草庐IT

c++ - DLL 注入(inject)的最佳实践?

coder 2024-02-19 原文

假设我想将一个 DLL 注入(inject)到一个进程中,该进程希望每 250 毫秒编辑一次地址 A 的值。我需要使用 DllMain,对吧?问题是我不允许在 DllMain 中等待。所以我必须创建一个线程?或者这不会绕过限制?我该怎么做呢?

另外,与使用 EXE 相比,使用 DLL 注入(inject)来编辑应用程序的内存有什么好处吗?

另外,CreateThread 中的堆栈大小应该是多少?如果它太小或太大怎么办?我怎么知道我需要多少?

最佳答案

根据您的描述,您似乎已经知道如何让目标进程加载您的 DLL。如果我的假设是正确的,那么答案很简单:从 DLLMain 创建一个线程并在该线程中实现您的逻辑。只要您的代码遵守下面列出的规则,您应该没问题。

document描述了在 DLLMain 中可以做什么和不能做什么以及为什么。

如文档所述,您永远不应在 DllMain 中执行以下任务:

  • 调用 LoadLibrary 或 LoadLibraryEx(直接或间接)。 这可能会导致死锁或崩溃。
  • 与其他线程同步。这可能会导致死锁。
  • 获取等待获取加载器的代码所拥有的同步对象 锁。这可能会导致死锁。
  • 使用 CoInitializeEx 初始化 COM 线程。在一定条件下,这个函数可以调用 加载库Ex。
  • 调用注册表函数。这些函数在 Advapi32.dll 中实现。如果 Advapi32.dll 未在您的 DLL 之前初始化,则 DLL 可以访问未初始化的内存并导致进程崩溃。
  • 调用 CreateProces。创建进程可以加载另一个 DLL。
  • 调用 ExitThread。在 DLL detach 期间退出线程会导致再次获取加载程序锁,从而导致死锁或崩溃。
  • 调用创建线程。如果不与其他线程同步,则创建线程可以工作,但存在风险。
  • 创建命名管道或其他命名对象(仅限 Windows 2000)。在 Windows 2000 中,命名对象由终端服务 DLL 提供。如果此 DLL 未初始化,则对该 DLL 的调用可能会导致 进程崩溃。
  • 使用动态 C 运行时 (CRT) 的内存管理功能。如果未初始化 CRT DLL,调用这些函数可能会导致进程崩溃。
  • 调用 User32.dll 或 Gdi32.dll 中的函数。某些函数会加载另一个可能未初始化的 DLL。
  • 使用托管代码。

在 DllMain 中可以安全地执行以下任务:

  • 在编译时初始化静态数据结构和成员。
  • 创建并初始化同步对象
  • 分配内存并初始化动态数据结构(避免上面列出的函数。)
  • 设置线程本地存储 (TLS)。
  • 打开、读取和写入文件。
  • 调用 Kernel32.dll 中的函数(上面列出的函数除外)。
  • 将全局指针设置为 NULL,推迟动态成员的初始化。在 Microsoft Windows Vista™ 中,您可以使用一次性初始化函数来确保一段代码在多线程环境中只执行一次。

你的第二个问题我不太清楚。要将代码注入(inject)另一个进程,您必须从某个地方(浏览器、exe 等)开始,然后写入目标进程内存以让它加载您的 DLL。

关于c++ - DLL 注入(inject)的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16254721/

有关c++ - DLL 注入(inject)的最佳实践?的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  5. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  6. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  9. ruby - 这个 ruby​​ 注入(inject)魔术是如何工作的? - 2

    我今天看到了一个ruby​​代码片段。[1,2,3,4,5,6,7].inject(:+)=>28[1,2,3,4,5,6,7].inject(:*)=>5040这里的注入(inject)和之前看到的完全不一样,比如[1,2,3,4,5,6,7].inject{|sum,x|sum+x}请解释一下它是如何工作的? 最佳答案 没有魔法,符号(方法)只是可能的参数之一。这是来自文档:#enum.inject(initial,sym)=>obj#enum.inject(sym)=>obj#enum.inject(initial){|mem

  10. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

随机推荐