【问题标题】:Trying to overwrite memory at specific address试图覆盖特定地址的内存
【发布时间】:2012-09-11 17:45:47
【问题描述】:

我意识到试图篡改来自另一个应用程序或操作系统的内存被认为是糟糕的编程。

但是,我不懂Objective C,我需要从一个固定的内存地址读取25个字节到一个变量中,然后用不同的集合替换这25个字节

我对指针以及所有 * 和 & 和 @ 符号的含义都很糟糕。

我正在使用 XCode 4.4.1 在 Mac OS X 10.8 (Mountain Lion) 中尝试此操作。

我尝试过类似的方法:

char *myPtr = (char*) 0x7FFA8000 // just an example, not the real memory address
char myString[] = *myPtr

【问题讨论】:

  • 我对 iOS 的细节了解不多,但我怀疑您是否有权访问物理内存来获取固定位置。您将可以访问您的进程内存。
  • 如果您需要访问“主内存”中的某个特定位置,可能有一个 OSx API 用于执行此操作,用于访问系统存储的某些特定区域的特权方法。但这将是一个 OSx API,而不是特定于 Objective-C 的。
  • @PaulR 为您提供了执行此操作的代码。但真正的问题是:您对“固定内存地址”的定义是什么?因为除非您在内核级别执行代码,否则没有这样的事情。您可能得到的最好的结果是映射到固定地址的非固定虚拟地址。而且您需要一些特殊的内核 API 来实现这一点(甚至不确定在 Os X 上是否有任何公共 API 可以做到这一点,因为在这样的事情中没有用户级应用程序的业务)。
  • 是的,我已经确认一旦操作系统加载它就无法工作。但是我可以在将操作系统加载到 EFI Shell 之前写入需要更改的特定内存地址(使用 EFI Shell 的本机 mm 命令)。

标签: objective-c memory pointers osx-mountain-lion xcode4.4


【解决方案1】:

如果是 25 个字符,你可以这样做:

char *myPtr = (char*) 0x7FFA8000; // pointer to arbitrary memory address
char myString[26];                // buffer to copy data to
memcpy(myString, myPtr, 25);      // do the copy
myString[25] = '\0';              // make sure string is terminated

写回任意地址:

char *myPtr = (char*) 0x7FFA8000; // pointer to arbitrary memory address
char myString[26];                // buffer to copy data from
memcpy(myPtr, myString, 25);      // do the copy

请注意,在这两种情况下,您只是在访问您自己进程的虚拟地址空间中的内存 - 您不是在读取/写入操作系统或其他进程的内存。

【讨论】:

  • 是的,我能做到这一点的唯一方法是在操作系统加载之前(在 EFI Shell 中)将新字节写入内存地址。这确实有效,但由于我系统上 EFI Shell 的实现存在错误,我无法编写脚本。我必须在每次启动时(在操作系统加载之前)在 EFI shell 中手动键入 mm 命令和参数。
猜你喜欢
  • 2013-10-10
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多