ZEXPL2.EXE and  TOOLS.
                        ZIP EXPLODER for ZIP 2.x
                              Version 1.0.


             The fastest cracking routines in smallest code !





                      NOTE FOR RUSSIAN READERS :
                     ----------------------------

       Русский вариант документации находится после английского .


                             TRADEMARKS.
                            -------------

      Sorry, it's very hard work, so :
   All product names are registered  trademarks  of their respective
   owners.


                     HISTORY OF PROGRAM'S EVOLUTION.
                    ---------------------------------

      Okay, now let the story goes.
      About a year ago I stole the archive with sources made by one of
   C-mans. I always like such funny stuff, and I was trying to unpack that
   file immediately. I was very suprised by message appeared on my disp-
   lay :

      "PKUNZIP:  (W12)  Warning! Skipped encrypted file: TAPE.C"

      It was the deal of honor to steal this sources anyway. So I had
   started to write some ZIP Exploder. The very first version of ZIP
   Exploder was invented to crack Imploded english text files with 3
   Shannon-Fano trees. It was because PKZIP version up to 1.2 uses
   previously computed SFT tables for all such files. The way to check
   password was :

      Update the keys with password,
      Decrypt 12-bytes stub and compare
      the very high word of stub with high word of file's CRC,
      If compared Ok - decrypt the first 16 bytes of file
      and compare they with text files' standard SFT table,
      If compared - then we found the RIGHT password.

      Unfortunately, that version of Exploder did not save the compu-
   tation state periodically, performed straight keys updating and (oh)
   had some bugs. I and my friend Dummy Animator have killed it so it
   will never appear anywhere.

      One of my friends downloaded me the (non)famous ZIPCRACK in the
   summer 1993. That program was very curved and its performance wasn't
   big enough. Password search was limited  by 5 characters and this
   kludge was very inconvenient in use. It updates keys with all of the
   passwords notwithstanding updates the password string from its end.

      Although ZIPCRACK didn't help me to get sources from the archive I
   had, it kicked me to make second step in the way of Exploder. After I
   got access to 386 I added CPU checking to it and started searching.
   Sources and ZIP  Exploder itself  was downloaded to several BBS in
   Russia. In this version was introduced new way of key updating -
   now keys updated with only changed letters. You may feel the dif-
   ference in speed looking at following calculations :

      Old version of Exploder does the straight updating and decode
   11+1/256 stub bytes before check the stub decoded properly.
   Time needed to do this with one password :

   pswdlen*(n)+(11+1/256)*n, where "n" is time for updating one key.

      New version decodes the same number of bytes in stub, but update
   keys with only changed bytes. Now "m" is number of available pass-
   word letters :

   (1+1/(m)+1/(m^2))*(n)+(11+1/256)*n.

      If pswdlen is 5 symbols, then difference is about 33 percents !
   New version of ZIP Exploder was show the speed about 4,500 passwords
   per second on AT 286/16 !

      It's everything ok, but here came PKZIP 2.04a. None of two programs
   could crack it. It's not a very hard thing to see what phrase
   "Improved Password Protection" did mean. All I could see was that
   password verification had been done by comparing only one byte !!!!!
   First byte taken from 12-byte stub, second - most high byte CRC32 !
   I have NO COMMENTS.

      After I had seen what PKZIP does I  wrote my own program. It's a
   program we are talking about -  ZEXPL2.EXE.  This program can crack
   a password for a number of files - and even better if you have many
   encrypted files. Now the principle of work is :

      Compute keys after password using technique described above,
      loop
        Decode stub and compare check bytes for each data record,
      while compared Ok and some data is available.
      if All data compared Ok then we're have correct password !

      Most of frequently entered loops are coded using register vars.
   Speed marks on my AT 386SX/20 and 486DX/50 show :
      Machine   Non-optimized version     Optimized version
       (type)       (pswds/sec)              (pswds/sec)
      -------   ----------------------    -----------------
       386SX          7300                   8700
       486DX         21200                  25600

      I can brag about my program speed, can't I ?


                              LIMITATIONS
                             -------------

   WARNING !!!!!!!!!!!!
   The following paragraphs are VERY IMPORTANT !
   PLEASE READ THEM CAREFULLY !

      This program was invented to beat the archive compressed and enc-
   rypted by PKZIP 2.04 or earlier versions. No warranties given to Exp-
   lode files compressed by higher versions of PKZIP.

      The goal of program is to Explode passwords from archive where
   one password was used for all the files. You may write your own
   version of EXTRHDR (see below).


                   HOW TO USE ZEXPL2.EXE AND EXTRHDR.COM.
                  ----------------------------------------

      What do you have now ? I think it's encrypted archive, ZEXPL2,
   and EXTRHDR. The very first thing what you should do is to extract
   information from the encrypted archive. Run "EXTRHDR archive.zip"
   for it. All necessary information will be extracted to file ENCRHDRS.DAT.

      Second step is to create list of used characters. This set of
   characters used in each password letter is stored in file AVAIL.CHR.

   WARNING !
      No CR, LF, FF or EOF symbols are need ! You may include this sym-
   bols ONLY if you are SURE THEY WERE USED IN ORIGINAL PASSWORD !

      Now you may run the ZEXPL2 to start password searching.

      Every time ZEXPL2 finds password passed all tests, it will beep
   three times, display great message about current situation and add
   password to the end of file PASSWORD.TXT. It's your responsibility to
   take care about messages displayed by ZEXPL2! My advice is to peri-
   odically check file PASSWORD.TXT and try new passwords you have found
   in.


                           SOME TECHNICAL NOTES.
                          -----------------------

      First, if you have archive with multiply passwords you have to
   write your own version of EXTRHDR. Following is format of file
   ENCRHDRS.DAT :

        Byte offset    Length    Value
       -------------  --------  -------
           0            12d      12-byte crack resistance header of
                                 file
           12d           1       The very high byte of file CRC to
                                 compare with
           13d           3       Align bytes not used by ZEXPL2.


      Several words about AVAIL.CHR.

      Password search is simple bytes substitution. It means sequen-
   tially try strings "aaa","aab","aac",...,"aba","abb",abc" etc.
   Even one extra symbol will result several millions addititional
   passwords. It's very important to specify character set as careful
   as it possible. DO NOT ADD CR,LF or EOF symbols to end of charset
   file AVAIL.CHR !!!!!!!!!!!!!!!!!!

      Whether found password correct or not depends on how many files
   you had to extract with EXTRHDR. Each file reduces probability of
   incorrect password to 1/256 times (one byte range). One extracted
   file - 1/256 (0.39%), two files - 1/65536 (0.0015%), three files -
   1/16777216 (0.00000596%). Twelve extracted files make you sure that
   found password will be the only one correct for this set of files.
   It's because PKZIP's encryption scheme is limited by 12 bytes ran-
   dom number generator.


                          THANKS ! GOES TO ...
                         ----------------------

      Dmitry A.Lemechov and Leopold A.Kaganov - just for they funny
   characters,

      Rinat A.Sadretdinov (better known as Dummy Animator) - for his
   help on editing this text and programming advices,

      Alexey Nikolaev and Serguey Berkovitch - for their help in FIDO
   orientation,

      My parents - I can't say only "Thank !" to them, but I have not
   enough good words ...,

      My brother Timka - very wonderful guy !,

      Phil Katz - for documentation on earlier version of PKZIP, and I
   hope he will supply next versions of PKZIP with it,

      And many, many, many other peoples I (don't) know...

                          TO ALL OF YOURS !!!!!


                                      With best regards,
                                      Serguey A.Zefirov,
                                      December 1993.

   P.S.
      Wanna next version ?
      Don't your copy of ZEXPL2 work properly ?
      Do you have any suggestions or you have found bugs ?
      Please write to :

      117465, Russia, Moscow, Generala Tyuleneva st., 17,69,
      Serguey Alexandrovitch Zefirov.

   P.P.S
      Password of ARJ archive can be found within not more than week
   of work. All the work can be done (even better done) manually.
   My two experiences of ARJ Exploding were succeed in two hours.

   P.P.S.
      ZEXPL2 passed test I gave to it - at the time I was writing this
   message ZEXPL2 had succesfully found password for sources of another
   c-man. It's funny, isn't it ?


; *****************************************************************************
; English text ends here
; *****************************************************************************

; *****************************************************************************
; Здесь русский вариант документации.
; *****************************************************************************


                    К АНГЛОЯЗЫЧНЫМ ЧИТАТЕЛЯМ :
                   ----------------------------

      The english text is above. Where were you all the time ?


                          ТОРГОВЫЕ ЗНАКИ.
                         -----------------

      Это очень муторное занятие, поэтому :
   Все ниже(выше) упомянутые имена продуктов есть торговые знаки со-
   ответствующих компаний(предприятий).


                    ИСТОРИЯ РАЗВИТИЯ ПРОГРАММЫ.
                   -----------------------------

      Итак, все началось не так уж  давно.  Около года назад я стянул
   архив с исходниками некоего  человека-сишника. Поскольку мне очень
   смешно смотреть на чужие потуги писать на си (сам я до этого дохожу
   очень редко), я решил потешить себя и на этот раз. Однако, представ-
   те себе мое удивление, когда PKUNZIP принялся выводить сообщение о
   пропущенных "закрученных" файлах.

      Не скрою, это было делом чести программиста-Ассемблерщика утереть
   нос одному из сишников. Тут то все и заверте...

      Через дня три была готова первая версия Вскрывателя. Принцип ее
   действия основывался на том, что PKZIP версий вплоть до 1.2 исполь-
   зовал заранее вычисленные таблицы для деревьев Шеннона-Фано. При
   этом сами таблицы не менялись от версии к версии. Оставалось только
   выдрать эти таблицы, и написать программу раскодировки и сравнения
   раскодированных данных и выдранных таблиц. Что и было сделано.

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

      Летом 93 один из моих друзей списал широко (не)известную програм-
   му ZIPCRACK, написанную одним товарищем из США. Это был редкий при-
   мер того, как не надо писать программы. Длина пароля до 5 букв, пря-
   мое обновление ключа,  низкое  быстродействие,  нет поддержки  386,
   неудобная, в конце концов. Зато это подтолкнуло меня на написание
   второй версии Вскрывателя.

      Вторая версия Вскрывателя содержала значительное улучшение пере-
   бора паролей - строка пароля обновлялся начиная с конца, и обнов-
   ление ключей производилось только для изменившихся символов. Это
   дает выигрыш в скорости около 30% при длине пароля в 5 букв.
   Взгляните :

      Если len - длина пароля, m - количество букв в одной позиции
   пароля, n - время обновления одного ключа, то время прямого обнов-
   ления ключей и предварительной проверки равно :

      (len)+10+1/256)*(n). 15,39 при len=5.

      Для обновления с конца :

      ((1+(1/m)+1/(m^2))+10+1/256)*n.
      Эта формула не зависит от длины !

      Благодаря этой технике новая версия Вскрывателя показала скорость
   около 4500 паролей в секунду на машине AT 286/16 !

      Однако, тут появился PKZIP 2.04. Ни одна из доступных мне прог-
   рамм не могла с ним справиться. Тогда пришлось заняться тем, что в
   описании PKZIP'а называется "Существенно Улучшенной Шифровкой Дан-
   ных". Оказалось все "не просто, а очень просто" - вместо проверки
   по старшим словам защитного блока и CRC файла, производится про-
   верка только по байтам !

      Нас, что, за идиотов держат ?

      После того, как я разобрался с тем что делает PKZIP, я написал
   эту программу - ZEXPL2. Теперь проверка пароля осуществляется таким
   образом :

      Строится массив из защитных блоков и проверочных байтов,
      цикл для каждого пароля
        Обновить ключи и раскодировать защитный блок,
        Если не прошло проверку то оборвать цикл и перейти к другому
          паролю,
        Перейти к следующему блоку,
      конец цикла
      Если пройдены все блоки то мы получили правильный пароль

      Так как, 3 ключа свободно помещаются в регистрах 386 и выше про-
   цессоров, то большинство циклов декодирования и обновления ключей
   выполнены с использованием регистровых переменных. Ниже я привел
   результаты прогонов моей программы на моей AT 386SX/20 и AT 486DX/50.

      Тип машины      Неоптим. версия    Отимиз. версия
                       (паролей/сек)     (паролей/сек)
     ------------    -----------------  ----------------
       386SX              7300               8700
       486DX             21200              25600

      Получить результаты не за 10, а за 8 дней - неплохо, а ?
   Я думаю, мне можно хвастатся скоростью моей программы.


                            ОГРАНИЧЕНИЯ.
                           --------------

      ВНИМАНИЕ !!!!!!!!!!!!!!
      Нижеследующие абзацы ВЕСЬМА ВАЖНЫ !!!!!!
      Будьте добры прочитать их внимательно !!

      Эта программа (ZEXPL2) предназначалась для вскрытия архива упа-
   кованного с одним паролем на все файлы. Поэтому для вскрытия ар-
   хивов с разными паролями необходимо применить программу, аналогич-
   ную EXTRHDR, но для извлечения файлов с одинаковым паролем. (Или
   пишите свой собственный вскрыватель).

      Программа создавалась для вскрытия пароля PKZIP версий вплоть до
   2.04, поэтому нет никаких гарантий, что она будет работать с после-
   дующими версиями PKZIP'а.


                      КАК ИСПОЛЬЗОВАТЬ ZEXPL2 ?
                     ---------------------------

      Запустите EXTRHDR с параметром - именем архива. Он извлечет ин-
   формацию, необходимую для ZEXLP2 в файл ENCRHDRS.DAT. Далее надо
   создать файл с набором символов пароля - AVAIL.CHR. В этом файле
   надо указать все символы, которые Вы ожидаете встретить в пароле.

   ВНИМАНИЕ !
      НЕ НАДО ДОБАВЛЯТЬ В ЭТОТ ФАЙЛ СИМОЛЫ ВОЗВРАТА КАРЕТКИ, ПЕРЕВОДА
   СТРОКИ И КОНЦА ФАЙЛА !!!

      Эти символы вряд-ли входят в строку пароля.

      Теперь можно запускать ZEXPL2 в каталоге с файлами ENCRHDRS.DAT
   и AVAIL.CHR.

      После того, как ZEXPL2 нашел пароль, прошедший тесты со всеми
   файлами, то он показывает этот пароль, бибикает, выдает сообщение о
   найденном пароле и добавляет его в файл PASSWORD.TXT. А уж что Вы
   со всем этим будете делать - решайте сами ! Я лично советую периоди-
   чески просматривать файл PASSWORD.TXT и пробовать новые пароли.


                   НЕКОТОРЫЕ ТЕХНИЧЕСКИЕ ЗАМЕЧАНИЯ.
                  ----------------------------------

      Формат файла ENCRHDRS.DAT :

      Смещение    Длина     Значение
      --------    -----     ----------------
          0        12d      Блок защиты от взлома упакованного файла
                            (первые 12 байт после имени файла)
          12d       1d      Старший байт CRC32 файла
          13d       3d      Выравнивание - не используется.

      Еще немного о файле набора символов :

      Поскольку перебор паролей идет в следующем порядке :
      aaa,aab,aac,...,aba,abb,abc и т.д., то желательно оставить только
   самые вероятные символы, поскольку один лишний символ может добавить
   несколько часов работы программы на больших паролях.

      Вероятность того, что найденный пароль правилен, экспоненциально
   пропорциональна количеству файлов, выдранных из архива. Например,
   один файл дает вероятность ошибки 1/256 (0,39%), два файла - 1/65536
   (0,0015%) , три файла - 1/16777216 (0,00000596%). Двенадцать файлов
   дают практически полную уверенность в правильности пароля. Это выве-
   дено из размера генератора случайных чисел, используемого PKZIP'ом.


                       Я ГОВОРЮ "СПАСИБО !" ...
                      --------------------------

      Дмитрию Лемехову и Леопольду :) Каганову - а просто так !,

      Ринату Садретдинову (Dummy Animator) - за помощь при написании
   английского текста описания и советы по программированию,

      Алексею Николаеву и Сергею Берковичу - за их помощь в ориентации
   в лабиринте ФИДО,

      Моим родителям - здесь недостаточно просто "Спасибо !", но я
   старый солдат, и не знаю слов о любви ...,

      Моему брату Тимке - он просто хороший парень - разве мало ?,

      Филу Кацу - за документацию по PKZIP'ам ранних версий, и я надеюсь,
   что следующие версии PKZIP'а будут снабжены ею,

      И всем, всем, всем остальным, кого я (не)знаю !

                        ВСЕМ ВАМ, ДРУЗЬЯ !


                                 С наилучшими пожеланиями,
                                 Сергей Александрович Зефиров,
                                 Декабрь 1993.

   P.S.
     Хочите что-то еще ? Или нашли дырки ?
     Пишите :
     117465, Россия, Москва, ул.Генерала Тюленева, 17, 69,
     Сергею Александровичу Зефирову.

   P.P.S.
     Кстати, пароль у ARJ можно вскрыть где-то за неделю в худшем слу-
   чае. Те два раза, когда я вскрывал пароль ARJ, я справился за 2 часа.

   P.P.P.S.
     Сейчас я пишу о том, что моя программа успешно выполнила первое
   задание - пока я выходил отдохнуть, она вскрыла пароль с исходников
   еще одного сишника. За 4(четыре) минуты !