Сейчас на форуме: tyns777, cppasm, dutyfree (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Как найти функцию выделившую память ?
Посл.ответ Сообщение

Ранг: 1.4 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 августа 2017 13:51
· Личное сообщение · #1

Всем привет!
Есть функция-метод класса, читает значения по определенному адресу в памяти и рисует картинку.
Адрес каждый раз меняется.
Значения по тому адресу записываются только один раз, во время инициализации приложения.
Мне нужно найти функцию, которая записала туда значения.
Есть ли специальные инструменты или плагины для OllyDbg, x64dbg
позволяющие посмотреть какая функция память выделяет и по какому адресу ?

Сама прога это демка: http://www.nvidia.ru/coolstuff/demos#!/geforce-2/lightning
0x0041524b адрес функции-метода

Code:
  1. mov     ecx, [esi+8]
  2. mov     edx, [ecx+18h]
  3. mov     ecx, [esp+1Ch+z]
  4. push    ecx             ; z
  5. mov     eax, [edx] <-------EDX указывает на значения.
  6. mov     edx, [eax+edi*8+4]
  7. push    edx             ; y
  8. lea     eax, [eax+edi*8]
  9. mov     eax, [eax]
  10. push    eax             ; x
  11. call    ebp ; glVertex3f




Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 29 августа 2017 13:55
· Личное сообщение · #2

Любой отладчик, поддерживающий hardware breakpoint.

-----
старый пень




Ранг: 1.4 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 августа 2017 15:55
· Личное сообщение · #3

Я не могу поставить брейкпоинт не зная адреса. Память выделяется динамически.
Этот адрес я могу найти только по этой функции



Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 29 августа 2017 17:17
· Личное сообщение · #4

trololp пишет:
Я не могу поставить брейкпоинт не зная адреса

А кто мешает узнать?

Код не смотрел, но тут либо можно восстановить по RVA при обращении, или если такой подход не применим, просто логируете один раз все выделения памяти до обращения (далеко не оптимальный, слегка колхозный вариант, но за незнанием сабжа единственное что в лоб можно предложить) и по адресу вызова смотрите из какого участка кода была создана память и бэктрейсите (или наоборот) до искомой функции. В общем-то делов минут на 5 даже при таком подходе.

| Сообщение посчитали полезным: trololp

Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 29 августа 2017 17:38
· Личное сообщение · #5

Code:
  1. mov     eax, [edx] <-------EDX указывает на значения.

а не проще посмотреть под кем регион ходит?!?
если я правильно понял, нужно вот ето:
Code:
  1. 0044B766  |.  6A 04         PUSH 4                                                       ; /Protect = PAGE_READWRITE
  2. 0044B768  |.  68 00200000   PUSH 2000                                                    ; |AllocType = MEM_RESERVE
  3. 0044B76D  |.  68 00001000   PUSH 100000                                                  ; |Size = 1048576.
  4. 0044B772  |.  57            PUSH EDI                                                     ; |Address
  5. 0044B773  |.  FF15 18814500 CALL DWORD PTR DS:[<&KERNEL32.VirtualAlloc>]                 ; \KERNEL32.VirtualAlloc
  6. 0044B779  |.  3BC7          CMP EAX,EDI
  7. 0044B77B  |.  8946 0C       MOV DWORD PTR DS:[ESI+0C],EAX




Ранг: 1.4 (гость)
Активность: 0.010
Статус: Участник

Создано: 29 августа 2017 20:07 · Поправил: trololp
· Личное сообщение · #6

Я нашел что искал !
VOLKOFF сделал по вашему колхозному методу. поставил condition break на функцию new(int size)
и ограничил вывод 1000 срабатываниями(после того как x64dbg упал ).
sub_414B40 функция которая выделяет память . По всей видимости координаты
полигонов генерируются в этой функции. приложение не хранит их в какой-то структуре а генерирует один раз при каждом запуске.



Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 29 августа 2017 22:23
· Личное сообщение · #7

trololp пишет:
после того как x64dbg упа


черканите мистеру (автору), он вроде ушивается здесь также..




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 30 августа 2017 01:35
· Личное сообщение · #8

trololp

Что бы не колхозить, нужно немного матчасть знать. Устанвливаем конфиг для процесса(globalflags) маркер USER_STACK_TRACE и получаем полный бэктрейс аллокаций в виде базы данных. Для анализа лога есть даже спец тулз --> Link <--

Но мисье не исчет простых путей и в данном случае заколхозить удалось, хоть при этом и пал отладчик

-----
vx




Ранг: 1.4 (гость)
Активность: 0.010
Статус: Участник

Создано: 30 августа 2017 18:02
· Личное сообщение · #9

Заколхозить здесь было самым просты путем.
umdh принимает на вход только уже запущенный процесс и с отладчиком работать отказывается.


 eXeL@B —› Вопросы новичков —› Как найти функцию выделившую память ?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати