|
В этой теме предлагаю выкладывать скрипты на AutoIt, полезные и не очень.
Как в той теме с батниками, только AutoIt Для почина - деобфускатор строк, превращённых в вызовы функции BinaryToString(). Писалось для разборки китайской альтернативы стандартной проге установки Windows из этого сообщения. В той же теме чуть дальше выложена первая версия скрипта. Но эта версия лучше, надёжнее, и в несколько сотен раз быстрее при обработке больших файлов. Правда, 100% гарантии работоспособности деобфусцированного скрипта не даю. Интересно, кто-нибудь рискнёт теперь выложить в теме обфускатор такого типа? 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 ) |
Отправлено: 12-Мар-2019 16:13
(спустя 1 час 44 минуты)
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 |
Отправлено: 12-Мар-2019 17:00
(спустя 47 минут)
nikzzzz,
Результат одинаков, разница в кавычках: 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) |
Отправлено: 12-Мар-2019 18:32
(спустя 1 час 32 минуты)
Xemom1,
63375Результат одинаков, разница в кавычках: Но, возможно, при деобфускации другого скрипта могут возникнуть ошибки, сто процентной гарантии гарантии нет, два решения позволят отловить ошибку. |
Отправлено: 12-Мар-2019 19:29
(спустя 56 минут)
63353Интересно, кто-нибудь рискнёт теперь выложить в теме обфускатор такого типа? |
Отправлено: 13-Мар-2019 02:35
(спустя 7 часов)
Небольшая библиотека, написана под себя, может кому пригодится.
#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 |
Отправлено: 13-Мар-2019 09:28
(спустя 6 часов)
Попробовал перевести от китайцев.
Install и backup Windows: https://yadi.sk/d/XX9ha2cLzUiuUA Хотелось бы сделать поиск по маске: install*.wim,esd,swm |
Отправлено: 13-Мар-2019 15:36
(спустя 6 часов)
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 & ' - время поиска') кстати, для адаптации регвыров, чтобы старые работали на новой версии без переписывания всего вроде сказали надо в начале каждого регвыра поставить (CRLF), то есть обозначить перенос строк 2-мя символами, так как сейчас он является комбинацией из 3-х вариантов CRLF, CR, LF. Это надо делать кончено же в исходнике, а не в поисковой строке. Без этого моя UDF возвращает файлы с переносом строк на конце, с CR |
Текущее время: 15-Дек 17:51
Часовой пояс: UTC + 3
Вы не можете начинать темы
Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы |