Приветы всем! Ситуация такая: записываю код в конец последней секции. Меняю все необходимые поля. Если есть оверлей, то двигаю его таким образом: Код (Text): mov edi,hMapViewTo ; адрес региона, куда промэппирован файл add edi,NewFileSize ; + новый размер файла(=начальный размер+ выровненный размер X-кода) dec edi mov esi,hMapViewTo add esi,FileSize ;начальный размер файла dec esi mov ecx,SizeOfOverlay ;посчитал так: FileSize-(ALIGN_UP(LS.Ph_Size,FileAlignment)+LS.PointerToRawData) std rep movsb Таким образом я сдвигаю оверлей в конец файла. А на его место, т.е. в конце последней секции прописываю свой код. Но, мой код срабатывает, а при передаче управления прога падает. Что не так, подскажите?
А после 'std' есть 'cld'? Win требует, чтобы EFLAGS.DF был сброшен при вызове API. Возможно, там и валится. А вообще, неоплохо бы взять Olly и посмотреть, где именно валится в патченной версии и сравнить, как это работает в непатченной.
scalter Ну обычно тут отладчик помОгает, т.к. по той информации что ты описал трудно понять в чем трабл. И каким образом падает прога. Может со стеком чего намутил - свинул его на пару байт? Или правда флаги? Ну это не очевидные траблы, которые сразу не заметишь, другие в Ольке смотри. Насчет не очевидных багов. Вот недавно встретился мне при кодинге один не очень очевидный баг, ну опыт мне мой позволил разобраться с ним в течении 15 минут, новичок думаю копался бы целый день, а так может и не расскопал. Вот приведу пример кода - Код (Text): mov [Context + CONTEXT..xcontextflags],0x10007 ; CONTEXT_FULL lea eax,[Context] invoke GetThreadContext,[ThreadHandle],eax ... Context CONTEXT <0> ThreadHandle имеет ACCESS - THREAD_ALL_ACCESS. Структура Context перед вызовом GetThreadContext заполнена правильно - все нули, и FLAGS тоже заполнен. Но вот GetThreadContext всегда возвращает FAIL. Кто скажет в чем трабл?
crypto Мы об одном и том же говорим? copy /B calc.exe+explorer.exe supercalc.exe — у последнего будет оверлей в виде проводника. И он не будет грузиться в память.
IceStudent Видимо о разном, я имею в виду оверлеи, которые подгружаются в процессе исполнения. У Борланда загрузка выполнялась через какое-то прерывание, как сейчас помню.
crypto Оверлей о котором говорит IceStudent он же оверлей для формата PE - это данные которые находятся в конце файла после всех секции и не попадают в образ модуля при загрузке. Типичный пример WinRARSFX - там оверлеем является Rar файл. IceStudent NO_ACCESS - вот код ошибки.
В общем, посмотрел все в ольке - все отлично. Стал проверять на других exe-шниках - flash-ые работают и некоторые инсталяционки, а нек-ые нет. Понял, что не все ре-файлы находят оверлей, начиная с конца файла. Некоторые ищут его, по ходу, через последнюю секцию. Как быть в этом случае? И, чтобы не заводить новую тему, хочу спросить, если сохранять первые 5 байт точки входа программы, то во 2-ом и последующих поколениях, мой х-код должен их восстановить. Если это произойдет, то эта программа уже никогда не передаст управление на мой х-код. В этом случае лучше после выполнения моего кода выполнить эти 5 байт, не сохраняя их?