Модифицирую boot-сектор дискеты.

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

  1. Postoronnim_V

    Postoronnim_V New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    2
    Здравствуйте всем!

    Вообще, я прикладной программист, но возникла некоторая задачка, которая, на мой взгляд, подходит тематике этого форума. Посему на правах гостя разрешите попросить доброго совета.

    Пишу плагин к одной системе. На С++. Без использования asm. В качестве носителей секретной информации в системе используются дискеты (или флэшки). Система запоминает метку+серийный номер тома используемой дискеты и ругается, если при старте вставляешь дискету даже с нужной инфой, но физически другую.
    Моя задача это побороть.
    В общем-то, я это реализовал. Раскопал, где хранится кэш с инфой о носителе в системе, получаю инфу о реальной дискете через GetVolumeInformation, сравниваю, и если что-то не совпадает, то устанавливаю нужную метку через SetVolumeLabel и нужный серийный номер при помощи кода с http://www.codeproject.com/system/change_drive_sn.asp.

    Проблема в том, что после этого основной процесс системы все равно получает старую метку и серийный номер тома. Мне нужно выйти из программы и заново зайти, чтобы изменения вступили в силу.

    На данный момент не придумал ничего лучше, как: в случае патча выдавать MessageBox пользователю, типа, прога сейчас будет закрыта, т.к. была вставлена другая дискета, изменения произведены, нужен рестарт, запустите ее, плиз, заново, после чего тушить стартующий процесс. Что, на мой взгляд, неспортивно :)

    Можете ли посоветовать что-нибудь лучше? Хорошо, если бы обошлось без жертв и разрушений (шутка :derisive: - драйвер с перехватом сервисов ядра ради этого писать как-то влом, тем более, что я в этом не очень сильно соображаю.... :))
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Все это дело должно быть обязательно в виде плагина?
    Я так понимаю, что "система" получает информацию о носителе тоже с помощью GetVolumeInformation. Почему бы как раз на вызове GetVolumeInformation и не пропатчить "систему":
    1) Вместо вызова поставить прыжок на свой код
    2) В своем коде
    -- проверяете правильную информацию о носителе в "системе" и присваиваете ее носителю
    -- вызываете GetVolumeInformation
    -- передаете управление на следующую инструкцию после оригинального вызова GetVolumeInformation
     
  3. Postoronnim_V

    Postoronnim_V New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    2
    Вариант плагина предусмотрен самим разработчиками. Скажем так, можно повесить вызов функции из DLL на разные события главной формы вроде OnCreate, OnActivate... События, кстати, борландовские, т.к. все дело написано на Delphi, насколько могу предполагать.

    С перехватом GetVolumeInformation меня терзают сомнения, т.к. обращение к диску идет из специальной небольшой DLL-ки (псевдо"драйвера"). Конечно, никакой на самом деле это не драйвер, просто небольшая динамически подгружаемая библиотечка, в которую вынесены функции работы с флоппи-дисками.
    Но дело в том, что на момент выполнения плагина криптосистема еще не инициализирована, и этой библиотечки в моем адресном пространстве еще не будет. Получается, надо создавать отдельный поток, который будет ждать, когда же нужная DLL будет загружена. На моем уровне знаний я бы сделал это в виде цикла ожидания GetModuleHandle, но там надо бы использовать Sleep хоть с каким-то ненулевым периодом ожидания, при этом возникает риск "не успеть" сделать перехват.

    Подозреваю, что ожидание загрузки DLL можно сделать как-то более красиво?
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Postoronnim_V
    Ну так в чем проблема? Патчим тогда эту длл-ку. Если очень уж хочется плагин, то тогда WriteProcessMemory (хотя не вижу в этом необходимости). Если длл не использует GetVolumeInformation... ну тогда надо подробнее рассматривать, как она работает с дискетами.
    Хм... ну перехват LoadLibrary :)
    Получается, что в программе не предусмотрен вариант, когда Вы сначала вставили по ошибке неверную дискету, а потом опять верную? Т.е. даже разработчики считают, что их программу нужно перезапускать?
    Кроме того... а как обработан программой вариант, когда дискеты в дисководе нету? Если выдается какое-то сообщение, то можно просто запускать программу без дискеты, а когда Ваш плагин обнаружит сообщение, то можно приостановить поток, который его выдал, сымитировать нажатие ОК или чего-то там (типа дискету вставил), потом провести нужные манипуляции с дискетой, а потом опять запустить поток (хоть это и тоже криво :) ).
    Еще один вариант - пропатчить длл "криптосистемы", чтобы именно она загружала Ваш плагин. Тогда не понадобятся никакие циклы ожидания с GetModuleHandle.
    P.S. Я вообще только совсем начинающий, так что не стоит прямо со всей серьезностью относиться к тому, что я пишу. :)