[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 7 лет 1 месяц
  • Сообщений: 324
  • Репутация: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 )

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 3 месяца
  • Сообщений: 3114
  • Репутация: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

[Цитировать]

    Xemom1
  • 175
  • Стаж: 9 лет 3 месяца
  • Сообщений: 862
  • Репутация: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)

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 3 месяца
  • Сообщений: 3114
  • Репутация:127

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

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 3 месяца
  • Сообщений: 3114
  • Репутация:127

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

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 3 месяца
  • Сообщений: 3114
  • Репутация: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

[Цитировать]

    Xemom1
  • 175
  • Стаж: 9 лет 3 месяца
  • Сообщений: 862
  • Репутация:88

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

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 2 месяца
  • Сообщений: 1285
  • Репутация:126

    [+] [-]
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


Показать сообщения:    

Текущее время: 26-Апр 09:52

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы