jjzjj

c# - 更改进程的基址指针

coder 2024-06-22 原文


我有一个关于指针和内存分配的更理论化的问题。
比方说我有一个正在运行的进程,它分配了从 0x01 到 0x03 的 2 个字节。
如果我想从该内存中读取,我可能会使用 ReadProcessMemory。
但是我具体应该给出什么指针?
它是相对指针还是绝对指针?
可以说这个指针是相对的,所以我用指向 0x00 的指针调用 ReadProcessMemory。
但是 Windows 是如何知道进程内存从哪里开始到哪里结束的呢?
Windows 是否不必保存内存属于(或由其分配)进程的地址?
但是 Windows 在哪里保存这些信息以及它如何知道它保存信息的位置?
我听说过一种叫做“基本指针”的东西。我想这就是我要找的。
内存属于进程的地方。
好的,但现在假设我想将某个进程的内存复制到某个地方(也许是 HDD?),以便暂时清理我的内存。然后我想把内存放回原来的位置,但我不能告诉 Windows“从 0x00c 分配 2048 字节到 0x80c”。
我必须说“在某处分配 2048 字节”,然后 Windows 告诉我“某处”的位置' 是。
但是如果我再次重新启动我的应用程序,我将不得不告诉它“你好进程,你的整个内存不再是 0x01,它现在是 0x0c”。
有什么方法可以做到这一点吗?也许是 c# 或 c++,或者只是一个意见(这又是一个理论问题。无关好坏,只是有可能吗?)。

最佳答案

OK, but now let's say I want to copy the memory of a process somewhere (HDD maybe?) to clean up my memory for a little while. Then I want to put memory back where it was before, but I cant tell windows 'allocate 2048 bytes from 0x00c to 0x80c'.

只需自己分配内存即可。 Windows是一个虚拟内存系统。如果它不能将内容放入物理内存,那么它只会将内存分页回磁盘。您不需要做任何工作来导致这种情况发生。

编辑:在对评论的更多回应中,如果您想实际解除分配其他进程使用的内存,那您就完全不走运了。您无法可靠地确定目标进程如何使用该内存,并且您可能会由于访问冲突而导致目标进程立即终止。

此外,Windows NT 及其衍生产品上的所有内存分配都归结为 VirtualAlloc 函数,这些函数只能在调用进程的上下文中使用——您不能强制其他进程为您做这件事。

我想你可以自己编写一个内核驱动程序,它将随机垃圾写入内存管理器,让它做你想做的事,但至少你会导致目标进程失败,并且很可能导致目标进程失败整个系统。

但是,您的问题从根本上讲没有意义,因为 Windows 已经做出了类似的决定,将进程的内存移出到磁盘。 Windows 是 virtual memory系统,并且特定的内存位置仅在现有进程的上下文中才有意义。

关于c# - 更改进程的基址指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4350328/

有关c# - 更改进程的基址指针的更多相关文章

  1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  3. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  4. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  5. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

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

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

  7. ruby - 更改 ActiveRecord 中对象的类 - 2

    假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。

  8. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  9. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