Работа с ресурсами dll
От: Eclectr  
Дата: 27.03.06 17:11
Оценка:
Привет всем. У меня возникла проблема с цифровой подписью файла. Точнее — с корректным сохранением подписи файла в нем самом после подписывания. Это нужно для передачи файла (dll) с сервера и уверенности принимающей стороны в корректности кода dll. Так вот, чтобы не менять протокол своего общения с сервером и не передавать подпись отдельно решил запихать ее прямо в файл dll, в ресурсы. Использовал для этого BeginUpdateResource(), UpdateResource(), EndUpdateResource(). На сервере подписал файл, запихал в него подпись, отправил. На клиенте выдернул подпись, верифицировал. Проблема в том, что ф-ция UpdateResource(), по-видимому, при выдирании подписи не возвращает файл в первоестественное состояние, т.к. хэш файла до подписи и после выдергивания ее же НЕ совпадают. Пробовал всяко — не получилось. Не совпадают и все. Решил расковырять формат PE файла и руками в ресурсе поменять то, что мне нужно. Опять возникла проблема: указатель на таблицу ресурсов — не валидный (RVA, считается относительно Image Base при загрузке файла в память). Вопрос такой: а относительно чего этот RVA считается в файле, и можно ли вообще малой кровью отредактировать ресурсы dll, не прибегая к вышеуказанным апишным функциям?
Заранее спасибо

28.03.06 08:22: Перенесено модератором из 'C/C++' — Павел Кузнецов
Re: Работа с ресурсами dll
От: zaufi Земля  
Дата: 27.03.06 22:52
Оценка:
Здравствуйте, Eclectr, Вы писали:

E>Привет всем. У меня возникла проблема с цифровой подписью файла. Точнее — с корректным сохранением подписи файла в нем самом после подписывания. Это нужно для передачи файла (dll) с сервера и уверенности принимающей стороны в корректности кода dll. Так вот, чтобы не менять протокол своего общения с сервером и не передавать подпись отдельно решил запихать ее прямо в файл dll, в ресурсы. Использовал для этого BeginUpdateResource(), UpdateResource(), EndUpdateResource(). На сервере подписал файл, запихал в него подпись, отправил. На клиенте выдернул подпись, верифицировал. Проблема в том, что ф-ция UpdateResource(), по-видимому, при выдирании подписи не возвращает файл в первоестественное состояние, т.к. хэш файла до подписи и после выдергивания ее же НЕ совпадают. Пробовал всяко — не получилось. Не совпадают и все. Решил расковырять формат PE файла и руками в ресурсе поменять то, что мне нужно. Опять возникла проблема: указатель на таблицу ресурсов — не валидный (RVA, считается относительно Image Base при загрузке файла в память). Вопрос такой: а относительно чего этот RVA считается в файле, и можно ли вообще малой кровью отредактировать ресурсы dll, не прибегая к вышеуказанным апишным функциям?

E> Заранее спасибо
ну например так:
1) вместа DOSовой заглухи пишешь свою в которой определяешь какойнить static char* signature="unique signature with sizeof(checksum)" -- тоесь чонить очень уникальное размером с твою подпись... ну для приличия заглухо тоже печатает что твоя мега прога не предназначена для выполнения под DOSом
2) подписыванию подлежит все что после заглухи... т.е. PEшная часть exe файла... -- соответсна сервер это и буит проверять...
Re[2]: Работа с ресурсами dll
От: zaufi Земля  
Дата: 27.03.06 22:55
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>Здравствуйте, Eclectr, Вы писали:


E>>Привет всем. У меня возникла проблема с цифровой подписью файла. Точнее — с корректным сохранением подписи файла в нем самом после подписывания. Это нужно для передачи файла (dll) с сервера и уверенности принимающей стороны в корректности кода dll. Так вот, чтобы не менять протокол своего общения с сервером и не передавать подпись отдельно решил запихать ее прямо в файл dll, в ресурсы. Использовал для этого BeginUpdateResource(), UpdateResource(), EndUpdateResource(). На сервере подписал файл, запихал в него подпись, отправил. На клиенте выдернул подпись, верифицировал. Проблема в том, что ф-ция UpdateResource(), по-видимому, при выдирании подписи не возвращает файл в первоестественное состояние, т.к. хэш файла до подписи и после выдергивания ее же НЕ совпадают. Пробовал всяко — не получилось. Не совпадают и все. Решил расковырять формат PE файла и руками в ресурсе поменять то, что мне нужно. Опять возникла проблема: указатель на таблицу ресурсов — не валидный (RVA, считается относительно Image Base при загрузке файла в память). Вопрос такой: а относительно чего этот RVA считается в файле, и можно ли вообще малой кровью отредактировать ресурсы dll, не прибегая к вышеуказанным апишным функциям?

E>> Заранее спасибо
Z>ну например так:
Z>1) вместа DOSовой заглухи пишешь свою в которой определяешь какойнить static char* signature="unique signature with sizeof(checksum)" -- тоесь чонить очень уникальное размером с твою подпись... ну для приличия заглухо тоже печатает что твоя мега прога не предназначена для выполнения под DOSом
Z>2) подписыванию подлежит все что после заглухи... т.е. PEшная часть exe файла... -- соответсна сервер это и буит проверять...
--
oops!чота я рано на субмит нажал.. -- ну думаю дальше все понятно:
3) подпись всовывать заместо этой самой "сигнатуры" с помощью любых доступных тебе средств... I/O streams, FILE*, open/write/close (или чо там под Win есть)
Re: Работа с ресурсами dll
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 28.03.06 03:12
Оценка:
Здравствуйте, Eclectr, Вы писали:

E>Привет всем. У меня возникла проблема с цифровой подписью файла. Точнее — с корректным сохранением подписи файла в нем самом после подписывания.


http://www.rsdn.ru/?article/?405
Автор(ы): Алексей Кирюшкин
Дата: 07.09.2003
Реализация метода контроля целостности исполняемых файлов с использованием CRC
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.