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

 eXeL@B —› Вопросы новичков —› Найти переменную и место, где она меняется
Посл.ответ Сообщение

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

Создано: 07 февраля 2012 02:28
· Личное сообщение · #1

Пытаюсь использовать OllyDbg
Нужно найти переменну, в которой записывается уникальное значение, id пользователя. Переменная - локальная переменная функции, поэтому поиск в памяти прогами вроде ArtMoney не помогает.
Как это сделать?
Пытался сделать trace и condition EAX=ID_пользователя, да только он походу показывает trace только в режиме выполнения по шагам, а не вобще...



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

Создано: 07 февраля 2012 02:35 · Поправил: F_a_u_s_t
· Личное сообщение · #2

То есть переменная в буфере (указатель), я правильно понял? Мб хардварный бряк поможет. А то что то я 4 раза прочитал и не понял толком.



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

Создано: 07 февраля 2012 03:26
· Личное сообщение · #3

Т.е. переменная находится в стеке по отрицательному смещению, вроде
sub_49D9D5 proc near
...
var_1A98 = dword ptr -1A98h
...
Создается и используется в процедуре, а по выходу из нее уничтожается.

Может быть можно установить брейк на изменение значения регистра, так или иначе она туда попадает, возможно ли такое? Значение переменной уникальное.



Ранг: 85.4 (постоянный), 51thx
Активность: 0.090
Статус: Участник

Создано: 07 февраля 2012 09:16
· Личное сообщение · #4

софт. бряк на начало функции, брякаемся, потом хард. бряк на запись по [esp-01A98]




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 07 февраля 2012 09:34
· Личное сообщение · #5

drone верно, тока хардварный бряк, нужно будет ставить после трейса пролога функции, если он есть, т.к. esp сместиться

-----
[nice coder and reverser]




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

Создано: 07 февраля 2012 10:22
· Личное сообщение · #6

Не известно, в какой именно функции эта переменная




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 07 февраля 2012 12:19
· Личное сообщение · #7

logo2004, ну смотри, нам пофиг в какой функции оно делается, эта переменная высчитывается и инициализируется. Нам главное что она будет по нужному нам адресу.
Кароче заходишь в интересующую функцию тебе. Дальше по f8 проходишь место примерно такое:
Code:
  1. add esp,30

вместо 30 может быть любое число. И ставишь хардварный бряк на нужную переменную. Потом запускаешь и ждёшь.



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

Создано: 07 февраля 2012 12:29
· Личное сообщение · #8

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




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 07 февраля 2012 12:50
· Личное сообщение · #9

нужно найти или пробовать другие варианты.

-----
[nice coder and reverser]





Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 07 февраля 2012 12:58
· Личное сообщение · #10

logo2004 пишет:
смещение относительно esp тоже не известно.

ненадо знать смещение, если не знаешь процедуры. Можно узнать лишь реальный адресс, и его брякнуть. Будет очень много лишних срабатываний, но это лучше чем ничего. И ловить. Можешь прошёлкать конечно часа 2, но в конце концов найти нужник(точнее нужное место)



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

Создано: 07 февраля 2012 22:56
· Личное сообщение · #11

Переменная же в стеке находится, и сушествует лишь в тот момент, пока выполняется функция, у нее нет постоянного адреса. А даже если есть, как его узнать... Если бы был постоянный адрес, проблем бы не было, просканировал ArtMoney и все.



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

Создано: 07 февраля 2012 23:43
· Личное сообщение · #12

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




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 08 февраля 2012 02:03
· Личное сообщение · #13

logo2004, как это нет адреса? Кстати локальные переменные не уничтожаются!!!! Если они делались чем-нить типо add esp,100h
После выполнения функции , данные в стеке сохраняются, но ненадолго, т.к. следующие функции задействует эту память в своих целях.
ваще-то как то идёт рассуждение о вращении сферического коня в вакууме. Пора бы софтину выложить.



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

Создано: 08 февраля 2012 12:04 · Поправил: tundra37
· Личное сообщение · #14

Переведу желание logo2004 нормально: есть известная величина ID пользователя и надо найти куда оно пишется. Видимо потом он желает поисследовать алгоритм сравнения.

logo2004 Типичная новичковская ошибка: вместо того что описать реальную проблему, описывается проблема возникшая при реализации собственных идей. В данном случае можно-таки извратится, если конечно прога не слишком много времени ЦПУ занимает: надо поставить условный бряк по чтению на диапазон памяти(что-то я не нашел как в Олли это сделать, но раньше пользовался) . Но это метод "из пушки по воробьям". Гораздо удобнее брякнутся в процедуре, где этот ID используется и ловить там. Быстрее будет. А еще лучше протрассировать эту процедуру. Но это уже не для новичков. Поэтому желательно про прогу рассказать. А то вдруг окажется, что это онлайн логон, ID сравнивается на сервере и вы его никогда в памяти не найдете.

Dart Sergius пишет:
Кстати локальные переменные не уничтожаются!!!!

Только возможно, в целях безопасности, ID трется сразу после использования.




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 08 февраля 2012 13:22
· Личное сообщение · #15

tundra37 и как вы себе это представляете?
не поверю чтобы програмеры начали писать что-то типо такого
Code:
  1. call <вычисление Id>
  2. дальше поюзали его
  3. xor eax,eax
  4. mov [esp-xxxx],eax

да и оператор delete в с++ не затирает данные, а только ставит у себя флаг что данные больше не используются и их можно отдать под другие цели. А если это выделили в стеке - то эта переменная вскоре просто затрётся последующими функциями.



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

Создано: 08 февраля 2012 18:51
· Личное сообщение · #16

Dart Sergius Что касается ID, то смысла его затирать нет. А вот ключ шифрования трется и это не от кракеров, а чтобы не утек через память. Против новичков и артмани - отличное средство. А вообще товарищ глупости творит: раз ID он знает, значит он его где-то взял - например в реестре или в зареганной проге на одном из окошек. Отсюда и надо плясать. Элементарно Ватсон



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

Создано: 08 февраля 2012 19:48
· Личное сообщение · #17

ID знаю. Взломал игру несколько лет назад, а теперь вышла обновленная версия, старый патч не работает. Скорее всего, ID точно также хранится в локальной переменной функции. Только я вот забыл последовательность действий, которой я тогда нашел место, где используется переменная.

> Гораздо удобнее брякнутся в процедуре, где этот ID используется и ловить там.
А как ее найти-то?

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

>А еще лучше протрассировать эту процедуру
Как?




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 08 февраля 2012 20:54
· Личное сообщение · #18

logo2004 пишет:
>А еще лучше протрассировать эту процедуру
Как?

Trace Into - конопка прямо под менюшкой в olly.
Выложи, скорее всего дадим прямые наводки.
А так - это обсуждение сферического коня в вакууме вращаемого по 4-м плоскостям в 15-и мерном пространстве.



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

Создано: 08 февраля 2012 22:42
· Личное сообщение · #19

А, это пробовал уже, пишут что очень медленно, и это правда, намертво зависает. Пробовал поставив условие EAX==ID.
Позже попробую от IDA что нибудь добится, он хоть пошустрее работает.



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

Создано: 08 февраля 2012 23:07
· Личное сообщение · #20

Как как, ставь бряк на то что выводит этот текст. А вот чем выводится это вопрос, игра может быть на дирексе, на опен гл, гди. Тебе уже сказали что бы ты сказал что за игра, а неипал мозг не себе не людям.




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 08 февраля 2012 23:16
· Личное сообщение · #21

logo2004, а ты ставь запись в лог при срабатывании и иди поспи.
Зависать приложение как раз и должно, потому что вместо 1-й команды выполняется добрая сотня(как раз трассировка).
IDA пошустрее - не не слышал.
IDA поможет тебе разобраться в коде функции, которую ты найдёшь.



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

Создано: 09 февраля 2012 01:46
· Личное сообщение · #22

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

>Как как, ставь бряк на то что выводит этот текст. А вот чем выводится это вопрос, игра может быть на дирексе, на опен гл, гди.
Без разницы, id не отображается, а отправляется в TCP пакете на сервер, текстом. А это идея, спасибо. Можно поставить break на send и условие поиска строки этого id в буфере.
Теперь вопрос, как составить условие на поиск подстроки в IDA?




Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 09 февраля 2012 02:20
· Личное сообщение · #23

logo2004
Значит делаешь так
ищешь какую api функцию юзает та=воя прога чтобы отправлять данные.
ставишь условный бряк на неё с записью в лог о параметрах.
запускаешь
радуешься что у тебя ничего не виснет
выходишь и смотришь лог.
В одном из пакетов будет твой id.
Смотришь откуда была вызвана функция(это тоже в логах пишется)
Идёшь туда и ревёрсишь это место с помощью IDA.
И у ты считай нашёл место генерации idю(подсказка : обычно отправление данных заносится в отдельую функцию, так что придётся ещё побрякатся на этой функции(тоже с записью в лог), и отыскать искомую процедуру, которая генерит твой id. Нерадивые(или просто ленивые и не особо заботившиеся о безопасности) разрабы генерят и сразу же отправляют, так что процедура генерации и отправки будет буквально в паре байт друг от друга.
Успеха.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 09 февраля 2012 09:31
· Личное сообщение · #24

2 ольку возьми, там трассировка быстрее в разы, если не на порядок, за счёт эмуляции.


 eXeL@B —› Вопросы новичков —› Найти переменную и место, где она меняется
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати