我必须在Mac OSX的运行进程内存中找到一个按钮的名称并对其进行更改。在OSX中使用GDB在进程内存中搜索特定的字符串
假设有一个“测试”应用程序,它有一个“你好”按钮,有什么办法可以附加到“测试”应用程序并更改“你好!”按钮“再见!”?
我认为这可以使用GDB或Xcode来完成。如果没有,我该怎么做?
我必须在Mac OSX的运行进程内存中找到一个按钮的名称并对其进行更改。在OSX中使用GDB在进程内存中搜索特定的字符串
假设有一个“测试”应用程序,它有一个“你好”按钮,有什么办法可以附加到“测试”应用程序并更改“你好!”按钮“再见!”?
我认为这可以使用GDB或Xcode来完成。如果没有,我该怎么做?
编辑
假设你真正需要的动态数据(而不是你的样品似乎什么建议:)),你总是可以只使用调试命令的工作。这将需要你有可能的内存范围的感觉扫描(或者你只是得到无用内存违规):
# 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权力(想想:根)来解决这个问题。
为了回答直接的问题:
通常,这样的消息是常数(静态数据),因此存在于数据段
这两者通常是(现在在至少)在只读内存段中(考虑共享内存映射页面;这为内核提供了共享进程间共享二进制对象的映射区域的机会 - 同时它也具有明显的安全性)。
上档,
strings myprogram | grep 'Hello"
会告诉你是否可以使用sed
,一个hex editor或任何其他合适的编辑器来操纵它甚至开始前的二进制文件。有两个缺点,我能想到的在这里:
显示在按钮中的文本很可能不在用户空间进程中 - 更改内存不会影响显示器,一旦它已被显示并且重绘通常被缓冲。如果这是一种事后/演示的事情,请使用Photoshop! – sehe