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

 eXeL@B —› Вопросы новичков —› Функция вызывается несмотря на отсутствие в Xrefs
Посл.ответ Сообщение

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 30 июня 2019 22:33
· Личное сообщение · #1

Есть такая функция. Код:
Code:
  1. .text:0000000000621E10            someFunction    proc near
  2. .text:0000000000621E10                            mov     edx, [rdi]
  3. ...
  4. .text:0000000000621F91                            mov     rbp, rdx
  5. .text:0000000000621F94                            call    someFunction
  6. .text:0000000000621F99                            mov     rsi, rbp


Xrefs ссылается только на 621F94.
Если занопить "call someFunction", то она из Xrefs пропадает, но все-равно как-то вызывается при исполнении кода.
Как определить что вызывает эту функцию?




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

Создано: 30 июня 2019 22:41 · Поправил: difexacaw
· Личное сообщение · #2

useretail

Это значит что функция вызывается из разных мест, не важно нашла ида ваши xref" или нет.

> Как определить что вызывает эту функцию?

Очевидно ведь - поставить останов на начало функции и на стеке будет caller-ip.

ps: ida не отладчик, это дизассемблер.

-----
vx





Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 30 июня 2019 23:09
· Личное сообщение · #3

То, что ида не нашла референс, не значит, что его нет.

-----
2 оттенка серого





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

Создано: 30 июня 2019 23:15
· Личное сообщение · #4

f13nd

Из за этой парадигмы, ида инструмент.. вот такие вопросы и появляются. Не верное восприятие предмета, точнее его полное не понимание, обьект рассматривается как некий в инструменте(ида).

С таким подходом ничего тс решить не сможет. Оно уже и видно - референсов нет и что делать дальше тс не знает, поэтому и задал вопрос.

Не верный, ошибочный подход.

-----
vx




Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 30 июня 2019 23:33
· Личное сообщение · #5

Нормальный инструмент. И вопрос именно об иде.
Играться с дебаггером можно (и нужно) если вариант с идой не проходит (как в моем случае).
Я вот одного не могу понять. Как еще можно вызвать если не через call (E8 <адрес>)?
Выходит что алгоритм в иде не идеален или как это понимать?




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

Создано: 30 июня 2019 23:41 · Поправил: Модератор
· Личное сообщение · #6

useretail

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

> Как еще можно вызвать если не через call (E8 <адрес>)?

Через RET например. Или есчо как то. Твой код выполняется в ОС, а там свои механизмы. Есть ядерные сервисы для загрузки контекста в процессор, ну что бы ты понимал что ида это фигня.

От модератора: Нарушение п.5 Правил форума

-----
vx




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 30 июня 2019 23:46
· Личное сообщение · #7

А как Ида должна определить вызов через вычисляемый адрес например?
Ида это статический анализ, есть вещи которые без отладки (динамического анализа) не решаются.

Code:
  1. mov rax,base
  2. add rax,func_offset
  3. call rax

или
Code:
  1. push func_addr
  2. ret

Да куча вариантов.
И всё, XREFов не будет.
Бери отладчик и не занимайся ерундой.
Если приспичила именно Ида, в ней тоже отладка есть.

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

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 июля 2019 00:16 · Поправил: useretail
· Личное сообщение · #8

Спасибо за ответы.

difexacaw
Почему вы меня оскорбляете? Вопрос задан в разделе для новичков.
Вы походу нарушаете пункт 5 правил этого форума + пункт 4 правил подфорума "Вопросы новичков"




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 01 июля 2019 04:25
· Личное сообщение · #9

cppasm пишет:
А как Ида должна определить вызов через вычисляемый адрес например?

С солвером у гидры например несколько получше. В ситуациях, где ида не разглядит динамически рассчитываемый референс, есть ненулевая вероятность, что гидра разглядит.
useretail пишет:
Как еще можно вызвать если не через call (E8 <адрес>)?

У самых примитивных архитектур так и есть. Но вызов метода объекта в интеле например выглядит так:
Code:
  1. MOV EAX,DWORD PTR DS:[EAX]
  2. CALL DWORD PTR DS:[EAX+90]

А каждая копия объекта конструируется в памяти отдельно, отследить какой метод в +90 был помещен в статике бывает тяжело. И это только частный случай динамики, есть и другие.

-----
2 оттенка серого





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 01 июля 2019 08:25
· Личное сообщение · #10

в х64 всё еще веселее
не только call (0xE8) кодируется с относительным смещением, но даже и mov, из-за чего поиск статических байтов адреса не особо помогает даже в незащищенных модулях.

адрес функции может быть также частью таблицы методов класса или еще какого-то интерфейса:
Code:
  1. vftable:
  2.   dq func1
  3.   ...
  4.   dq funcN
  5. ;============
  6. mov rax, N
  7. mov rax, [vftable+rax*8]
  8. call rax


И кстати, если уж искомый эффект - это "невызываемость" целевой функции, то я бы рекомендовал патчить саму функцию, а не все референсы к ней. Просто вставить ret с учётом стэковых аргументов, и посмотреть что будет.

Если нежелательный эффект останется - вероятно, есть еще какая-то функция, с похожим назначением. Такое нередко встречается.



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

Создано: 01 июля 2019 14:11
· Личное сообщение · #11

useretail пишет:
но все-равно как-то вызывается при исполнении кода

БП на начало (возврат\тело по ситуации) функции и смотрим (логируем без остановки по ситуации) откуда вызов. Profit.

В зависимости от инструмента (в иде тоже можно, но не всегда нативно), можно получить на выходе аккуратный лог с каждым вызовом, аргументами (если есть) и участком откуда данный вызов сделан.

Вы же идете от обратного напрасно усложняя себе задачу.


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