Проблема с оверлеем

Тема в разделе "WASM.BEGINNERS", создана пользователем scalter, 25 окт 2007.

  1. scalter

    scalter New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2007
    Сообщения:
    30
    Приветы всем! Ситуация такая: записываю код в конец последней секции. Меняю все необходимые поля. Если есть оверлей, то двигаю его таким образом:
    Код (Text):
    1. mov edi,hMapViewTo  ; адрес региона, куда промэппирован файл
    2. add edi,NewFileSize ; + новый размер файла(=начальный размер+ выровненный размер X-кода)
    3. dec edi
    4. mov esi,hMapViewTo         
    5. add esi,FileSize            ;начальный размер файла
    6. dec esi
    7. mov ecx,SizeOfOverlay   ;посчитал так: FileSize-(ALIGN_UP(LS.Ph_Size,FileAlignment)+LS.PointerToRawData)
    8. std
    9. rep movsb
    Таким образом я сдвигаю оверлей в конец файла. А на его место, т.е. в конце последней секции прописываю свой код. Но, мой код срабатывает, а при передаче управления прога падает. Что не так, подскажите?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А после 'std' есть 'cld'? Win требует, чтобы EFLAGS.DF был сброшен при вызове API. Возможно, там и валится. А вообще, неоплохо бы взять Olly и посмотреть, где именно валится в патченной версии и сравнить, как это работает в непатченной.
     
  3. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    scalter
    А ты фиксапы оверлея не апдейтишь при его перемещении?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    crypto
    А для оверлея могут быть релоки? Он же не грузится в память?
     
  5. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    scalter
    Ну обычно тут отладчик помОгает, т.к. по той информации что ты описал трудно понять в чем трабл. И каким образом падает прога. Может со стеком чего намутил - свинул его на пару байт? Или правда флаги? Ну это не очевидные траблы, которые сразу не заметишь, другие в Ольке смотри. Насчет не очевидных багов. Вот недавно встретился мне при кодинге один не очень очевидный баг, ну опыт мне мой позволил разобраться с ним в течении 15 минут, новичок думаю копался бы целый день, а так может и не расскопал. Вот приведу пример кода -

    Код (Text):
    1. mov [Context + CONTEXT..xcontextflags],0x10007  ; CONTEXT_FULL
    2. lea eax,[Context]
    3. invoke GetThreadContext,[ThreadHandle],eax
    4. ...
    5. Context             CONTEXT <0>
    ThreadHandle имеет ACCESS - THREAD_ALL_ACCESS. Структура Context перед вызовом GetThreadContext заполнена правильно - все нули, и FLAGS тоже заполнен. Но вот GetThreadContext всегда возвращает FAIL. Кто скажет в чем трабл?
     
  6. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    IceStudent
    Конечно у него не может быть релоков.
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Оригинальный способ. Код ошибки в студию (LastError).
     
  8. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    IceStudent
    Кхе, а куда же он, зараза такая, грузится?
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    crypto
    Мы об одном и том же говорим?
    copy /B calc.exe+explorer.exe supercalc.exe — у последнего будет оверлей в виде проводника. И он не будет грузиться в память.
     
  10. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    IceStudent
    Видимо о разном, я имею в виду оверлеи, которые подгружаются в процессе исполнения. У Борланда загрузка выполнялась через какое-то прерывание, как сейчас помню.
     
  11. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    crypto
    Оверлей о котором говорит IceStudent он же оверлей для формата PE - это данные которые находятся в конце файла после всех секции и не попадают в образ модуля при загрузке. Типичный пример WinRARSFX - там оверлеем является Rar файл.

    IceStudent
    NO_ACCESS - вот код ошибки.
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Mental_Mirror
    Выровнять context забыл?
     
  13. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    IceStudent
    Точно!!! +1 =)
     
  14. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Кстати а где написано что структуры надо выравнивать??
     
  15. scalter

    scalter New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2007
    Сообщения:
    30
    В общем, посмотрел все в ольке - все отлично. Стал проверять на других exe-шниках - flash-ые работают и некоторые инсталяционки, а нек-ые нет. Понял, что не все ре-файлы находят оверлей, начиная с конца файла. Некоторые ищут его, по ходу, через последнюю секцию. Как быть в этом случае? И, чтобы не заводить новую тему, хочу спросить, если сохранять первые 5 байт точки входа программы, то во 2-ом и последующих поколениях, мой х-код должен их восстановить. Если это произойдет, то эта программа уже никогда не передаст управление на мой х-код. В этом случае лучше после выполнения моего кода выполнить эти 5 байт, не сохраняя их?
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    У них может быть захардкорено смещение оверлея.