Поиск строки в адресном пространстве запущенного процесса
От: stbzh  
Дата: 30.07.14 14:45
Оценка:
Привет всем!
Неоднократно сталкивался с необходимостью исследования больших программ доставшихся в наследство. В этот раз решил поднять этот вопрос и узнать кто как выходит из положения, может использует что то готовое...
Описание проблемы: Есть приложение, состоящее из экзешника и нескольких ДЛЛ (QtCore, QtGui, и еще парочка своих собираемых из довольно таки большого легаси кода). Разбираться в дебрях этого легаси кода слишком-слишком долго и неприятно (там и куча сторонних библиотек, причем патченых, и конвертируемый в С++ джава код на этапе сборки СМаке, вобщем ад). Документации как водится нет. Работаю под Win 7. Разработка в MS VS 2013 Express. Код — С++ 2003.
В процессе работы приложения загружается название улицы для отображения на карте. Нужно проникнуть внурть кода, отрисовывающего эту часть. Код находится внутрях большой и очень запутанной легаси-длл, которую я использую как пользователь, но имею возможность менять код.
Идея: создать алгоритм, который при старте проги получал бы диапазон адресов процесса и сканировал бы эту память на поиск заданного имени, чтобы потом поставить бряк на доступ к этой памяти и по срабатыванию курить стек.
Чстно говоря выглядит это для меня утопично, ибо искомое имя загружается этой легаси-длл и я не представляю в какой части адресного пространства оно может оказаться и как определить из екзешника сканировать ли хип, стек, или вообще статическую область памяти (есть там и такие трюки типа своих аллокаторов и пр.)
К тому же поставить бряк на изменение области памяти я знаю что можно, а вот на доступ к этой памяти?
Я уже подзабыл как загрузчик работает в винде, забыл PE формат, RVA и пр. Помню что адресс загрузки ДЛЛ является скорее рекомендацией и может отличаться. Помню о том что верхние адреса — системные, что хип и стек растут в разные стороны. И все это незнание как бы намекает, что эта задача может быть для меня еще более сложной, чем просто шаг за шагом погружаться в хитросплетения исследуемой легаси-длл.
Кто как поступает в таких случаях? Есть ли инструменты для поиска в процессе с учетом длл (причем это не ресурс-хакеры)?

31.07.14 12:56: Перенесено модератором из 'C/C++' — Кодт
debug dll memory allocation
Re: Поиск строки в адресном пространстве запущенного процесса
От: pva  
Дата: 31.07.14 10:02
Оценка:
Здравствуйте, stbzh, Вы писали:

S>В процессе работы приложения загружается название улицы для отображения на карте. Нужно проникнуть внурть кода, отрисовывающего эту часть. Код находится внутрях большой и очень запутанной легаси-длл, которую я использую как пользователь, но имею возможность менять код.

Так исходный код этой длл есть или нет?
В общем случае берешь иду, грузишь в нее эту длл и ставишь условный бряк в самых подозрительных местах.
newbie
Re[2]: Поиск строки в адресном пространстве запущенного процесса
От: stbzh  
Дата: 31.07.14 11:24
Оценка:
Здравствуйте, pva, Вы писали:

pva>Так исходный код этой длл есть или нет?

исходный код есть, ну если не учитывать тот факт, что частично это Qt код, который вырождается во что то свое moc-генератором, а частично на лету генерится с помощью JavaJ2Cpp. по крайней мере покопавшись в настройках CMake или в уже готовых nmake, я могу сгенерировать препроцесснутый плюсовый код для любого обектного модуля из которых состоит эта мега-длл

pva>В общем случае берешь иду, грузишь в нее эту длл и ставишь условный бряк в самых подозрительных местах.

немного не то. проблема именно в том, что я не знаю подозрительные места и не очень хочу нырять в глубины этой библиотеки — ну представьте себе что даже при передачи параметров в функцию там полностью прридется пройти все пороги эмулированной Java — тут и безумные иерархии наследования с конструкторами бесконечных баз, везде подсчет ссылок, своя попытка эмулировать RTTI, и прочие прелести погружения фактически в саму джава-машину.

Постановка задача то достаточно простая — локализовать код, который запрашивает нужную мне строку и выходя наверх по стеку вызовов, понять на каком этапе можно отключить прорисовку текста этой строки на канвасе. Для этого нужно в загруженном процессе найти участок памяти в котором находится искомая строка и поставить бряк на доступ по этому адресу.
Ну или подсказать мне альтернативное решение, которое возможно лежит перед глазами а я не вижу...
Re[3]: Поиск строки в адресном пространстве запущенного процесса
От: pva  
Дата: 31.07.14 12:18
Оценка:
Здравствуйте, stbzh, Вы писали:

Ну можно поставить БП на АПИ отрисовки текста с условием проверки на нужный тебе текст. А дальше по плану — по стеку вверх.
Ничего страшного в КуТэ нет. Тебе как раз желательно собрать это все в дебаге и найти функцию, которая отвечает за отрисовку.

S>Постановка задача то достаточно простая — локализовать код, который запрашивает нужную мне строку и выходя наверх по стеку вызовов, понять на каком этапе можно отключить прорисовку текста этой строки на канвасе. Для этого нужно в загруженном процессе найти участок памяти в котором находится искомая строка и поставить бряк на доступ по этому адресу.

S>Ну или подсказать мне альтернативное решение, которое возможно лежит перед глазами а я не вижу...
newbie
Re[4]: Поиск строки в адресном пространстве запущенного процесса
От: stbzh  
Дата: 31.07.14 13:37
Оценка:
Здравствуйте, pva, Вы писали:
pva>Ну можно поставить БП на АПИ отрисовки текста с условием проверки на нужный тебе текст. А дальше по плану — по стеку вверх.
pva>Ничего страшного в КуТэ нет. Тебе как раз желательно собрать это все в дебаге и найти функцию, которая отвечает за отрисовку.

АПИ отрисовки текста на винде в конечном итоге сводится к обработке в основной оконной процедуре сообщения вида WM_SETTEXT, конечно я могу поставить бряк на это, правда не уверен что знаю как символы UTF16 правильно расположить в условии бряка, впрочем, поэкспериментировать то можно. Проблема в том, что указанное выше сообщение может быть послано с помощью PostMessage, то есть асинхронно. Можно конечно поставить бряки на вызовы и PostMessage и SendMessage и проверять их аргументы...
Но вот не настолько я хорошо знаю Qt и оконную систему винды, чтоб гарантировать, что это единственный способ отрисовать нужный мне текст. Вот первое что приходит в голову — может быть реализовано через генерирование картинки из текста на фоне карты и отрисовки этой картинки.

Собираю то я все длл и ексзешник с дебаг символами, тут все в порядке. Правда почему то 13 студия не хочет у меня искать память командами .S в Intermediate window. Никто не знает с чем может быть связано? Перелопатил инет, вроде должно работать. А у меня пишет "expected an expression". Может из-за того что Express edition?
Re[5]: Поиск строки в адресном пространстве запущенного процесса
От: pva  
Дата: 31.07.14 14:41
Оценка:
Здравствуйте, stbzh, Вы писали:

S>АПИ отрисовки текста на винде в конечном итоге сводится к обработке в основной оконной процедуре сообщения вида WM_SETTEXT

Я бы так глубоко не заморачивался. Если кутэ подлинкована не статикой, то вызов упрется в какой-нибудь QCanvas::drawText, QWindow::setText или аналогичное. Если статикой, то можно накатить сигнатуры и поискать.
newbie
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.