凭借我对C ++的基本知识,我设法将一个简单的程序组合在一起,该程序从程序中读取一些数据(使用ReadProcessMemory )并每隔五分钟将其发送到我的Web服务器,所以我不在家时可以看到所述节目的状态。
我发现内存地址可以通过一个名为“内存黑客软件”的游戏程序来读取。问题是,每当我将程序移动到另一台机器时,地址都会改变。
我的问题是:有没有办法找到任何机器上相同的“永久”地址?或者这根本不可能。如果这是一个愚蠢的问题,请原谅我,但我不太了解这个问题。或许是另一种从正在运行的程序中访问信息的方法。
感谢您的帮助!
答案 0 :(得分:4)
有很多方法可以识别您正在寻找的东西周围的记忆模式。即使使用“移动”的软件,破解者也可以使用它来查找要修补的内存位置,可以这么说(就像提供地址空间随机化的操作系统一样)。
例如,如果您知道固定字符串总是位于感兴趣区域之外的X
字节,则可以扫描整个地址空间以找到它们,然后从中计算感兴趣的区域。 / p>
但是,它并不总是像你想象的那样可靠。
我会考虑另一种实现目标的方法,一种不涉及保护此类软件免受恶意行为影响的功能。
想想像:
这样的问题为什么根本需要访问地址空间?
程序本身是否以更可行的方式提供状态信息?
如果该程序是您的,您可以修改它以提供该信息吗?
如果您只需要知道程序是否正在执行其工作,您是否可以简单地“ping”该程序(例如,对于网页,发送HTML请求并确保您获得有效的响应)?
作为最后的手段,您是否可以说服操作系统在没有地址空间随机化的情况下加载您的程序然后继续使用您的(有点可疑)方法?
鉴于您的评论:
我在四台机器上使用该程序,每次更新程序时,我都必须“重新找到”所有这些地址(其中8个)。
我只是选择自动执行此过程。这就是一些破解软件所做的。它扫描文件或内存中的代码和数据,寻找可用于定位感兴趣区域的标记。
如果你可以手动完成,你应该能够编写一个可以执行此操作的程序。让该程序找到感兴趣的区域(通过阅读进程地址空间),一旦找到它们,只需从那里读取您需要的信息。如果找到它们的方法随每个版本(而不仅仅是实际位置)而变化,那么您可能需要在软件的每个版本中更新定位器例程,但不幸的是,这是您为所选方法支付的价格。 / p>
您尝试阅读的程序不太可能像某些程序一样安全 - 我已经看到有些人在计划运行时移动他们感兴趣的领域,试图混淆黑客。
答案 1 :(得分:0)
你所要求的是不可能的设计。 ASLR专门用于防止这种窥探。
您从远程流程获得了哪些信息?
答案 2 :(得分:0)
抱歉,这是不可能的。进程的内存布局不会可靠一致。
您可以通过多种方式实现目标: