2011-07-05 87 views
1

我必须在Mac OSX的运行进程内存中找到一个按钮的名称并对其进行更改。在OSX中使用GDB在进程内存中搜索特定的字符串

假设有一个“测试”应用程序,它有一个“你好”按钮,有什么办法可以附加到“测试”应用程序并更改“你好!”按钮“再见!”?

我认为这可以使用GDB或Xcode来完成。如果没有,我该怎么做?

+0

显示在按钮中的文本很可能不在用户空间进程中 - 更改内存不会影响显示器,一旦它已被显示并且重绘通常被缓冲。如果这是一种事后/演示的事情,请使用Photoshop! – sehe

回答

6

编辑

假设你真正需要的动态数据(而不是你的样品似乎什么建议:)),你总是可以只使用调试命令的工作。这需要你有可能的内存范围的感觉扫描(或者你只是得到无用内存违规):

使用gdb命令,循环结构和libc函数

# assume 0x1234 is a likely base address, say for the heap 
(gdb) set $x=0x1234 
(gdb) set $y = strdup("lookforthistext") 
(gdb) while(0!=memcmp($x++, $y, 15) && $x<0x4321) 
    >end 
(gdb) p $x 
(gdb) x $x 

这示例扫描区域0x1234 ... 0x4321进行第一次匹配并打印/检查输出地址。

如果您有权访问它,您可以使用类似的技巧(strncpy ...?)覆盖内存。 当然,如果你改变一个子串的长度等等,程序可能会失败。YMMV)。

考虑保存炮制命令,脚本(启用日志记录,使用.gdbinit甚至创造GDB的功能,可惜我不太了解后者)

原来的答复:

你“需要”?我对此表示怀疑。最好的办法是使用操作系统的窗口/ UI API来检索显示文本的实际窗口,并使其显示另一个文本(通常通过发送适当的控制消息)。你将需要大量的COW权力(想想:根)来解决这个问题。


为了回答直接的问题:

通常,这样的消息是常数(静态数据),因此存在于数据段

  • 读取任一

    1. (存储器来自资源

    这两者通常是(现在在至少)在只读内存段中(考虑共享内存映射页面;这为内核提供了共享进程间共享二进制对象的映射区域的机会 - 同时它也具有明显的安全性)。

    上档,

    strings myprogram | grep 'Hello" 
    

    会告诉你是否可以使用sed,一个hex editor或任何其他合适的编辑器来操纵它甚至开始前的二进制文件。有两个缺点,我能想到的在这里:

    1. 它不是动态的(你不能有上飞文本变化)
    2. 它可能会破坏代码签名(意味着可执行文件可能会被遭到拒绝OS,因为它已被修改)。
  • +0

    感谢您的及时答复! – Matthew

    +0

    但我对是否有可能更改MacOSX中正在运行的应用程序的数据更感兴趣。它不一定是固定数据,它也可以是由“测试”应用程序动态生成或由用户输入的数据。 – Matthew

    +0

    感谢您的帮助。 – Matthew