| Сейчас на форуме: asfa, bartolomeo (+7 невидимых) | 
| eXeL@B —› Вопросы новичков —› Найти переменную и место, где она меняется | 
| Посл.ответ | Сообщение | 
| 
 | 
Создано: 07 февраля 2012 02:28  · Личное сообщение · #1 Пытаюсь использовать OllyDbg Нужно найти переменну, в которой записывается уникальное значение, id пользователя. Переменная - локальная переменная функции, поэтому поиск в памяти прогами вроде ArtMoney не помогает. Как это сделать? Пытался сделать trace и condition EAX=ID_пользователя, да только он походу показывает trace только в режиме выполнения по шагам, а не вобще... ![]()  | 
| 
 | 
Создано: 07 февраля 2012 02:35 · Поправил: F_a_u_s_t  · Личное сообщение · #2  | 
| 
 | 
Создано: 07 февраля 2012 03:26  · Личное сообщение · #3 Т.е. переменная находится в стеке по отрицательному смещению, вроде sub_49D9D5 proc near ... var_1A98 = dword ptr -1A98h ... Создается и используется в процедуре, а по выходу из нее уничтожается. Может быть можно установить брейк на изменение значения регистра, так или иначе она туда попадает, возможно ли такое? Значение переменной уникальное. ![]()  | 
| 
 | 
Создано: 07 февраля 2012 09:16  · Личное сообщение · #4  | 
| 
 | 
Создано: 07 февраля 2012 09:34  · Личное сообщение · #5  | 
| 
 | 
Создано: 07 февраля 2012 10:22  · Личное сообщение · #6  | 
| 
 | 
Создано: 07 февраля 2012 12:19  · Личное сообщение · #7 logo2004, ну смотри, нам пофиг в какой функции оно делается, эта переменная высчитывается и инициализируется. Нам главное что она будет по нужному нам адресу. Кароче заходишь в интересующую функцию тебе. Дальше по f8 проходишь место примерно такое: Code: 
 вместо 30 может быть любое число. И ставишь хардварный бряк на нужную переменную. Потом запускаешь и ждёшь. ![]()  | 
| 
 | 
Создано: 07 февраля 2012 12:29  · Личное сообщение · #8  | 
| 
 | 
Создано: 07 февраля 2012 12:50  · Личное сообщение · #9  | 
| 
 | 
Создано: 07 февраля 2012 12:58  · Личное сообщение · #10 logo2004 пишет: смещение относительно esp тоже не известно. ненадо знать смещение, если не знаешь процедуры. Можно узнать лишь реальный адресс, и его брякнуть. Будет очень много лишних срабатываний, но это лучше чем ничего. И ловить. Можешь прошёлкать конечно часа 2, но в конце концов найти нужник(точнее нужное место) ![]()  | 
| 
 | 
Создано: 07 февраля 2012 22:56  · Личное сообщение · #11  | 
| 
 | 
Создано: 07 февраля 2012 23:43  · Личное сообщение · #12  | 
| 
 | 
Создано: 08 февраля 2012 02:03  · Личное сообщение · #13 logo2004, как это нет адреса? Кстати локальные переменные не уничтожаются!!!! Если они делались чем-нить типо add esp,100h После выполнения функции , данные в стеке сохраняются, но ненадолго, т.к. следующие функции задействует эту память в своих целях. ваще-то как то идёт рассуждение о вращении сферического коня в вакууме. Пора бы софтину выложить. ![]()  | 
| 
 | 
Создано: 08 февраля 2012 12:04 · Поправил: tundra37  · Личное сообщение · #14 Переведу желание logo2004 нормально: есть известная величина ID пользователя и надо найти куда оно пишется. Видимо потом он желает поисследовать алгоритм сравнения. logo2004 Типичная новичковская ошибка: вместо того что описать реальную проблему, описывается проблема возникшая при реализации собственных идей. В данном случае можно-таки извратится, если конечно прога не слишком много времени ЦПУ занимает: надо поставить условный бряк по чтению на диапазон памяти(что-то я не нашел как в Олли это сделать, но раньше пользовался) . Но это метод "из пушки по воробьям". Гораздо удобнее брякнутся в процедуре, где этот ID используется и ловить там. Быстрее будет. А еще лучше протрассировать эту процедуру. Но это уже не для новичков. Поэтому желательно про прогу рассказать. А то вдруг окажется, что это онлайн логон, ID сравнивается на сервере и вы его никогда в памяти не найдете. Dart Sergius пишет: Кстати локальные переменные не уничтожаются!!!! Только возможно, в целях безопасности, ID трется сразу после использования. ![]()  | 
| 
 | 
Создано: 08 февраля 2012 13:22  · Личное сообщение · #15 tundra37 и как вы себе это представляете? не поверю чтобы програмеры начали писать что-то типо такого Code: 
 да и оператор delete в с++ не затирает данные, а только ставит у себя флаг что данные больше не используются и их можно отдать под другие цели. А если это выделили в стеке - то эта переменная вскоре просто затрётся последующими функциями. ![]()  | 
| 
 | 
Создано: 08 февраля 2012 18:51  · Личное сообщение · #16 Dart Sergius Что касается ID, то смысла его затирать нет. А вот ключ шифрования трется и это не от кракеров, а чтобы не утек через память. Против новичков и артмани - отличное средство. А вообще товарищ глупости творит: раз ID он знает, значит он его где-то взял - например в реестре или в зареганной проге на одном из окошек. Отсюда и надо плясать. Элементарно Ватсон  
![]()  | 
| 
 | 
Создано: 08 февраля 2012 19:48  · Личное сообщение · #17 ID знаю. Взломал игру несколько лет назад, а теперь вышла обновленная версия, старый патч не работает. Скорее всего, ID точно также хранится в локальной переменной функции. Только я вот забыл последовательность действий, которой я тогда нашел место, где используется переменная. > Гораздо удобнее брякнутся в процедуре, где этот ID используется и ловить там. А как ее найти-то? > После выполнения функции , данные в стеке сохраняются, но ненадолго, т.к. следующие функции задействует эту память в своих целях. А это идея, если она все таки не затирается другими функциями, и нужная функция все время вызывается при одном и том же значении esp, можно попробовать >А еще лучше протрассировать эту процедуру Как? ![]()  | 
| 
 | 
Создано: 08 февраля 2012 20:54  · Личное сообщение · #18  | 
| 
 | 
Создано: 08 февраля 2012 22:42  · Личное сообщение · #19  | 
| 
 | 
Создано: 08 февраля 2012 23:07  · Личное сообщение · #20  | 
| 
 | 
Создано: 08 февраля 2012 23:16  · Личное сообщение · #21  | 
| 
 | 
Создано: 09 февраля 2012 01:46  · Личное сообщение · #22 > а ты ставь запись в лог при срабатывании и иди поспи. перед этим пришлось бы кликнуть на юзера, а как сделать это, если прога зависла > IDA пошустрее - не не слышал. Ну, я этот вывод сделал на основании того, что в OllyDbg в режиме трассироваки программа вобще намертво зависает, а в IDA, хоть и в режиме заедающей пластинки, музыка играет, и развернуть приложение можно, хотя видно там было только черный экран и курсор, с Olly вобще не разворачивалось. >Как как, ставь бряк на то что выводит этот текст. А вот чем выводится это вопрос, игра может быть на дирексе, на опен гл, гди. Без разницы, id не отображается, а отправляется в TCP пакете на сервер, текстом. А это идея, спасибо. Можно поставить break на send и условие поиска строки этого id в буфере. Теперь вопрос, как составить условие на поиск подстроки в IDA? ![]()  | 
| 
 | 
Создано: 09 февраля 2012 02:20  · Личное сообщение · #23 logo2004 Значит делаешь так ищешь какую api функцию юзает та=воя прога чтобы отправлять данные. ставишь условный бряк на неё с записью в лог о параметрах. запускаешь радуешься что у тебя ничего не виснет выходишь и смотришь лог. В одном из пакетов будет твой id. Смотришь откуда была вызвана функция(это тоже в логах пишется) Идёшь туда и ревёрсишь это место с помощью IDA. И у ты считай нашёл место генерации idю(подсказка : обычно отправление данных заносится в отдельую функцию, так что придётся ещё побрякатся на этой функции(тоже с записью в лог), и отыскать искомую процедуру, которая генерит твой id. Нерадивые(или просто ленивые и не особо заботившиеся о безопасности) разрабы генерят и сразу же отправляют, так что процедура генерации и отправки будет буквально в паре байт друг от друга. Успеха. ![]()  | 
| 
 | 
Создано: 09 февраля 2012 09:31  · Личное сообщение · #24  | 
| eXeL@B —› Вопросы новичков —› Найти переменную и место, где она меняется | 










 Для печати