[Quote]

    Gemostarter
  • 15956
  • Longevity: 8 years 1 month
  • Posts: 323
  • REPUTATION:35

    [+] [-]
В этой теме предлагаю выкладывать скрипты на AutoIt, полезные и не очень.
Как в той теме с батниками, только AutoIt
ab
Для почина - деобфускатор строк, превращённых в вызовы функции BinaryToString(). Писалось для разборки китайской альтернативы стандартной проге установки Windows из этого сообщения. В той же теме чуть дальше выложена первая версия скрипта. Но эта версия лучше, надёжнее, и в несколько сотен раз быстрее при обработке больших файлов. Правда, 100% гарантии работоспособности деобфусцированного скрипта не даю.
Интересно, кто-нибудь рискнёт теперь выложить в теме обфускатор такого типа? ag
Opt( "MustDeclareVars", 1 )
Global $g_s_FileName
$g_s_FileName = FileOpenDialog ( "Выберите скрипт", @ScriptDir, "Скрипты AutoIt3 (*.au3)|Все файлы (*.*)" )
Global $g_s_Src
$g_s_Src = FileRead( $g_s_FileName )
Global $g_as_Src
$g_as_Src = StringSplit( $g_s_Src, @CRLF, 1 )
Global $g_i_RegExpResultsExists
Do
   $g_i_RegExpResultsExists = False
   For $i_Str = 1 To $g_as_Src[0]
      Global $g_as_ObfStrings
      $g_as_ObfStrings = StringRegExp( $g_as_Src[$i_Str], 'BinaryToString\h*\([^()]+\)', 3 )
      If @Error Then
         ContinueLoop
      EndIf
  $g_i_RegExpResultsExists = True
      For $i = 0 To UBound($g_as_ObfStrings) - 1
         Global $g_s_DeobfString
         $g_s_DeobfString = Execute( $g_as_ObfStrings[$i] )
         $g_s_DeobfString = StringReplace( $g_s_DeobfString, '"', '""' )
         $g_s_DeobfString = StringReplace( $g_s_DeobfString, @CRLF, '" & @CRLF &"'  )
         $g_s_DeobfString = StringReplace( $g_s_DeobfString, @CR, '" & @CR &"' )
         $g_s_DeobfString = StringReplace( $g_s_DeobfString, @LF, '" & @LF &"' )
         $g_s_DeobfString = '"' & $g_s_DeobfString & '"'
         $g_as_Src[$i_Str] = StringReplace( $g_as_Src[$i_Str], $g_as_ObfStrings[$i], $g_s_DeobfString, 1 )
      Next
   Next
Until Not $g_i_RegExpResultsExists
$g_s_Src = ""
For $i_Str = 1 To $g_as_Src[0]
  $g_s_Src &= $g_as_Src[$i_Str] & @CRLF
Next
Global $g_s_DeobfFileName
$g_s_DeobfFileName = StringRegExpReplace( $g_s_FileName, '^(?:.*\\)([^\\]*?)(?:\.[^.]+)?$', '\1' )
$g_s_DeobfFileName &= "_deobfuscate_"
Global $g_i_DeobfFilesCount
$g_i_DeobfFilesCount = 0
While FileExists( $g_s_DeobfFileName & $g_i_DeobfFilesCount & ".au3" )
    $g_i_DeobfFilesCount += 1
WEnd
$g_s_DeobfFileName &= $g_i_DeobfFilesCount & ".au3"
FileWrite( $g_s_DeobfFileName, $g_s_Src )

[Quote]

    nikzzzz
  • 215
  • Longevity: 10 years
  • Posts: 3114
  • REPUTATION:127

    [+] [-]
