Что нового

[Файловая система] Функция для анализа ini

Статус
Закрыто для дальнейших ответов.

scenarist

AUTOIT-FOREVER
Сообщения
7
Репутация
0
<b>Доброго времени суток! Требуется написать функцию для анализа файлов autorun.inf.</b>

Функция должна извлекать из строк типа

<b>"cmd /c wscript isivgr\,., -autorun""</b>
<b>"cmd start wscript.\ceoiuq\,., -autorun""</b>
<b>"cmd /c "twiuepoit\,., -autorun""</b>
<b>"cmd /c "start explorer .\ &start wscript recycler\,., -autorun""</b>
<b>"cmd /c start wscript .\recycler\,., -autorun""</b>
<b>"cmd /c "start wscript.\recycler\,., -autorun""</b>

имя файла(в данном случае-скрипт без имени и расширения)-,.,

Имена всех каталогов и исполняемых файлов(\recycler\,.,)-рандомные, может быть любое имя.

возможно ли написать универсальную функцию для анализа обфусцированных inf ?
 

XpycT

Скриптер
Сообщения
380
Репутация
133
как вариант можно сделать так
Код:
$sAutorunInf = @ScriptDir & "\Autorun.inf"

$aSection = IniReadSection($sAutorunInf, "autorun")

For $i = 1 To $aSection[0][0]
	$iPos = StringInStr($aSection[$i][1], "recycler")

	If StringMid($aSection[$i][1], $iPos - 2, 2) = ".\" Then
		$aSection[$i][1] = StringStripWS(StringMid($aSection[$i][1], $iPos - 2, StringLen($aSection[$i][1]) - $iPos - 2), 1 + 2)
	ElseIf $iPos = 1 Then
		$aSection[$i][1] = StringStripWS($aSection[$i][1], 1 + 2)
	Else
		$aSection[$i][1] = StringStripWS(StringMid($aSection[$i][1], $iPos - 1, StringLen($aSection[$i][1]) - $iPos - 1), 1 + 2)
	EndIf

	$iPos = StringInStr($aSection[$i][1], "-")
	If StringMid($aSection[$i][1], $iPos - 1, 1) = " " Then $aSection[$i][1] = StringStripWS(StringMid($aSection[$i][1], 1, $iPos - 1), 1 + 2)

	$iPos = StringInStr($aSection[$i][1], "&")
	If StringMid($aSection[$i][1], $iPos - 1, 1) = " " Then $aSection[$i][1] = StringStripWS(StringMid($aSection[$i][1], 1, $iPos - 1), 1 + 2)

	$iPos = StringInStr($aSection[$i][1], ">")
	If StringMid($aSection[$i][1], $iPos - 1, 1) = " " Then $aSection[$i][1] = StringStripWS(StringMid($aSection[$i][1], 1, $iPos - 1), 1 + 2)

	MsgBox(0, "", $aSection[$i][0] & " = " & $aSection[$i][1])
Next
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
scenarist,
Не знаю, правильно ли, но с Вашими примерами строк у меня работает:
Код:
$sFile = 'G:\Autorun.inf'
Dim $aString[6] = [5, ' cmd  /c .\recycler\qwerty\1.jpg -autoplay', _
		' recycler\qwerty\1.jpg -autoplay            ', _
		' cmd  /c explorer.\ & start recycler\qwerty\1.jpg & exit', _
		' cmd  /c "cmd /c \recycler\qwerty\1.jpg -autoplay" & exit', _
		' cmd  /c echo start .\recycler\1.exe >> 1.bat & start 1.bat & exit']

$sPattern = '.*?(recycler.*?\.\w{2,4})\W?.*'
For $i = 1 To $aString[0]
	ConsoleWrite(StringLeft($sFile, 3) & StringRegExpReplace($aString[$i], $sPattern, '$1') & @LF)
Next
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Ещё вариант:
Код:
#include <Array.au3>

$OpenINI = FileOpenDialog('Choose INI file', '', 'INI file (*.ini)')
$ReadINI = FileRead($OpenINI)

$RegExpRep1 = StringRegExpReplace($ReadINI, '(?s)\[autorun\]\r\nshellexecute=', '')
$RegExpRep2 = StringRegExpReplace($RegExpRep1, '(\r\n){2,}', @CR)
$Split = StringSplit($RegExpRep2, @CR)

_ArrayDisplay($Split)



А вот вариант в виде функции:
Код:
#include <Array.au3>

$OpenINI = FileOpenDialog('Choose INI file', '', 'INI file (*.ini)', '', '', GUICreate(''))
if @error Then Exit
$Analyze = _AnalyzeINI($OpenINI)
_ArrayDisplay($Analyze, 'Analyze INI File')

Func _AnalyzeINI($INI)
	$oINI = FileOpen($INI)
	$rINI = FileRead($oINI)
	$aExp1 = StringRegExpReplace($rINI, '(?s)\[autorun\]\r\nshellexecute=', '')
	$aExp2 = StringRegExpReplace($aExp1, '(\r\n){2,}', @CR)
	$aINI = StringSplit($aExp2, @CR)
	FileClose($oINI)
	Return $aINI
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
scenarist,
Вы поменяли текст в первом посте. Мне не понятно, какие конкретно имена надо выдернуть из этих шести строк.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Допустим, C:\windows\system32\cmd.exe /c recycler\,.exe -autoplay

остаться должно: recycler\,.exe
Код:
$RegExp = StringRegExp('C:\windows\system32\cmd.exe /c recycler\,.exe -autoplay', '(?s)/c (.*?) -', 3)
MsgBox(0, 'Test', $RegExp[0])
 
Статус
Закрыто для дальнейших ответов.
Верх