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

1 macos xcode gdb

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

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

我假设这可以使用GDB或Xcode完成.如果没有,我该怎么做?

seh*_*ehe 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
Run Code Online (Sandbox Code Playgroud)

此示例扫描第一个匹配区域0x1234 ... 0x4321并打印/检查输出地址.

strncpy如果您有权访问它,可以使用类似的技巧(...?)来覆盖内存.当然,如果您执行更改子字符串长度等操作,程序可能会失败.YMMV).

考虑将您编写的命令保存为脚本(打开日志记录,使用.gdbinit甚至创建gdb函数;遗憾的是我对后者知之甚少)

原始答案:

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


回答直接问题:

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

  1. 存在于数据段中
  2. 从资源中读取(内存映射页面)

两者通常(至少这些日子)​​在只读内存段中(考虑共享内存映射页面;这使内核有机会在进程之间共享共享二进制对象的映射区域 - 这也是出于明显的安全目的) .

在好的方面,

strings myprogram | grep 'Hello"
Run Code Online (Sandbox Code Playgroud)

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

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