Определение контрольной суммы файлов.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SKYS
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 21.09.2007 (Пт) 8:31
Откуда: г.Кемерово

Определение контрольной суммы файлов.

Сообщение SKYS » 11.01.2008 (Пт) 5:28

Доброго времени суток!!!
Имеется текстовый файл.
этот файл формируется с помощью определенной программы.
файл структурированный .
имеется строка служебная инф. с неким числом которое является контрольной суммой.
Я обрабатываю этот файл через свою программу изменяю кое что удаляю в итоге при попытке принять файл в ту программу в которой он был создан он пишет что файл изменен и не принимается.
То что это контрольная сумма я вычислил экспериментальным путем.

Открываю файл удаляю одну букву сново её ввожу в то же место. Все файл не принимается хотя содержимое то же . Так вот главный вопрос как мне определить котрольную сумму обработанного файла. До обработки контрольная сумма известна а вот после . Ведь если ее вычислить и заменить в строке служебная информация то он будет приниматься нормально.
Есль какие нибудь идее ???
Хорошо когда не знаеш да еще забудеш !!!!

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 11.01.2008 (Пт) 8:28

Вот так обычно считают Контрольную сумму

Код: Выделить всё
Сумма = 0
Цикл
Берешь ASCII номер символа в файле
прибавляешь к Сумме
если Сумма = Трехзначное - значит отрезаем два последних символа
Конец цикла
Конец
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.01.2008 (Пт) 8:55

"Контрольная сумма" - понятие растяжимое. Это может быть и CRC32 и SHA256 и MD5... и варианты этих аббревиатур с другими индексами. А может быть какая-то отсебятина типа того, что предложил Денис. Нужно считать именно тем способом, который заложен в программу.
Лучший способ понять что-то самому — объяснить это другому.

SKYS
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 21.09.2007 (Пт) 8:31
Откуда: г.Кемерово

Сообщение SKYS » 11.01.2008 (Пт) 9:26

ну есть же самый распространенный способ .
тут скорее всего так как у програмеров писавшиф эту прогу было мало времени я не думаю что так что то сложное.
P>S> Может поможет Прога написана на делфях
Хорошо когда не знаеш да еще забудеш !!!!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.01.2008 (Пт) 10:14

Может помочь значение контрольной суммы.
Лучший способ понять что-то самому — объяснить это другому.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 11.01.2008 (Пт) 10:27

Antonariy
Моя "отсебятина" используется в ПФР России. Ничего себе отсебятина :lol:
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.01.2008 (Пт) 10:38

Тоже мне авторитет.
Не знаю, как сейчас, может теперь они научились нормальные программы писать.
Но за те программы, которые они выпускали года три назад, им надо лоботомию назначать.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.01.2008 (Пт) 11:15

Даже уже известно кому конкретно :lol:
если Сумма = Трехзначное - значит отрезаем два последних символа
Это профанация, а не контрольная сумма. Диапазон значений - всего 100, уже среди 101го исходного значения будет как минимум 1 совпадение этих "контрольных сумм". Реально - десяток. Да и подделывается как два пальца об асфальт. А во времена DOS'а уже были вирусы, умеющие подделывать СRС32 зараженных файлов, а диапазон CRC32 - 32 бита, т.е. long целиком, от минуса до плюса.

С экспоненциальным ростом количества данных, требующих идентификации, стало не хватать и диапазона CRC32, поэтому (а так же из-за простоты подделки) придумали SHA256 (на 8 порядков шире) и прочее.

Алгоритм CRC32:
Код: Выделить всё
Option Explicit
'This module calculates the CRC32-checksum of a certain bytestream

Dim CrcTableInit As Boolean
Dim CRCTable(0 To 255) As Long

Public Function CalcCRC32(ByteArray() As Byte) As Long
Dim I As Long
Dim crc As Long
    If CrcTableInit = False Then Call Init_CRCTable
    crc = -1
    For I = 0 To UBound(ByteArray) - 1
        crc = (((crc And &HFFFFFF00) \ &H100) And &HFFFFFF) Xor (CRCTable((crc And &HFF) Xor ByteArray(I)))
    Next I
    crc = crc Xor &HFFFFFFFF
    CalcCRC32 = crc
End Function

Private Sub Init_CRCTable()
Const Limit = &HEDB88320
Dim I As Long
Dim j As Long
Dim crc As Long
    For I = 0 To 255
        crc = I
        For j = 0 To 7
            If crc And 1 Then
                crc = (((crc And &HFFFFFFFE) \ 2) And &H7FFFFFFF) Xor Limit
            Else
                crc = ((crc And &HFFFFFFFE) \ 2) And &H7FFFFFFF
            End If
        Next j
        CRCTable(I) = crc
    Next I
    CrcTableInit = True
End Sub
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.01.2008 (Пт) 11:56

Не нравится мне такой код.
Этот гораздо изящнее:
Код: Выделить всё
Private crc32Table() As Long
...
Function CalcCRC(Data As String) As Long
Dim crc32Result As Long, I As Long, L As Byte, B As Byte
Const dwPolynomial As Long = &HEDB88320
On Error GoTo ErrorHandler
I = crc32Table(0)
On Error GoTo 0
crc32Result = &HFFFFFFFF
For I = 1 To Len(Data)
  B = Asc(Mid$(Data, I, 1))
  L = (crc32Result And &HFF) Xor B
  crc32Result = ((crc32Result And &HFFFFFF00) \ &H100) And 16777215 ' nasty shr 8 with vb :/
  crc32Result = crc32Result Xor crc32Table(L)
Next I
CalcCRC = Not crc32Result
Exit Function

ErrorHandler:
'If Err.Number <> 9 Then Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
ReDim crc32Table(0 To 255)
For I = 0 To 255
  crc32Result = I
  For B = 0 To 7
    If (crc32Result And 1) Then
        crc32Result = ((crc32Result And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
        crc32Result = crc32Result Xor dwPolynomial
    Else
        crc32Result = ((crc32Result And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
    End If
  Next B
  crc32Table(I) = crc32Result
Next I
Resume
End Function
Lasciate ogni speranza, voi ch'entrate.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 11.01.2008 (Пт) 13:12

SKYS
чтобы выяснить неизвестную методику црц-подсчётов, нужно иметь как минимум более одного файла. Берёшь два файла, желательно с различным только одним символом, и сравниваешь. Потом изменяешь еще отличный на другой символ и опять сравниваешь. И так, чтобы сформировать картину изменений. На основании этих замеров, у тебя в итоге должна сложится картина, что и насколько пересчитывается.

Но, в твоей ситуации, чтото не до конца ясное, потому что,
SKYS писал(а):Открываю файл удаляю одну букву сново её ввожу в то же место. Все файл не принимается хотя содержимое то же

Либо ты вставляешь не тот символ, либо в CRC замешано чтото с привязкой к дате изменения файла. Либо, на самом деле, изменяется размер после твоего "дописывания/переписывания".
Сделай проще, возьми файл до изменения, получи его CRC. Удали букву, вставь опять, и опять получи CRC. Если суммы неравны, значит косяк у тебя.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.01.2008 (Пт) 14:51

Хм...

У моих программ есть ini-шка с куда пишется контрольные суммы файлов, их версии и прочее, навроде:

MyProgramm.exe=BEDBD536;1.9.192;1014272;2008-1-9 14:42:33;0


Все это при запуске программы проверяется и в случае различия обновляется с сервера. Будучи модифицированна хотя бы одним байтиком программа работать просто не будет...

Алгоритм расчета CRC32, нестандартный, так что подобрать его довольно тяжко - в лоб явно не получится, так что я бы не взялся...

Контрольная сумма у меня и вводилась для того чтобы злой юзер/вирус не правили файлы как им вздумается...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 11.01.2008 (Пт) 16:01

Andrey Fedorov
так что, получается, что CRC у тебя может быть разная с одним и тем же содержимым файла, байт в байт?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.01.2008 (Пт) 16:41

Хм, из каких его слов это получается?
Лучший способ понять что-то самому — объяснить это другому.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 11.01.2008 (Пт) 16:45

А еще бывает, - вбиваеш в одну из прог типа "налогоплательщика" ИНН, а прога пишет типа "неправильный инн" и никуда не пускает ни вперед, ни назад. В таком случае нада просто перебрать последние две цифры от 00 до 99 вот и весь CRC :lol:

А насчет профанации и лоботомии... хм.. вот, почитайте
http://ru.wikipedia.org/wiki/Crc
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.01.2008 (Пт) 16:55

Ты сам то эту ссылку читал?
Lasciate ogni speranza, voi ch'entrate.

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 11.01.2008 (Пт) 18:24

Antonariy
вроде и не из каких, мне показалось, что он хотел опровергнуть теорию выявления алгоритма, мотивируя, что его CRC всегда уникальный.

а то, что:
Andrey Fedorov писал(а):Алгоритм расчета CRC32, нестандартный, так что подобрать его довольно тяжко - в лоб явно не получится, так что я бы не взялся...

в принципе, мало волнует того, кто берётся найти ключ. он бы не взялся, я бы взялся, если бы это было мне интересно.
всю жизнь раскапывал всякие запутанные CRC разных протоколов, в основном сотовых :)
у каждого кодировщика "свой" метод защиты :wink:

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.01.2008 (Пт) 18:56

kibernetics писал(а):Andrey Fedorov
так что, получается, что CRC у тебя может быть разная с одним и тем же содержимым файла, байт в байт?


Можно было и так извратиться, но влом. Поэтому с одним и тем же немодифицированным файлом сумма будет одна и та же. Но для ее расчета еще всякая мерзость намешана - типа даты файла и пр...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 11.01.2008 (Пт) 19:05

Andrey Fedorov
я, в принципе, CRC своей программы считаю только для того, чтоб знать, что ехешник никем не модифицирован (большей частью вирусы)
ибо, очень неприятно, когда потом тебе станут говорить, мол ваша программа - распространитель вирусов.
а защиту, я считаю, что "кому это нужно" тот сможет сломать.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.01.2008 (Пт) 19:11

kibernetics писал(а):ибо, очень неприятно, когда потом тебе станут говорить, мол ваша программа - распространитель вирусов.
а защиту, я считаю, что "кому это нужно" тот сможет сломать.


Ну а я еще и о злом юзере думаю, который ищет и правит строчки запросов в EXE-шнике...

Хочешь попробовать найти алгоритм? Пришлю несколько файликов и их строчки из ini-шки... :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 12.01.2008 (Сб) 10:22

Andrey Fedorov, думаю, что ты уже не первый раз за рулём, и не мне пешеходу объяснять, как нужно правильно ездить. в пересчётах сумм у тебя фигурируют многочисленные параметры, что будет распутать довольно тяжело и муторно. поэтому, идею с распутыванием твоих CRC, пока оставим :)

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 12.01.2008 (Сб) 23:51

alibek
Читал, а что?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

SKYS
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 21.09.2007 (Пт) 8:31
Откуда: г.Кемерово

Сообщение SKYS » 14.01.2008 (Пн) 6:00

kibernetics писал(а):SKYS
чтобы выяснить неизвестную методику црц-подсчётов, нужно иметь как минимум более одного файла. Берёшь два файла, желательно с различным только одним символом, и сравниваешь. Потом изменяешь еще отличный на другой символ и опять сравниваешь. И так, чтобы сформировать картину изменений. На основании этих замеров, у тебя в итоге должна сложится картина, что и насколько пересчитывается.

Но, в твоей ситуации, чтото не до конца ясное, потому что,
SKYS писал(а):Открываю файл удаляю одну букву сново её ввожу в то же место. Все файл не принимается хотя содержимое то же

Либо ты вставляешь не тот символ, либо в CRC замешано чтото с привязкой к дате изменения файла. Либо, на самом деле, изменяется размер после твоего "дописывания/переписывания".
Сделай проще, возьми файл до изменения, получи его CRC. Удали букву, вставь опять, и опять получи CRC. Если суммы неравны, значит косяк у тебя.



Последовал товему совету вот результаты (для определения crc использовал код который предоставил Antonariy)
сначало проверил crc немодифицированного файла = -236968511
в файле (365496687) (время модификации 09:29:15 время создания 9:30:04)

(Почемуто с минусом)
после этого изменил одну букву с О на А получил следующий результат = 1489179213
в файле (243389889)(время модификации 09:37:03 время создания 9:40:40)


итутже спустя минут 15 сново формирую файл ничего не изменяя и получаю следующую crc сумму = 750429289
в файле (243390177)
(время модификации 09:42:53 время создания 09:43:08)

теперь уж точно не понятно откуда плясять но вероятно crc привязана к времени создания. (Интересный факт время модификации файла меньше времени создания это как так ???)
Хорошо когда не знаеш да еще забудеш !!!!

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 14.01.2008 (Пн) 10:07

Да ничего у тебя так не получится - алгоритм расчета может быть какой угодно, а не тупое сложение. Разве что дизассемблируешь программу и вытащишь оттуда функцию рассчета контрольной суммы...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 14.01.2008 (Пн) 10:10

Если
(для определения crc использовал код который предоставил Antonariy)
и
тутже спустя минут 15 сново формирую файл ничего не изменяя и получаю следующую crc сумму = 750429289
, то файл сформировывается не идентичный первому. CRC не врет и не зависит от даты создания файла.
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 99

    TopList