Gemostarter,
63353Интересно, кто-нибудь рискнёт теперь выложить в теме обфускатор такого типа?
Деобфускатор, написан для личных целей, выкладываю как есть.
#include <String.au3>
#include <Array.au3>
Global $sAu3Source = 'Source.au3' ;Исходник
Global $sTblNm = '' ;Кодовая таблица
ConsoleWrite('Pass 0' & @CRLF)
Global $sRg = ''
Global $iMax = 0
Global $sDelims = ''
If $sTblNm <> '' Then
  ;Поиск ключа кодовой таблицы
  $sTbl = FileRead($sTblNm, 8192)
  For $iLen = 4 To 8
    $iMax1 = $iMax
    $sDelims1 = $sDelims
    For $i = 1 To StringLen($sTbl) - $iLen - 1
      $sDelims0 = StringMid($sTbl, $i, $iLen)
      If ($sDelims0 = '20') Or ($sDelims0 = '2020') Or ($sDelims0 = '202020') Then ContinueLoop
      $sDelims0 = '(?-i)' & $sDelims0
      $iM = StringRegExp($sTbl, $sDelims0, 3, $i + $iLen)
      If @error Then ContinueLoop
      If UBound($iM) >= $iMax1 Then
        $iMax1 = UBound($iM)
        $sDelims1 = StringRight($sDelims0, $iLen)
        ConsoleWrite('?? : ' & $sDelims1 & @CRLF)
      EndIf
    Next
    If $iMax1 >= $iMax Then
      $iMax = $iMax1
      $sDelims = $sDelims1
      ConsoleWrite('++ : ' & $sDelims & @CRLF)
    Else
      ExitLoop
    EndIf
  Next
  ConsoleWrite('******** : ' & $sDelims & @CRLF)
  $asTbl = StringSplit(FileRead($sTblNm), $sDelims, 1)
EndIf
$sSrc = FileRead($sAu3Source)
$asX = StringRegExp($sSrc, '#OnAutoItStartRegister\s*"(.+)_"', 1)
If Not @error Then $sRg = $asX[0]
ConsoleWrite('******** : ' & $sRg & @CRLF)
$hf1 = FileOpen('Result.txt', 2 + 128)
$hf = FileOpen('Result.au3', 2 + 128)
FileWrite($hf, ConvXX1($sSrc))
FileClose($hf)
FileClose($hf1)
Func ConvXX1($sStr)
  Local $asX, $sRet = $sStr, $sX, $iPoint = 1
  ConsoleWrite('Pass 1' & @CRLF)
  If $sRg <> '' Then
    While 1
      $asX = StringRegExp($sRet, '(?i-s-m)((?<=[^0-9a-z_])(\$[0-9a-z_]+)\s*=\s*' & $sRg & '\(\$os\[([0-9]+)\]\)[\s,]*)', 1)
      If @error Then ExitLoop
      $iPoint = @extended
      $sRet = StringLeft($sRet, $iPoint - StringLen($asX[0]) - 1) & StringMid($sRet, $iPoint)
      $sRet = StringRegExpReplace($sRet, RegStr($asX[1]), "'" & RegStr1(Hex2Str($asTbl[$asX[2]])) & "'")
    WEnd
    $sRet = StringRegExpReplace($sRet, "Number\('\s*([0-9]+)\s*\'\)", '\1')
  EndIf
  ConsoleWrite('Pass 2' & @CRLF)
  $sRet = ConvXX2($sRet)
  While 1
    $asX = StringRegExp($sRet, "(?i)(BinaryToString\(['""](0x[0-9a-f]+)['""]\s*,*\s*([0-9]+)\))", 1)
    If @error Then ExitLoop
    $iPoint = @extended
    $sRet = StringLeft($sRet, $iPoint - StringLen($asX[0]) - 1) & "'" & BinaryToString($asX[1], $asX[2]) & "'" & StringMid($sRet, $iPoint)
    FileWrite($hf1, BinaryToString($asX[1], $asX[2]) & @CRLF)
  WEnd
  ConsoleWrite('Pass 3' & @CRLF)
  While 1
    $asX = StringRegExp($sRet, "(?i)(BinaryToString\(['""](0x[0-9a-f]+)['""]\))", 1)
    If @error Then ExitLoop
    $iPoint = @extended
    $sRet = StringLeft($sRet, $iPoint - StringLen($asX[0]) - 1) & "'" & BinaryToString($asX[1]) & "'" & StringMid($sRet, $iPoint)
  WEnd
  $sRet = StringRegExpReplace($sRet, "(?i)Execute\('\s*(@[a-z0-9_]+)\s*\'\)", '\1')
  $sRet = StringRegExpReplace($sRet, "(?i)(Global\s*)+", '\1')
  ConsoleWrite('****    Completed    ****' & @CRLF)
  Return $sRet
EndFunc   ;==>ConvXX1
Func ConvXX2($sStr)
  Local $asX, $sRet = $sStr, $sX
  $asX = StringRegExp($sStr, '(?i)(Execute\s*\(\s*binaryToString\(\s*["'']\s*(0x.*)["'']\)\s*\))', 1)
  If @error Then
    SetError(1)
    Return $sRet
  EndIf
  $sX = StringStripWS(BinaryToString($asX[1]), 3)
  $sRet = StringReplace($sStr, $asX[0], $sX, 1, 1)
  SetError(0)
  Return ConvXX2($sRet)
EndFunc   ;==>ConvXX2
Func Hex2Str($sStr)
  Local $sRet = ''
  For $x = 1 To StringLen($sStr) Step 2
    $sRet &= Chr(Dec(StringMid($sStr, $x, 2)))
  Next
  Return $sRet
EndFunc   ;==>Hex2Str
Func a2900403044($a2900403044)
  Local $a2900403044_
  For $x = 1 To StringLen($a2900403044) Step 2
    $a2900403044_ &= Chr(Dec(StringMid($a2900403044, $x, 2)))
  Next
  Return $a2900403044_
EndFunc   ;==>a2900403044
Func RegStr($sStr)
  Return StringRegExpReplace($sStr, "[\\\.\(\)\{\}\*\+\?\$\[\]]", "\\\0")
EndFunc   ;==>RegStr
Func RegStr1($sStr)
  Return StringRegExpReplace(StringRegExpReplace($sStr, "[\\\$]", "\\\0"), "'", "''")
EndFunc   ;==>RegStr1

[Quote]

    Xemom1
  • 175
  • Longevity: 10 years
  • Posts: 862
  • REPUTATION:88

    [+] [-]
nikzzzz,
Результат одинаков, разница в кавычках: ar
DllStructSetData($323738352d3032, "Text", $323639372d3032)
  DllStructSetData($323735302d3032, "Mask", $323738362d3032)
  DllStructSetData($323735302d3032, "Item", $323635342d3032)
  DllStructSetData($323735302d3032, "SubItem", $313735302d3032)
  DllStructSetData($323735302d3032, "Image", $323738322d3032)
DllStructSetData($323738352d3032, 'Text', $323639372d3032)
  DllStructSetData($323735302d3032, 'Mask', $323738362d3032)
  DllStructSetData($323735302d3032, 'Item', $323635342d3032)
  DllStructSetData($323735302d3032, 'SubItem', $313735302d3032)
  DllStructSetData($323735302d3032, 'Image', $323738322d3032)

[Quote]

    nikzzzz
  • 215
  • Longevity: 10 years
  • Posts: 3114
  • REPUTATION:127

    [+] [-]
Xemom1, aa
63375Результат одинаков, разница в кавычках:
Так это естественно, оба скрипта выполнили свою задачу.
Но, возможно, при деобфускации другого скрипта могут возникнуть ошибки, сто процентной гарантии гарантии нет, два решения позволят отловить ошибку.

[Quote]

    nikzzzz
  • 215
  • Longevity: 10 years
  • Posts: 3114
  • REPUTATION:127

    [+] [-]
63353Интересно, кто-нибудь рискнёт теперь выложить в теме обфускатор такого типа?
Китайская версия Autoit с обфускатором.

[Quote]

    nikzzzz
  • 215
  • Longevity: 10 years
  • Posts: 3114
  • REPUTATION:127

    [+] [-]
