Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как узнать присутствует ли пароль на rar или zip архиве? (http://forum.oszone.net/showthread.php?t=135949)

NORIO 26-03-2009 18:48 1075548

Как узнать присутствует ли пароль на rar или zip архиве?
 
Есть несколько тысяч архивов в форматах zip и rar. Нужно наиболее быстрым способом узнать запаролен ли каждый архив. Как это сделать?

Coutty 26-03-2009 18:57 1075559

Я бы воспользовался Касперским. Он пропускает запароленные архивы. Или нужно именно на AutoIt?

NORIO 26-03-2009 19:18 1075580

Coutty,
Мне нужно получить список таких архивов, если на autoit это неполучится, то я не против и других способов, главное что бы они работали без вмешательства пользователя, что бы процесс не приостанавивался если меня не будет за компом.

proxy 26-03-2009 19:33 1075591

для rar-а легко: Свойства файла (архива) > вкладка Архив > строчка Пароли: (она же [CLASS:Static; INSTANCE:21])

для zip-а то же самое: [CLASS:Static; INSTANCE:21]

у меня в ОС установлен WinRar,
но, думаю, и без него все свойства вкладки "Арихв" будут точно такие же.

Как вариант:
1. получить список архивов в папке
2. открыть папку с архивом и выбрать файл:
Код:

Run('Explorer.exe /select,' & 'полный путь к файлу')
3. открыть свойства: банально высталть ALT+Enter
4. перейти на 3-ю вкладку
5. прочитать данные из: [CLASS:Static; INSTANCE:21]
6. закрыть свойства, закрыть папку архива
7. повторить с пункта 2 для следующих архивов ;)

NORIO 27-03-2009 03:02 1075883

proxy спасибо за решение, и Coutty спасибо за отзывчивость.
Нашёл более удобное решение проблемы -- прогу "Encryption Analyzer" которая ищет разные запароленные файлы.

amel27 27-03-2009 06:43 1075906

для чтения инфы из RAR-файлов можно использовать UnRar.dll с оффсайта:
Код:

#include <Array.au3>
#include <File.au3>

$sRoot = "D:\" ; Каталог с архивами, оконечный слэш обязателен
$aFilesAll = _FileListToArray($sRoot,"*.rar",1)

Dim $aFilesPwd[1], $aFiles[1]
For $i=1 To $aFilesAll[0]
    If _RarIsEncrypt($sRoot & $aFilesAll[$i]) Then
        $aFilesPwd[0]+=1
        ReDim $aFilesPwd[$aFilesPwd[0]+1]
        $aFilesPwd[$aFilesPwd[0]] = $sRoot & $aFilesAll[$i]
    Else
        $aFiles[0]+=1
        ReDim $aFiles[$aFiles[0]+1]
        $aFiles[$aFiles[0]] = $sRoot & $aFilesAll[$i]
    EndIf
Next


_ArrayDisplay($aFiles, "Список незашифрованных архивов")
_ArrayDisplay($aFilesPwd, "Список зашифрованных архивов")

Func _RarIsEncrypt($sFile)
    Local $hDll = DllOpen(@ProgramFilesDir &"\WinRAR\unrar.dll")
    If $hDll=-1 Then Return SetError(1, 0, True)

    Local Const $ERAR_END_ARCHIVE = 10
    Local Const $ERAR_UNKNOWN    = 21
    Local Const $tzRAROpenArchiveData = "ptr pArcName;uint OpenMode;uint OpenResult;ptr pCmtBuf;uint CmtBufSize;uint CmtSize;uint CmtState"
    Local Const $tzRARHeaderData = "char ArcName[260];char FileName[260];uint Flags;uint PackSize;uint UnpSize;uint HostOS;uint FileCRC;uint FileTime;uint UnpVer;uint Method;uint FileAttr;ptr pCmtBuf;uint CmtBufSize;uint CmtSize;uint CmtState"

    Local $iFile = StringLen($sFile), $aRAR, $aRet, $iRes = False
    Local
$tRAROpenArchiveData = DllStructCreate($tzRAROpenArchiveData)
    Local $pRAROpenArchiveData = DllStructGetPtr($tRAROpenArchiveData)
    Local $tRARHeaderData = DllStructCreate($tzRARHeaderData)
    Local $pRARHeaderData = DllStructGetPtr($tRARHeaderData)
    Local $tArcName = DllStructCreate("char ArcName["& $iFile+1 &"]")
    Local $pArcName = DllStructGetPtr($tArcName)

    DllStructSetData($tArcName, "ArcName", $sFile)
    DllStructSetData($tRAROpenArchiveData, "pArcName", $pArcName)

    $aRAR = DllCall($hDll, "hwnd", "RAROpenArchive", "ptr", $pRAROpenArchiveData)
    If $aRAR[0]=0 Then
        DllClose($hDll)
        Return SetError(2, DllStructGetData($tRAROpenArchiveData,"OpenResult"), True)
    EndIf

    $aRet = DllCall($hDll, "int", "RARReadHeader", "hwnd", $aRAR[0], "ptr", $pRARHeaderData)
    While $aRet[0]<>$ERAR_END_ARCHIVE
        If ($aRet[0]=$ERAR_UNKNOWN) Or BitAND(0x04, DllStructGetData($tRARHeaderData,"Flags")) Then
            $iRes = True
            ExitLoop
        EndIf

        $aRet = DllCall($hDll, "int", "RARReadHeader", "hwnd", $aRAR[0], "ptr", $pRARHeaderData)
    WEnd

    DllCall($hDll, "int", "RARCloseArchive", "hwnd", $aRAR[0])
    DllClose($hDll)
    Return $iRes
EndFunc



Время: 00:03.

Время: 00:03.
© OSzone.net 2001-