我必须在Mac OSX的正在运行的进程内存中找到一个按钮的名称并进行更改。
假设有一个“测试”应用程序,它有一个“Hello”按钮,有没有办法附加到“测试”应用程序并更改“你好!”按钮到“再见!”?
我认为这可以使用GDB或Xcode完成。如果没有,我该怎么做?
答案 0 :(得分:6)
修改强>
假设您真的在寻找动态数据(与您的示例似乎建议的相反:),您可以随时使用调试器命令。这个将要求您了解可能的内存扫描范围(或者您只是无用的内存违规):
# 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能力(想想:root)才能解决这个问题。
回答直接问题:
通常,这样的消息是常量(静态数据),因此是
两者通常(至少这些日子)在只读内存段中(想想共享内存映射页面;这使内核有机会在进程之间共享共享二进制对象的映射区域 - 同时它也能提供明显的服务安全目的)。
在好的方面,
strings myprogram | grep 'Hello"
会告诉您是否可以使用sed
,hex editor或任何其他合适的编辑器来操作二进制文件,甚至在它开始之前。我可以在这里想到两个缺点: