выцепить адресс из DMA игры

Discussion in 'Реверсинг' started by Derec, 13 Dec 2010.

  1. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0
    Уважаемые реверсеры, думаю Вы мне поможете, сам я не обладаю достаточными знаниями в этом искусстве. Вообщем в игре значение X хранится по адрессу: 0xADDRESS_1. После перезапуска игры оно меняет значение и знач. X уже находится по адрессу: 0xADDRESS_2. Я пробую искать ссылку на эти адреса, и нахожу главный адресс 0xMAINADDRESS ( в нем как обычно в таком случае хранится значение для получения адресов 0xADDRESS_1, 0xADDRESS_2 и т.д) Ну может я зря это рассказываю, это все не ново для тех, кто когда-либо писал трейнеры к DMA играм.
    Проблема в том, что pointer address (0xMAINADDRESS) меняется тоже, но иногда, например, когда перезапускается ОС. Можно ли как-то выципить этот адресс, используя статические смещения? :(
     
    1 person likes this.
  2. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Искомый адрес в библиотеке? С чего он вдруг меняется, поясните или выложите exe + dll
     
  3. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0
    Exe + dll будет мало, поскольку это игра, а в ней много файлов, как знаете, без которых она не запустится. Возомжно искомый адресс в библиотеке, я в этом не очень понимаю (как его найти). А можете предположить каким образом получить адресс? Не будете же вы качать все игру, для того, чтобы реверсить ее.

    Сейчас имею:

    0xMAINADDRESS^ + 0xOFFSET = 0xMYADDRESS

    где 0xMAINADDRESS^ - значение из MAINADDRESS (его знаю)
    0xOFFSET - соответственно оффсет (тоже знаю)
    0xMyAddress - искомый адресс, который в итоге нужно получить и изменить скажем в нем значение.

    MAINADDRESS меняется, часто после перезагрузки ОС
     
  4. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Требуются только библиотеки и exe для загрузки в отладчик этого достаточно.
    Магические формулы тоже не ахти данные, лучше приводите примеры конкретных адресов а-ля 0x734873FDA
     
  5. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0
    >> Скачать

    Есть ли смысл? Игра сетевая к тому же и запускается с лоадера. То есть если будете запускать ехе, выскочит сообщение... Хотя его успешно можно обойти и оно запустится. Так же достаточно просто перетащит любую длл на этот ехе и запустится.

    Я думал, что меня просто просветят, и укажут правильный путь :)

    Ну вот на реальных адресах:
    Ищу с помощьюю artMoney -> получаю 0x02A779A0 - искомый. Далее ищу это значение по всему диапозону -> получаю 0x03F65FDC. А вот это значение не знаю как выцепить :(
     
  6. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Используем Games Invader плагин для ollydbg и ищем с его помощью, ставим бряки на адреса и найдем код который там орудует. А судя по адресам загрузки в этой области данные а не библиотеки. Как-то так.
     
    1 person likes this.
  7. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0
    Спасибо огромное, вот уже что-то! Не знал о таком плагине, попробую. Не закрывайте пожалуйста тему, скорей всего возникнет вопрос по этому плагину :rolleyes:
     
  8. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0
    Кстати, я в действительности ищу не числовое значение, а текстовое. И то что вы говорите, что судя по адресам это не библиотеки, а данные. Возможно тут другой подход?
     
  9. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Подход практически такой же, ставим точку останова на dword адрес которого равен адресу началу строки (надеюсь понятно излагаю) и ждем срабатывания.
     
  10. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0
    neprovad, сделал все как Вы и сказали:

    Ищу текстовое значение

    02A979A0 - адрес начала строки. Затем ставлю бряк на запись в это значение, меня кидает на следующий код:

    Состояние регистров в момент breakpoint

    Code:
    EAX = 03F25FB8  EDX = 00000000  EBP = 0018FDF0
    EBX = 00000004  ESI = 02A979A4  ESP = 0018FDE4
    ECX = 02A979A0  EDI = 0018FE54  EIP = 1029CFC4
    
    Code:
    1029CFBF - eb 03                      - jmp cuicreatechar::setcharaterangle+4004
    [COLOR=DarkOrange]1029CFC1 - c6 06 00                   - mov byte ptr [esi],00[/COLOR]  //точка останова
    1029CFC4 - 8b 70 48                   - mov esi,[eax+48]       //указатель на начало строки
    1029CFC7 - 8b 48 4c                   - mov ecx,[eax+4c]       //длинна строки
    1029CFCA - 4e                         - dec esi
    1029CFCB - 3b d9                      - cmp ebx,ecx
    1029CFCD - 89 70 48                   - mov [eax+48],esi
    1029CFD0 - 7d 04                      - jnl cuicreatechar::setcharaterangle+4016
    1029CFD2 - 49                         - dec ecx
    1029CFD3 - 89 48 4c                   - mov [eax+4c],ecx
    1029CFD6 - 5f                         - pop edi
    1029CFD7 - 5e                         - pop esi
    1029CFD8 - 5b                         - pop ebx
    
    Это все в чем я смог разобраться :rolleyes: Может быть для Вас тут будет понятно что к чему.
    Я сам первый раз дизассамблирую и не умею пользоваться ollyDbg, поэтому все в такой форме неудобной.

    p.s. Побольше бы таких отзывчивых людей на форуме, как neprovad. Эх...на Вас одна надежда :)
     
  11. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    engine.dll : 0x1029CE60 - бряк и смотреть откуда вызов идет (см. первый dword в стеке). Сама функция просто копирует память, т.е. переменная уже создана (если речь о том как найти ее создание) и просто куда-то перемещается. Менеджер памяти в работе или что-то похожее на него. Следовательно надо смотреть куда копируется
    p.s. не каждое первое срабатывание в играх верное :)
     
    #11 neprovad, 14 Dec 2010
    Last edited: 14 Dec 2010
  12. WNZRS

    WNZRS Member

    Joined:
    3 Sep 2009
    Messages:
    294
    Likes Received:
    52
    Reputations:
    1
    Code:
    HMODULE hExe = GetModuleHandle("Game.exe");
    DWORD ADDR = 0xADDRESS_CUR - hExe;
    Game.exe - название процесса
    ADDRESS_CUR - текущий адрес нужной переменной
    ADDR - адрес в exe

    Потом сможешь сделать hExe + ADDR и будет адрес переменной.
     
  13. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0
    Целый день пробую, но ничего не получается. Запускаю игру, затем OllyDbg, аттачусь к процессу и попадаю в ntdll.dll. Не могу из нее выйти. Говорю, я первый раз взялся за отладчик :rolleyes: Знаю немного теории только. Блин, видимо не судьба :(

    Такое не прокатит. Каждый раз буду получать разный адресс. Поэтому важно проследить, где формируется адресс :)
     
    #13 Derec, 15 Dec 2010
    Last edited: 15 Dec 2010
  14. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Работать в отладчике и пользоваться artmoney разные вещи) можно почитать введение в ollydbg с нуля. Гораздо проще запускать игру сразу из под отладчика, предварительно поставить точки останова и потом уже жать F9 для продолжения. Внутри ntdll блуждать не надо, сразу переходите к искомым адресам. И все таки прочитайте статьи, будет больше пользы
     
  15. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    я иногда на оллидбг забиваю и юзаю CheatEngine - даже ей можно и пропатчить и отладить и отследить что куда обращается и тд. но самое главное - это пройти обучающий тутор (предлагается при первом запуске)
     
    #15 sn0w, 16 Dec 2010
    Last edited: 16 Dec 2010
  16. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0

    Ага, я тоже пользуюсь CheatEngine. OllyDbg для меня сложноват, даже после прочтения статей от Навара.

    Я обнаружил что адресс можно получить вроде бы так:

    2910000 + 10923C = 02A1923C
    ____||____________||__________||________
    Allocation Base__|__ Offset__|__Pointer Address

    и по адресу Pointer Address (02A1923C) находится адресс начала строки.

    Вопрос в том, можно ли как то программно определить Allocation Base? Это ведь адресс начала какого-то блока данных?! :confused:
     
    #16 Derec, 23 Dec 2010
    Last edited: 23 Dec 2010
  17. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Например попробовать бряк на VirtualAlloc или воспользоваться winapioverride32 и потом смотреть по логам когда вызов выделения памяти вернул буфер с таким адресом
     
  18. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0
    Всем спасибо за пищу для мозгов! В результате у меня получилось вычипить адрес, однако не совсем так как я хотел. С winapioverride32 было тяжело справится, не понятно много. Еще раз спасибо за обсуждения.