Всем доброго времени суток! Решил сделать приятный сюрприз для любопытных юзеров, которые интересуются содержимым бинарника - закодировать .DATA секцию. Сделал спец-тулзу для нахождения .DATA секции и ее кодирования - все вроде ок. Но столкнулся с траблой при разкодировании в запущенном бинарнике - прога вылетает. Как извесно .DATA секция как и все другие секции выравниваются, и неинициализованные данных заполнятся нулями. И если я начинаю работать с этим кусочком памяти - появляется ошибка (хотя я не выхожу за рамки секции). Если кто-нить хороше разбирается в этом вопросе - буду благодарен! И еще, почему VirtualSize больше чем SizeOfRawData?
первое, что приходит на ум - каким-то магическим способом на секции появились ненужные атрибуты только чтения. Или, как вариант, в декрипторе ты прописываешь неправильные адреса. Показал бы код, что ли. А еще лучше не код, а защищенную програмку. Желательно размером не более 10 кб. Т.е. создай обычный hello world, добавь каких-нить неиниц. переменных, "закриптуй" и кинь сюда ---------------------------- Ой, стоп, гришь, виртуальные данные больше? Ессно они могут быть больше, если ты создаешь неинициализированные переменные. Надеюсь, для шифрования ты используешь размер физ., а не вирт. данных???
1. Данные я пока для теста только поXORил 2. Размер скции данных я взял из SizeOfRawData 3. Неинициализированные данные .DATA? используются 4. Секцию кода нахожу с использованием примеров - Iczelion PE формат Возможно система каким-то образом использует дельту выравнивания под неиницализованные данные!? С атрибутами дамаю это никак не должно быть связано.
сырец большеватый полчится, алгаритм - прост. - Получаем смещение на .DATA из PointerToRawData - Получаем размер секции SizeOfRawData (тут все правильно) - Если шафровать только существующие данные, не заходя в дельту вырвнивания - все ОК - Как только зашел в дельту - начинаютя глюки Так вот вопрос в том - как система распоряжается этой дельтой?
очень много тонкостей, вплоть до опечаток и гадать на кофейной гуще никто не будет ты из фала читаешь или из памяти? если из памяти то нада VirtualAddress cлаживать с ImageBase что за дельта я так и не понял
Сначало (утилитой для кодирования) я читаю из файла и получаю PointerToRawData и SizeOfRawData После загрузки кодированного файла я из файла получаю VirtualAddress и SizeOfRawData, и дишифрую. Ошибок тут нет, все четко (специально дамп .DATA выводил). Но как только я попадаю на дельту (дельта в данном случае - разница между выравниванием секции данных и реальными инициализованными данными) возникает трабла.
Если ты шифруешь от адреса PointerToRawData до PointerToRawData + SizeOfRawData, а расшифровываешь от VirtualAddres до VirtualAddres + SizeOfRawData. То о какой делте речь? P.S Посмотри внимательно процу расшифровки, она так как я описал? В ней может быть трабл, если по неинициализированым данным пройтись ксором.
ну сказали же тебе, зашифруй Hello world и кинь сюда бинарник. В чем проблема? думаю, размер не получится сильно большим. Кроме того, ты в ольке это дело смотрел? размер правильно берешь? указатель туда указывает? и насчет дельты я тоже ниче не понял. Какая нах дельта? Иниц. и неиниц. данные лежат в одной секции. Что там считать?
ATX Ага а в чём вопрос? У меня такое подозрение, что 27 строку закоментировать надо. Нули для выравнивания никем не используются и имеют те же атрибуты, что и секция.
asd и при чем тут 27-я строка? По умолчанию надо 31-ю править! Там хендл монитора неправильный передается!
Уважаемые коллеги! С траблой разобрался, ответ оказался прост как я и предпологал - система использует дельту (тобиш разницу между инициализованными данными и выравниванием) под неинициализованные данные. Так что с этим нужно поокуратнее Всем спасибо!
Системе вообще плевать на то что в секциях. всегда делал что хотел с этой областью и никогда не было косяков.
ATX Скорее всего не система, а сама прога, и не "между инициализованными данными и выравниванием", а между SizeOfRawData и VirtualSize, т.к. в файле могут не сохранятся не только неинициализированные данные, но и хвосты секций, инициализированные нулями
Все так, как в моем случае. Неинициализованные данные (.data?) попали в этот самый хвост заполненный нулями,и переменная - hInstance, я по ней после инициализации прошелся дишефратором и ага, эфект гарантирован, все летит Вот собсна и вся трабла!