Olly, или Объясните чайнику

Тема в разделе "WASM.BEGINNERS", создана пользователем Tihon, 16 июн 2009.

  1. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Программа работает только с сд-рома.
    При переносе на хард выдает сообщение - "Программа должна быть запущена с лицензионного диска". Это понятно.

    При загрузке в Olly двух вариантов программы, - с сд и с харда, - сразу после открытия в OllyDbg! - обнаруживаются отличия в областях памяти. И в кодах дезассемблера. От типа диска, например, или от типа файловой системы... Естественно, что эти отличия влияют на ход выполнения программы. Их можно бы и пофиксить... Хотелось бы максимально приблизить работу копии к оригиналу. :)

    Так вот, вопрос.
    После открытия двух копий программы в двух окнах Olly - до запуска исполнения, в точке входа! - по адресу 002002С (по дампу области памяти 0020000-002000F) лежат разные байты: 0C (на харде) и 0D (на сд-роме) - см. аттач.
    Объясните чайнику, каким образом эта разница возникает?
    Спасибо за внимание.
     
  2. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Извините, не приаттачилась картинка, перебрал с размером... :dntknw:(
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    По адресу 20000h (обычно) лежит структура RTL_USER_PROCESS_PARAMETERS, а по смещению 2Ch соотв-но юникодовская строка CurrentDirectory - вот у тебя первая буква диска и отличается :)
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Приврал маленько, по 2Ch лежит CURDIR.Handle
     
  5. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Благодарю очень-очень... Но откуда эта инфа? Таких (или подобных) моментов много, все не спросишь...
    За помощь - много-много виртуального пива, за ссылку на инфу - пузырь виртуальной водки :)))
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Насчет структуры RTL_USER_PROCESS_PARAMETERS и т.п. то это из разряда NtUndoc - можешь погуглить по этому словечку или по названию структур PEB, TEB. Да и здесь на сайте можно качнуть Undocumented Functions for Microsoft Windows NT/2000 и\или KmdKit by Four-F
    Ну а то, что эта структура в Win XP лежит по адресу 20000h - это просто факт, в других версиях в принципе м.б. и по другому адресу, нужно смотреть по цепочке TEB->PEB->ProcessParameters
     
  7. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Вчера leo писал:
    Еще раз благодарю, коллега.
    Однако, проделав эксперимент, я получил странные выводы.
    При размещении программы на любом локальном диске (у меня были D:, G:... по адресу 0020002С лежит байт 0C, на сд-роме и на виртуальном диске - байт 0D. Ты сказал в #3:
    И я опять не понимаю: не буква диска здесь играет, а тип диска, не так ли?
    Кроме того, ты говоришь -
    Вот я приаттачиваю то, что рамблер выдал на http://usar.pp.ru/download/trash/TEB.inc...
    Смотрим на CURDIR.handle.
    Код (Text):
    1. CURDIR STRUCT
    2.     DosPath                 UNICODE_STRING <>   ; 00h
    3.     Handle                  PVOID ?             ; 04h
    4. CURDIR ENDS
    И не 2Ch, а 4Ch, да? Опять же, я прошу объяснения тому, что очи видят... Сам пока понять не могу...
    Пока один большой плюс:
    Код (Text):
    1. PEB_BASE equ 07FFDF000h
    И ведь правда, есть такой блок памяти после загрузки программы...
    Спасибо, коллега, за хворост для моего костра... Не прощаюсь, жду дальнейших ценных размышлений!
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В #4 я уже поправил, что по 2Ch лежит хэндл текущей директории CURDIR.Handle
    Почему этот хэндл "всегда" равен 0C или 0D не знаю, т.к. по идее он мог бы быть любым. Поэтому более или менее серьезная прога не может полагаться на это различие, а по сему просто забей на это дело ;)

    Нет, смещение структуры CurrentDirectory в ProcessParameters равно 24h. DosPath это не просто указатель, а 8 байт UNICODE_STRING. Итого смещение Handle будет 24h+8=2Ch

    Это не плюс, а минус :) , т.к. это устаревшая инфа - начиная с Win XP адреса TEB и PEB устанавливаются от запуска к запуску случайным образом в пределах нескольких страниц от 07FFDF000h (рандомизация).
    Olly в карте памяти помечает TEB как "data block of main thread", дампишь эту страничку и по смещению 30h определяешь адрес PEB
     
  9. DarkMist

    DarkMist New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    3
    Здраствуйте у важаемы крякеры))
    Сел изучать "Введение в крекинг с нуля". С граматическими и логическими ошибками в этих урока справляюсь, было все ясно до 14 урока))
    Дошло дело до задачек по сложней и тут началось мучение...
    есть пару моментов которые хотелось уточнить,цитата:
    ..."На следующей строке происходит сравнение 0A с содержимым [EBX-10], то есть с нулём" - почему с нулем?? регистр ebx и так равен 0000 и если [ebx-10] ....непонятно раз
    ...."В следующей строке перемещаем в EDX ноль ( mov edx,dword ptr ss:[ebp-10]) " - а где здесь ноль нарисовался??? непонятно два
    если кому не трудно объясните пожалуйста
    зарание благодарен
    с ув DarkMist
     
  10. friackazoid

    friackazoid New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2009
    Сообщения:
    102
    Потому что [EBX-10] это не вычитание из содержимого регистра EBX десяти это обращение по адресу содержащемуся в регистре ebx плюс еще смещение на 10 байт от этого адреса.