使用OSX中的GDB在进程内存中搜索特定字符串

时间:2011-07-05 07:23:24

标签: xcode macos gdb

我必须在Mac OSX的正在运行的进程内存中找到一个按钮的名称并进行更改。

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

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

1 个答案:

答案 0 :(得分: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能力(想想:root)才能解决这个问题。


回答直接问题:

通常,这样的消息是常量(静态数据),因此是

  1. 出现在数据段
  2. 从资源中读取(内存映射页面)
  3. 两者通常(至少这些日子)​​在只读内存段中(想想共享内存映射页面;这使内核有机会在进程之间共享共享二进制对象的映射区域 - 同时它也能提供明显的服务安全目的)。

    在好的方面,

    strings myprogram | grep 'Hello"
    

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

    1. 它不是动态的(你不能动态改变文字)
    2. 它可能会破坏代码签名(意味着可执行文件可能会被操作系统拒绝,因为它已被修改)。