Небольшая библиотека, написана под себя, может кому пригодится.
#include-once
; #FUNCTION# ====================================================================================================================================
; Name...........: _ParsePath
; Description ...: Разбор пути файла
; Syntax.........: _ParsePath($sFile, $sStr [, $iFlag = 1])
; Parameters ....: $sFile - путь к файлу
;                  $sStr - шаблон, %d - диск, %p - путь, %n - имя, %x - расширение включая точку, %y - расширение без точки, %- удаляет последний символ, например "\" из пути.
;                  $iFlag - 1 - преобразует путь в полный, 2 - разворачивает переменные %var% , 4 - разворачивает переменные $var
; Author ........: Nikzzzz
; Examples ......: ConsoleWrite(_ParsePath("%SystemRoot%\system32\notepad.exe", "** %d%p%n%x  **" & @crlf,7))
; ===============================================================================================================================================
Func _ParsePath($sFile, $sStr, $iFlag = 1)
  Local $i, $sRet = '', $sDrive = '', $sPath = '', $sName = '', $vTemp
  If $sFile = 'con:' Or $sFile = 'con' Then Return $sFile
  If BitAND($iFlag, 2) Then
    $vTemp = Opt('ExpandEnvStrings', 1)
    $sFile = $sFile
    Opt('ExpandEnvStrings', $vTemp)
  EndIf
  If BitAND($iFlag, 4) Then
    $vTemp = Opt('ExpandVarStrings', 1)
    $sFile = $sFile
    Opt('ExpandVarStrings', $vTemp)
  EndIf
  If BitAND($iFlag, 1) Then
    $vTemp = DllCall('kernel32.dll', 'dword', 'GetFullPathNameW', 'wstr', $sFile, 'dword', 4096, 'wstr', '', 'ptr', 0)
    If Not (@error Or Not $vTemp[0]) Then $sFile = $vTemp[3]
  EndIf
  If StringInStr($sFile, ':') Then
    $sDrive = _StringLeftStr($sFile, ':') & ':\'
    $sFile = _StringRightStr($sFile, ':')
  EndIf
  Local $sExt = '.' & _StringRightStr($sFile, '.', -1)
  If $sExt = '.' Then $sExt = ''
  If StringInStr($sExt, '\') Then $sExt = ""
  $sFile = StringTrimRight($sFile, StringLen($sExt))
  If StringLeft($sFile, 1) = '\' Then $sFile = StringTrimLeft($sFile, 1)
  If StringInStr($sFile, '\') Then
    $sPath = _StringLeftStr($sFile, '\', -1) & '\'
    $sName = _StringRightStr($sFile, '\', -1)
  Else
    $sName = $sFile
  EndIf
  While StringLen($sStr)
    If StringLeft($sStr, 1) = '%' Then
      $sStr = StringTrimLeft($sStr, 1)
      Switch StringLeft($sStr, 1)
        Case 'd'
          $sRet &= $sDrive
        Case 'p'
          $sRet &= $sPath
        Case 'n'
          $sRet &= $sName
        Case 'x'
          $sRet &= $sExt
        Case 'y'
          $sRet &= StringTrimLeft($sExt, 1)
        Case '-'
          $sRet = StringTrimRight($sRet, 1)
        Case Else
          $sRet &= StringLeft($sStr, 1)
      EndSwitch
    Else
      $sRet &= StringLeft($sStr, 1)
    EndIf
    $sStr = StringTrimLeft($sStr, 1)
  WEnd
  Return SetError(0, 0, $sRet)
EndFunc   ;==>_ParsePath
; #FUNCTION# ====================================================================================================================================
; Name...........: _StringLeftStr
; Description ...: Возвращает левую часть строки $Str относительно $sStr, $iFlag - номер вхождения подстроки $sStr, если он отрицательный, ищется с конца строки.
; Syntax.........: _StringLeftStr($Str, $sStr [, $iFlag = 1])
; Author ........: Nikzzzz
; Examples ......: ConsoleWrite(_StringLeftStr("C:\Windows\system32\notepad.exe","\",-1) & @crlf)
; ===============================================================================================================================================
Func _StringLeftStr($Str, $sStr, $iFlag = 1)
  If StringInStr($Str, $sStr, 0, $iFlag) Then
    Return StringLeft($Str, StringInStr($Str, $sStr, 0, $iFlag) - 1)
  EndIf
  Return $Str
EndFunc   ;==>_StringLeftStr
; #FUNCTION# ====================================================================================================================================
; Name...........: _StringRightStr
; Description ...: Возвращает правую часть строки $Str относительно $sStr, $iFlag - номер вхождения подстроки $sStr, если он отрицательный, ищется с конца строки.
; Syntax.........: _StringRightStr($Str, $sStr [, $iFlag = 1])
; Author ........: Nikzzzz
; Examples ......: ConsoleWrite(_StringRightStr("C:\Windows\system32\notepad.exe","\",-1) & @crlf)
; ===============================================================================================================================================
Func _StringRightStr($Str, $sStr, $iFlag = 1)
  If StringInStr($Str, $sStr, 0, $iFlag) Then
    Return StringMid($Str, StringInStr($Str, $sStr, 0, $iFlag) + StringLen($sStr))
  EndIf
  Return ''
EndFunc   ;==>_StringRightStr
; #FUNCTION# ====================================================================================================================================
; Name...........: _EmptyName
; Description ...: Генерирует не занятое имя файлана на основе шаблона
; Syntax.........: _EmptyName($sFile)
; Author ........: Nikzzzz
; Examples ......: ConsoleWrite(_EmptyName("C:\Windows\system32\notepad.exe") & @crlf)
; ===============================================================================================================================================
Func _EmptyName($sFile)
  If FileExists($sFile) = 0 Then Return $sFile
  Local $i = 1, $sFile1
  While 1
    $sFile1 = _ParsePath($sFile, '%d%p%n[' & $i & ']%x')
    If FileExists($sFile1) = 0 Then Return $sFile1
    $i += 1
  WEnd
EndFunc   ;==>_EmptyName
; #FUNCTION# ====================================================================================================================================
; Name...........: _EscChar
; Description ...: Преобразует строку в формат регулярных выражений
; Syntax.........: _EscChar($sStr)
; Author ........: Nikzzzz
; Examples ......: ConsoleWrite(_EscChar("C:\Windows\system32\notepad.exe") & @crlf)
; ===============================================================================================================================================
Func _EscChar($sStr)
  Return StringRegExpReplace($sStr, '[][{}()*+?.\\^$|]', '\\\0')
EndFunc   ;==>_EscChar
; #FUNCTION# ====================================================================================================================================
; Name...........: _FileRead
; Description ...: Чтение файла
; Syntax.........: _FileRead($sFile, $iMode = 0)
; Author ........: Nikzzzz
; ===============================================================================================================================================
Func _FileRead($sFile, $iMode = 0)
  Local $vData
  If $sFile = 'con:' Or $sFile = 'con' Then
    $vData = ConsoleRead()
  Else
    Local $hF = FileOpen($sFile, $iMode)
    Local $vData = FileRead($hF)
    FileClose($hF)
  EndIf
  Return $vData
EndFunc   ;==>_FileRead
; #FUNCTION# ====================================================================================================================================
; Name...........: _FileRead
; Description ...: Запись в файл
; Syntax.........: _FileRead($sFile, $iMode = 0)
; Author ........: Nikzzzz
; ===============================================================================================================================================
Func _FileWrite($sFile, $vData, $iMode = 2)
  If $sFile = 'con:' Or $sFile = 'con' Then
    ConsoleWrite($vData)
  Else
    Local $hF = FileOpen($sFile, $iMode)
    FileWrite($hF, $vData)
    FileClose($hF)
  EndIf
EndFunc   ;==>_FileWrite
; #FUNCTION# ====================================================================================================================================
; Name...........: _StringRegExp5
; Description ...: Возвращает первое вхождение регулярного выражения
; Syntax.........: _StringRegExp5($sStr, $sStr1, $iOffset = 1)
; Author ........: Nikzzzz
; ===============================================================================================================================================
Func _StringRegExp5($sStr, $sStr1, $iOffset = 1)
  Local $sRet = '', $asStr = StringRegExp($sStr, '(?im-s)' & $sStr1, 1, $iOffset)
  If @error Then Return SetError(1, 0, '')
  Return SetError(0, 0, $asStr[0])
EndFunc   ;==>_StringRegExp5
; #FUNCTION# ====================================================================================================================================
; Name...........: _StringRegExpReplaceEx
; Description ...: Расширенный вариант StringRegExpReplace, в качестве строки замену может использоваться функция
; Syntax.........: _StringRegExpReplaceEx($sStr, $sPattern, $sFunc, $sReplace [, $iCount = 0])
; Author ........: Nikzzzz
; Examples ......:
;ConsoleWrite(_StringRegExpReplaceEx("a=2,b=3,c=4", ".*=(\d+).*=(\d+).*=(\d+)", "_Mult", "\1,\2,\3") & @CRLF)
;Func _Mult($sStr)
;  Local $aStr = StringSplit($sStr, ",", 2)
;  Return $aStr[0] & '*' & $aStr[1] & '*' & $aStr[2] & '=' & $aStr[0] * $aStr[1] * $aStr[2]
;EndFunc   ;==>Mult
; ===============================================================================================================================================
Func _StringRegExpReplaceEx($sStr, $sPattern, $sFunc, $sReplace, $iCount = 0)
  If $iCount = 0 Then $iCount = -1
  Local $vTmp, $sRes = '', $iOffset, $i, $sSym, $sSym1, $sFlag = '', $sStr3, $sStr4
  While 1
    $vTmp = StringRegExp($sStr, $sPattern, 2)
    If @error Then ExitLoop
    $iOffset = @extended
    $sRes &= StringLeft($sStr, $iOffset - StringLen($vTmp[0]) - 1)
    $sFlag = ''
    $sStr3 = $sReplace
    $sStr4 = ''
    While StringLen($sStr3)
      $sSym = StringLeft($sStr3, 1)
      If $sFlag = '' Then
        Switch $sSym
          Case '\'
            $sFlag = $sSym
          Case Else
            $sStr4 &= $sSym
        EndSwitch
      Else
        Select
          Case StringInStr('0123456789', $sSym)
            If UBound($vTmp) > $sSym Then
              $sStr4 &= $vTmp[$sSym]
            EndIf
          Case Else
            $sStr4 &= $sSym
        EndSelect
        $sFlag = ''
      EndIf
      $sStr3 = StringTrimLeft($sStr3, 1)
    WEnd
    $sRes &= Call($sFunc, $sStr4)
    $sStr = StringMid($sStr, $iOffset)
    $iCount -= 1
    If $iCount = 0 Then ExitLoop
  WEnd
  $sRes &= $sStr
  Return $sRes
EndFunc   ;==>_StringRegExpReplaceEx
; #INDEX# =======================================================================================================================
; Title .........: FileFind
; AutoIt Version : 3.2.3++
; Language ......: Русский
; Description ...: Поиск файлов, включая подкаталоги, синтаксис и возвращаемое значение в основном совпадают с FileFindFirstFile()
;                  и FileFindNextFile()
;                  в _FileFindFirstFile("filename" [,flag][,MaxLevel]) добавлены необязатенльные параметры
;                  flag=1 - поиск файлов
;                  flag=2 - поиск каталогов
;                  flag=4 - поиск по иаске регулярного выражения (перед именем файла "\" должжна удваиваться)
;                  flag=8 -  _FileFindNextFile выводит полный путь, вместо относительного, по умолчанию flag=3
;                  MaxLevel - максимальный уровень вложенности подкаталоглв, по умолчанию MaxLevel=9999
; Author(s) .....: Nikzzzz
; ===============================================================================================================================
Func _FileFindFirstFile($sFile, $iMode = 3, $iLevels = 9999)
  Local $avStack[6]
  $avStack[0] = 4
  $avStack[2] = $iMode
  $avStack[3] = $iLevels
  If Not BitAND($iMode, 4) Then
    $avStack[1] = StringMid($sFile, StringInStr($sFile, "\", 0, -1) + 1)
    $avStack[1] = StringRegExpReplace($avStack[1], "[\\\(\)\{\}\+\$\.]", "\\\0")
    $avStack[1] = StringReplace($avStack[1], "*", ".*")
    $avStack[1] = StringReplace($avStack[1], "?", ".")
    $avStack[4] = StringLeft($sFile, StringInStr($sFile, "\", 0, -1) - 1)
  Else
    $avStack[1] = StringMid($sFile, StringInStr($sFile, "\\", 0, -1) + 2)
    $avStack[4] = StringLeft($sFile, StringInStr($sFile, "\\", 0, -1) - 1)
  EndIf
  $avStack[5] = FileFindFirstFile($avStack[4] & "\*.*")
  If $avStack[5] = -1 Then
    SetError(1)
    Return -1
  EndIf
  Return $avStack
EndFunc   ;==>_FileFindFirstFile
Func _FileFindNextFile(ByRef $avStack)
  Local $sFindFile, $sFindFileFulName
  While 1
    $sFindFile = FileFindNextFile($avStack[$avStack[0] + 1])
    If Not @error Then
      If @extended Then
        $sFindFileFulName = $avStack[$avStack[0]] & "\" & $sFindFile
        If ($avStack[0] - 4) / 2 < $avStack[3] Then
          $avStack[0] += 2
          ReDim $avStack[$avStack[0] + 2]
          $avStack[$avStack[0]] = $sFindFileFulName
          $avStack[$avStack[0] + 1] = FileFindFirstFile($avStack[$avStack[0]] & "\*.*")
        EndIf
        If StringRegExpReplace($sFindFile, "(?i)" & $avStack[1], "", 1) = "" And BitAND($avStack[2], 2) Then
          If BitAND($avStack[2], 8) Then
            Return $sFindFileFulName
          Else
            Return StringMid($sFindFileFulName, StringLen($avStack[4]) + 2)
          EndIf
        EndIf
        ContinueLoop
      Else
        If StringRegExpReplace($sFindFile, "(?i)" & $avStack[1], "", 1) = "" And BitAND($avStack[2], 1) Then
          If BitAND($avStack[2], 8) Then
            Return $avStack[$avStack[0]] & "\" & $sFindFile
          Else
            Return StringMid($avStack[$avStack[0]] & "\" & $sFindFile, StringLen($avStack[4]) + 2)
          EndIf
        EndIf
        ContinueLoop
      EndIf
    Else
      If $avStack[0] = 4 Then
        SetError(-1)
        Return ""
      Else
        FileClose($avStack[$avStack[0] + 1])
        $avStack[0] -= 2
        ReDim $avStack[$avStack[0] + 2]
      EndIf
    EndIf
  WEnd
EndFunc   ;==>_FileFindNextFile
Func _FileFindClose(ByRef $avStack)
  Local $iRetVaue
  While $avStack[0] >= 4
    $iRetVaue = FileClose($avStack[$avStack[0] + 1])
    $avStack[0] -= 2
  WEnd
  ReDim $avStack[1]
  Return $iRetVaue
EndFunc   ;==>_FileFindClose

[Quote]

    Xemom1
  • 175
  • Longevity: 10 years
  • Posts: 862
  • REPUTATION:88

    [+] [-]
Попробовал перевести от китайцев.
Install и backup Windows:
https://yadi.sk/d/XX9ha2cLzUiuUA
Хотелось бы сделать поиск по маске: install*.wim,esd,swm

[Quote]

    AZJIO
  • 17953
  • Longevity: 7 years 2 months
  • Posts: 1321
  • REPUTATION:127

    [+] [-]
Xemom1, Melda включил в поиск возможность использовать в качестве маски регулярное выражение, впрочем как и я но на старой версии 3.3.8.1. Тогда поиск заключается лишь правильном рег.выре (install.*?\.wim|.*?\.(esd|swm))
#include <Array.au3> ; для _ArrayDisplay
#include <FileOperations.au3>
$timer = TimerInit()
$aFileList = _FO_FileSearch('D:', '(install.*?\.wim|.*?\.(?:esd|swm))', True, 125, 1, 1, 3)
If @error Then MsgBox(0, 'Сообщение', @error)
$timer = Round(TimerDiff($timer) / 1000, 2) & ' сек'
_ArrayDisplay($aFileList, $timer & ' - время поиска')
FileConstants.au3 для 3.3.8.1 (на 3.3.14.3 работать не будет)
кстати, для адаптации регвыров, чтобы старые работали на новой версии без переписывания всего вроде сказали надо в начале каждого регвыра поставить (CRLF), то есть обозначить перенос строк 2-мя символами, так как сейчас он является комбинацией из 3-х вариантов CRLF, CR, LF. Это надо делать кончено же в исходнике, а не в поисковой строке. Без этого моя UDF возвращает файлы с переносом строк на конце, с CR


Display posts:    

Current time is: 28-Apr 04:56

All times are UTC + 3


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum