Шифрование .DATA секции

Тема в разделе "WASM.BEGINNERS", создана пользователем ATX, 26 июн 2007.

  1. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Всем доброго времени суток!

    Решил сделать приятный сюрприз для любопытных юзеров, которые интересуются содержимым бинарника - закодировать .DATA секцию.
    Сделал спец-тулзу для нахождения .DATA секции и ее кодирования - все вроде ок.
    Но столкнулся с траблой при разкодировании в запущенном бинарнике - прога вылетает.
    Как извесно .DATA секция как и все другие секции выравниваются, и неинициализованные данных заполнятся нулями.
    И если я начинаю работать с этим кусочком памяти - появляется ошибка (хотя я не выхожу за рамки секции).

    Если кто-нить хороше разбирается в этом вопросе - буду благодарен!

    И еще, почему VirtualSize больше чем SizeOfRawData?
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    ATX
    Код как шифруешь и как дешифруешь. особенно как находишь начало секции в памяти.
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    первое, что приходит на ум - каким-то магическим способом на секции появились ненужные атрибуты только чтения. Или, как вариант, в декрипторе ты прописываешь неправильные адреса. Показал бы код, что ли. А еще лучше не код, а защищенную програмку. Желательно размером не более 10 кб. Т.е. создай обычный hello world, добавь каких-нить неиниц. переменных, "закриптуй" и кинь сюда

    ----------------------------
    Ой, стоп, гришь, виртуальные данные больше? Ессно они могут быть больше, если ты создаешь неинициализированные переменные. Надеюсь, для шифрования ты используешь размер физ., а не вирт. данных???
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    CRT startup code что-то читает\пишет в .data?
     
  5. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    1. Данные я пока для теста только поXORил
    2. Размер скции данных я взял из SizeOfRawData
    3. Неинициализированные данные .DATA? используются
    4. Секцию кода нахожу с использованием примеров - Iczelion PE формат

    Возможно система каким-то образом использует дельту выравнивания под неиницализованные данные!?
    С атрибутами дамаю это никак не должно быть связано.
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    покажи сорец и все проблемы решатся
     
  7. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    сырец большеватый полчится, алгаритм - прост.
    - Получаем смещение на .DATA из PointerToRawData
    - Получаем размер секции SizeOfRawData
    (тут все правильно)
    - Если шафровать только существующие данные, не заходя в дельту вырвнивания - все ОК
    - Как только зашел в дельту - начинаютя глюки

    Так вот вопрос в том - как система распоряжается этой дельтой?
     
  8. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    очень много тонкостей, вплоть до опечаток и гадать на кофейной гуще никто не будет
    ты из фала читаешь или из памяти? если из памяти то нада VirtualAddress cлаживать с ImageBase
    что за дельта я так и не понял
     
  9. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Сначало (утилитой для кодирования) я читаю из файла и получаю PointerToRawData и SizeOfRawData
    После загрузки кодированного файла я из файла получаю VirtualAddress и SizeOfRawData, и дишифрую.

    Ошибок тут нет, все четко (специально дамп .DATA выводил).

    Но как только я попадаю на дельту (дельта в данном случае - разница между выравниванием секции данных и реальными инициализованными данными) возникает трабла.
     
  10. maestro-ant

    maestro-ant Member

    Публикаций:
    0
    Регистрация:
    23 июл 2006
    Сообщения:
    112
    Если ты шифруешь от адреса PointerToRawData до PointerToRawData + SizeOfRawData, а расшифровываешь от VirtualAddres до VirtualAddres + SizeOfRawData. То о какой делте речь?

    P.S Посмотри внимательно процу расшифровки, она так как я описал? В ней может быть трабл, если по неинициализированым данным пройтись ксором.
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ну сказали же тебе, зашифруй Hello world и кинь сюда бинарник. В чем проблема? думаю, размер не получится сильно большим. Кроме того, ты в ольке это дело смотрел? размер правильно берешь? указатель туда указывает? и насчет дельты я тоже ниче не понял. Какая нах дельта? Иниц. и неиниц. данные лежат в одной секции. Что там считать?
     
  12. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.742
    А механизм декодирования как работает ?
     
  13. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Пока тестовый режим, просто XOR.
     
  14. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    ATX
    Ага а в чём вопрос? У меня такое подозрение, что 27 строку закоментировать надо.
    Нули для выравнивания никем не используются и имеют те же атрибуты, что и секция.
     
  15. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    asd
    и при чем тут 27-я строка? По умолчанию надо 31-ю править! Там хендл монитора неправильный передается!
     
  16. maestro-ant

    maestro-ant Member

    Публикаций:
    0
    Регистрация:
    23 июл 2006
    Сообщения:
    112
    ATX кароче.. или сорец или тему закрыть!
     
  17. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Уважаемые коллеги!

    С траблой разобрался, ответ оказался прост как я и предпологал - система использует дельту (тобиш разницу между инициализованными данными и выравниванием) под неинициализованные данные.

    Так что с этим нужно поокуратнее :derisive:

    Всем спасибо!
     
  18. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Системе вообще плевать на то что в секциях. всегда делал что хотел с этой областью и никогда не было косяков.
     
  19. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    ATX
    Скорее всего не система, а сама прога, и не "между инициализованными данными и выравниванием", а между SizeOfRawData и VirtualSize, т.к. в файле могут не сохранятся не только неинициализированные данные, но и хвосты секций, инициализированные нулями
     
  20. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Все так, как в моем случае.
    Неинициализованные данные (.data?) попали в этот самый хвост заполненный нулями,и переменная - hInstance, я по ней после инициализации прошелся дишефратором и ага, эфект гарантирован, все летит :)

    Вот собсна и вся трабла!