CRC 32

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

  1. Shooter

    Shooter New Member

    Публикаций:
    0
    Регистрация:
    15 апр 2007
    Сообщения:
    2
    Нужен пример реализации подсчета файла своей CRC 32 и сравнение с реальным желателтьно на асме.
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Чисто алгоритм вот:
    Код (Text):
    1. GetCRC32A proc lpString:DWORD
    2.     pushad
    3.     xor eax,eax
    4.     mov edi,lpString
    5. @@: scasb
    6.     jnz @B
    7.     dec edi
    8.     sub edi,lpString
    9.     push edi
    10.     push lpString
    11.     call GetCRC32
    12.     mov [esp+7*4],eax
    13.     popad
    14.     ret
    15. GetCRC32A endp
    16. ;#####################################
    17. ;#####################################
    18. GetCRC32 proc lpData, dwDataSize:DWORD
    19.     pushad
    20.     xor eax,eax
    21.     mov edx,lpData
    22.     mov ecx,dwDataSize
    23.     jecxz @4
    24.     not eax
    25. @1: xor al,[edx]
    26.     inc edx
    27.     mov bl,8
    28. @2: shr eax,1
    29.     jnc @3
    30.     xor eax,0EDB88320h
    31. @3: dec bl
    32.     jnz @2
    33.     loop @1
    34.     not eax
    35. @4: mov [esp+7*4],eax
    36.     popad
    37.     ret
    38. GetCRC32 endp
    А если ты имеешь ввиду, что считать в файле и т.д., то не знаю
     
  3. Shooter

    Shooter New Member

    Публикаций:
    0
    Регистрация:
    15 апр 2007
    Сообщения:
    2
    Алгоритм и в исходниках по крипте приведены. Ну а как себя открыть для подсчета?
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Что значит открыть? Передаешь функции указатель на участок памяти и ее размер... Что тут вызывает сложность?
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    MSoft
    надо было отправить человека в поиск по форуму :)
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Asterix
    Я сам не знал, что на форуме такое обсуждалось :)
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    а это уже азы, CreateFile->ReadFile или MMF
     
  8. wasmer

    wasmer New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    104
    если файл небольшой то можно его весь загрузить в память, но имхо эффективнее читать файл блоками где-то по 256 байт, код тогда будет например таким
    Код (Text):
    1. ;eax=crc32 предыдущего блока или 0 для первого блока
    2. GetCRC32 proc lpData, dwDataSize:DWORD
    3.     pushad
    4.     mov edx,lpData
    5.     mov ecx,dwDataSize
    6.     jecxz @4
    7.     not eax
    8. @1: xor al,[edx]
    9.     inc edx
    10.     mov bl,8
    11. @2: shr eax,1
    12.     jnc @3
    13.     xor eax,0EDB88320h
    14. @3: dec bl
    15.     jnz @2
    16.     loop @1
    17.     not eax
    18. @4: mov [esp+7*4],eax
    19.     popad
    20.     ret
    21. GetCRC32 endp
     
  9. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    если ты про поле checksum в PE хидере то там алго не такой, существует одноимённая функция в imagehlp корая реверсится за пару минут, а CRC32 для файла считается точно так-же как и для памяти, просто нужно прочитать файл в память. Но иногда поступают не так, иногда просто добавляют некоторые байты в конец для того чтобы crc равнялось нулю, но это в прочем уже не по теме