Поиск определенной строки в памяти процесса с использованием GDB в OSX - PullRequest
1 голос
/ 05 июля 2011

Мне нужно найти имя кнопки в оперативной памяти процесса в Mac OSX и изменить его.

Предположим, что есть приложение «Тест», в котором есть кнопка «Привет», есть ли способ присоединиться к приложению «Тест» и изменить «Привет!»кнопку "Пока!"?

Я предполагаю, что это можно сделать с помощью GDB или Xcode.Если нет, как я могу это сделать?

1 Ответ

6 голосов
/ 05 июля 2011

Редактировать

Предполагая, что вы действительно ищете динамические данные (в отличие от того, что казалось в вашем примере :)), вы всегда можете просто работать с командами отладчика.Это потребует того, чтобы вы имели представление о возможном диапазоне памяти для сканирования (или вы просто получите бесполезные нарушения памяти):

Используйте команды 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; к сожалению, я мало что знаю о последнем)

Оригинальный ответ:

Вам "нужно"?Я сомневаюсь.Лучше всего работать с API окон / UI вашей операционной системы, чтобы получить фактическое окно, в котором отображается текст, и заставить его отображать другой текст (обычно отправляя ему соответствующие управляющие сообщения).Вам понадобится много возможностей COW (думаю: root), чтобы осуществить это.


Чтобы ответить на прямой вопрос:

Обычно такие сообщения являются константами (статическими данными).и как таковые либо

  1. присутствуют в сегменте данных
  2. считываются (страницы с отображением в памяти) из ресурсов

Оба из которых обычно (в наши дни)по крайней мере) в сегментах памяти только для чтения (подумайте о совместном использовании страниц, отображаемых в памяти; это дает ядру возможность обмениваться отображенными областями совместно используемых двоичных объектов между процессами - это также служит очевидным целям безопасности).

Вклверхняя сторона,

strings myprogram | grep 'Hello"

скажет вам, можете ли вы использовать sed, hex hex или любой другой подходящий редактор для манипулирования двоичным файлом даже до его запуска.Здесь есть два недостатка:

  1. он не динамический (вы не можете изменить текст на лету)
  2. это может нарушить подпись кода (что означаетисполняемый файл может быть отклонен ОС, поскольку он был изменен).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...