Что нового

Не правильно составленное условие (BinObfuscate)

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Помогите пожалуйста,сделал аналог Обфускатора (пока простенький) он работает но только если в самом скрипте который нужно Обфусцировать написанно так:

Код:
$hOpen = FileOpen("File")
$hRead = FileRead($hOpen)


Но если написать так:

Код:
$hOpen = FileRead(FileOpen("File"),100)


То получается код не рабочим и в выходном файле пропишется

Код:
$hOpen = Execute($A5856456 ;,Execute($A9078785)) ; FileRead(FileOpen("File"),100)


Пример Обфускатора:
Код:
$aAu3 = au3CreateTemp(@ScriptDir & "\Опыт.au3")
If $aAu3 <> "" Then
	BinObfuscate($aAu3, @ScriptDir & "\au3FunctionIt.a3f")
EndIf

Func au3CreateTemp($sAu3Scrypt)

	Global $sResult
	Global $sAu3Temp

	$sAu3Open = FileOpen($sAu3Scrypt)
	$sAu3Name = StringTrimRight($sAu3Scrypt, 4)
	$tagRANDOM = Round(Random(1000, 9999))
	
	While 1
		$sAu3Read = FileReadLine($sAu3Open)
		If @error <> 0 Then ExitLoop
		$sAu3Quotes = StringRegExp($sAu3Read, '("[^"]*"|''[^'']*'')', 3)
		For $i = 0 To UBound($sAu3Quotes) - 1
			$sAu3Read = StringReplace($sAu3Read, $sAu3Quotes[$i], '~Quote_' & $i)
		Next

		$sAu3Split = StringRegExp($sAu3Read, '(?!>")([^\h]+)(?!")', 3)
		For $i = 0 To UBound($sAu3Split) - 1
			If StringInStr($sAu3Split[$i], '~Quote_') Then
				For $j = 0 To UBound($sAu3Quotes) - 1
					$sAu3Split[$i] = StringReplace($sAu3Split[$i], '~Quote_' & $j, $sAu3Quotes[$j])
				Next
			EndIf
			$sAu3Temp &= $sAu3Split[$i] & "{Delimiters}" & @CRLF
		Next
		$sAu3Temp &= "{NewLine}" & @CRLF
	WEnd
	FileClose($sAu3Open)

	$aAu3Split = StringSplit($sAu3Temp, @CRLF, 1)
	$sAu3Src = ""
	For $i = 1 To $aAu3Split[0]
		If StringInStr($aAu3Split[$i], "{NewLine}") Then
			$sAu3Src &= StringReplace($aAu3Split[$i], "{NewLine}", @CRLF)
		Else
			$sAu3Src &= $aAu3Split[$i]
		EndIf
	Next

	FileWrite($sAu3Name & "_tmp" & $tagRANDOM & ".tmp", $sAu3Src)
	$sResult = $sAu3Name & "_tmp" & $tagRANDOM & ".tmp"

	Return $sResult

EndFunc   ;==>au3CreateTemp

Func BinObfuscate($sAu3File, $sApfFile)

	Global $aResult
	Global $aAu3Temp
	Global $aAu3Numb = Round(Random(1000000,9999999))
	Global $aFunc = "A" & Round(Random(10000000,99999999))
	Global $aMask = "$A" & Round(Random(100000000,999999999))
	Global $String = "S" & Round(Random(100000000,999999999))
	Global $Global

	$aAu3Open = FileOpen($sAu3File)
	$aApfOpen = FileOpen($sApfFile)
	$aApfRead = FileRead($aApfOpen)
	$aAu3Name = StringTrimRight($sAu3File, 12)
	
	While 1
		$aAu3Read = FileReadLine($aAu3Open)
		If @error = -1 Then ExitLoop
		If StringRegExp(" ", $aAu3Read) = 0 Then
			$oSplit = StringSplit($aAu3Read, "{Delimiters}", 1)
			For $i = 1 To $oSplit[0] Step 1
				$ApfSplit = StringSplit($aApfRead, @CRLF, 1)
				For $v = 1 To $ApfSplit[0] Step 1
					If StringInStr($oSplit[$i], $ApfSplit[$v]) = 1 Then
						$Data = StringReverse(StringTrimleft(StringLower(StringToBinary($oSplit[$i] & Asc("A"))),2))
						$Global &= "Global $A" & $aAu3Numb  & " = " & $aFunc & "(" & '"{' & $Data & '}")' & @CRLF
						$aAu3Temp &= 'Execute(' & "$A" & $aAu3Numb & ')' & ";"
					EndIf					
				Next
				If StringInStr($oSplit[$i], "") = 0 Then
					$aAu3Temp &= $oSplit[$i] & " "
				EndIf	
			Next
			$aAu3Numb = $aAu3Numb + Round(Random(10,999))
			$aAu3Temp &= @CRLF
		EndIf
	WEnd

	FileClose($aAu3Open)
	FileClose($aApfOpen)
	FileDelete($sAu3File)
	
	$Comp = "If " & "Execute(" & $aFunc & "('{" & StringReverse(StringTrimleft(StringLower(StringToBinary("@Compiled = 0" & Asc("A"))),2)) & "}')" & ")" & " Then" & @CRLF & _
			"Execute(" & $aFunc & "('{" & StringReverse(StringTrimleft(StringLower(StringToBinary("FileWrite(FileOpen(@ScriptFullPath,2),'')" & Asc("A"))),2)) & "}')" & ")" & @CRLF & _			   
			"Exit" & @CRLF & _
			"EndIf"

	$Hash = "Func " & $aFunc & "($H0478647387) " & @CRLF & _
	        "$H6785478567 = Execute(BinaryToString('0x537472696E677472696D5269676874282448303437383634373338372C3129'))" & @CRLF & _
			"$H4725363472 = Execute(BinaryToString('0x537472696E677472696D4C656674282448363738353437383536372C3129'))" & @CRLF & _
			"$H6943745773 = " & $String & "($H4725363472)" & @CRLF & _
			"$H8972836478 = Execute(BinaryToString('0x42696E617279546F537472696E6728223078222624483639343337343537373329'))" & @CRLF & _
			"$H4629867354 = Execute(BinaryToString('0x537472696E677472696D5269676874282448383937323833363437382C3229'))" & @CRLF & _
			"Return $H4629867354" & @CRLF & _
			"EndFunc" & @CRLF & _ 
			"Func " & $String & "($S7683965374)" & @CRLF & _	
			"Local $S4567456758 = Execute(BinaryToString('0x537472696E674C656E2824533736383339363533373429'))" & @CRLF & _
			"If $S4567456758 < 1 Then Return Execute(BinaryToString('0x5365744572726F7228312C302C222229'))" & @CRLF & _
			"Local $S5627453526 = Execute(BinaryToString('0x446C6C5374727563744372656174652822636861725B22262453343536373435363735382B3126225D2229'))" & @CRLF & _
			"Execute(BinaryToString('0x446C6C53747275637453657444617461282453353632373435333532362C312C24533736383339363533373429'))" & @CRLF & _
			"Local $S6383286437 = Execute(BinaryToString('0x446C6C43616C6C28226D73766372742E646C6C222C227074723A636465636C222C225F737472726576222C22707472222C446C6C537472756374476574507472282453353632373435333532362929'))" & @CRLF & _
			"If @error Or $S6383286437[0] = 0 Then Return Execute(BinaryToString('0x5365744572726F7228322C302C222229'))" & @CRLF & _
			"Return Execute(BinaryToString('0x446C6C53747275637447657444617461282453353632373435333532362C3129'))" & @CRLF & _
			"EndFunc"

	FileWrite($aAu3Name & "_BinObfuscate.au3", $Comp & @CRLF & $Global & $aAu3Temp & $Hash)
	
	
	
	Return $aResult
	
EndFunc   ;==>BinObfuscate

Func StringReverse($S7683965374)
	Local $S4567456758 = StringLen($S7683965374)
	If $S4567456758 < 1 Then Return SetError(1, 0, "")
	Local $S5627453526 = DllStructCreate("char[" & $S4567456758 + 1 & "]")
	DllStructSetData($S5627453526, 1, $S7683965374)
	Local $S6383286437 = DllCall("msvcrt.dll", "ptr:cdecl", "_strrev", "ptr", DllStructGetPtr($S5627453526))
	If @error Or $S6383286437[0] = 0 Then Return SetError(2, 0, "")
	Return DllStructGetData($S5627453526, 1)
EndFunc


За функцию au3CreateTemp большое спасибо Creator'у
ошибка находится в функции BinObfuscate в условии StringInStr

Файл с функциями au3FunctionIt.a3f

Код:
ConsoleRead
ConsoleWrite
ConsoleWriteError
StderrRead
StdinWrite
StdoutRead
ClipGet
ClipPut
EnvGet
EnvSet
EnvUpdate
MemGetStats
DirCopy
DirCreate
DirGetSize
DirMove
DirRemove
DriveGetDrive
DriveGetFileSystem
DriveGetLabel
DriveGetSerial
DriveGetType
DriveMapAdd
DriveMapDel
DriveMapGet
DriveSetLabel
DriveSpaceFree
DriveSpaceTotal
DriveStatus
FileChangeDir
FileClose
FileCopy
FileCreateNTFSLink
FileCreateShortcut
FileDelete
FileExists
FileFindFirstFile
FileFindNextFile
FileGetAttrib
FileGetLongName
FileGetShortcut
FileGetShortName
FileGetSize
FileGetTime
FileGetVersion
FileInstall
FileMove
FileOpen
FileOpenDialog
FileRead
FileReadLine
FileRecycle
FileRecycleEmpty
FileSaveDialog
FileSelectFolder
FileSetAttrib
FileSetTime
FileWrite
FileWriteLine
IniDelete
IniRead
IniReadSection
IniReadSectionNames
IniRenameSection
IniWrite
IniWriteSection
Beep
PixelChecksum
PixelGetColor
PixelSearch
SoundPlay
SoundSetWaveVolume
ObjCreate
ObjEvent
ObjGet
ObjName
GUICreate
GUICtrlCreateAvi
GUICtrlCreateButton
GUICtrlCreateCheckbox
GUICtrlCreateCombo
GUICtrlCreateContextMenu
GUICtrlCreateDate
GUICtrlCreateDummy
GUICtrlCreateEdit
GUICtrlCreateGraphic
GUICtrlCreateGroup
CUICtrlCreateIcon
GUICtrlCreateInput
GUICtrlCreateLabel
GUICtrlcreateList
GUICtrlcreateListView
GUICtrlcreateListViewItem
GUICtrlCreateMenu
GUICtrlCreateMenuItem
GUICtrlCreateMonthCal
GUICtrlCreateObj
GUICtrlCreatePic
GUICtrlCreateProgress
GUICtrlCreateRadio
GUICtrlCreateSlider
GUICtrlCreateTab
GUICtrlCreateTabItem
GUICtrlCreateTreeView
GUICtrlCreateTreeViewItem
GUICtrlCreateUpdown
GUICtrlDelete
GUICtrlRegisterListViewSort
GUICtrlSetBkColor
GUICtrlSetColor
GUICtrlSetCursor
GUICtrlSetData
GUICtrlSetFont
GUICtrlSetGraphic
GUICtrlSetImage
GUICtrlSetLimit
GUICtrlSetOnEvent
GUICtrlSetPos
GUICtrlSetResizing
GUICtrlSetState
GUICtrlSetStyle
GUICtrlSetTip
GUISetBkColor
GUICtrlSetCoord
GUISetCursor
GUISetFont
GUISetHelp
GUISetIcon
GUISetOnEvent
GUISetState
GUIDelete
GUICtrlGetHandle
GUICtrlGetState
GUICtrlRead
GUICtrlRecvMsg
GUICtrlSendMsg
GUICtrlSendToDummy
GUIGetCursorInfo
GUIGetMsg
GUIRegisterMsg
GUIStartGroup
GUISwitch
HotKeySet
Send
Abs
ACos
ASin
ATan
BitAND
BitNOT
BitOR
BitRotate
BitShift
BitXOR
Cos
Ceiling
Exp
Floor
Log
Mod
Random
Round
Sin
Sqrt
SRandom
Tan
InputBox
MsgBox
ProgressOff
ProgressOn
ProgressSet
SplashImageOn
SplashOff
SplashTextOn
ToolTip
AdlibDisable
AdlibEnable
AutoItSetOption
AutoitWinGetTitle
AutoitWinSetTitle
BlockInput
Break
Call
CDTray
SetError
SetExtended
MouseClick
MouseClickDrag
MouseDown
MouseGetCursor
MouseGetPos
MouseMove
MouseUp
MouseWheel
FtpSetProxy
HttpSetProxy
InetGet
InetGetSize
Ping
TCPAccept
TCPCloseSocket
TCPConnect
TCPListen
TCPNameToIP
TCPRecv
TCPSend
TCPShutdown
TCPStartup
UDPBind
UDPCloseSocket
UDPOpen
UDPRecv
UDPSend
UDPShutdown
UDPStartup
DllCall
DllClose
DllOpen
DllStructCreate
DllStructGetData
DllStructGetPtr
DllStructGetSize
DllStructSetData
PluginClose
PluginOpen
ProcessClose
ProcessExists
ProcessSetPriority
ProcessList
ProcessWait
ProcessWaitClose
Run
RunAsSet
RunWait
ShellExecute
ShellExecuteWait
Shutdown
RegDelete
RegEnumKey
RegEnumVal
RegRead
RegWrite
StringAddCR
StringCompare
StringFormat
StringInStr
StringIsAlNum
StringisAlpha
StringIsASCII
StringIsDigit
StringIsFloat
StringIsInt
StringIsLower
StringIsSpace
StringIsUpper
StringIsXDigit
StringLeft
StringLen
StringLower
StringMid
StringRegExp
StringRegExpReplace
StringReplace
StringRight
StringSplit
StringStripCR
StringStripWS
StringTrimLeft
StringTrimRight
StringUpper
Sleep
TimerInit
TimerDiff
TrayCreateItem
TrayCreateMenu
TrayItemDelete
TrayItemGetHandle
TrayItemGetState
TrayItemGetText
TrayItemSetOnEvent
TrayItemSetState
TrayItemSetText
TrayGetMsg
TraySetClick
TraySetIcon
TraySetOnEvent
TraySetPauseIcon
TraySetState
TraySetToolTip
TrayTip
Asc
AscW
Assing
Binary
BinaryLen
BinaryMid
BinaryToString
Chr
ChrW
Dec
Eval
Hex
HWnd
Int
IaAdmin
IsArrey
IsBinary
IsBool
IsDeclared
IsDllStruct
IsFloat
IsHWnd
IsInt
IsKeyword
IsNumber
IsObj
IsString
Number
String
StringToBinary
UBound
ControlClick
ControlCommand
ControlDisable
ControlEnable
ControlFocus
ControlGetFocus
ControlGetHandle
ControlGetPos
ControlGetText
ControlHide
ControlListView
ControlMove
ControlSend
ControlSetText
ControlShow
StatusbarGetText
WinActivate
WinActive
WinClose
WinExists
WinFlash
WinGetCaretPos
WinGetClassList
WinGetClientSize
WinGetHandle
WinGetPos
WinGetProcess
WinGetState
WinGetText
WinGetTitle
WinKill
WinList
WinMenuSelectItem
WinMinimizeAll
WinMinimizeAllUndo
WinMove
WinSetOnTop
WinSetState
WinSetTitle
WinSetTrans
WinWait
WinWaitActive
WinWaitClose
WinWaitNotActive

И архив на всякий случай:
Забыл предупредить,если Обфусцированный скрипт не скомпилирован
то его код стирается ,за это отвечает переменная $Comp в функции BinObfuscate
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Это не единственная сложность с которой ты столкнёшься во время попытки написания своего обфускатора.

Чем не угодил тот что уже существует?
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Он не плох,но уже существую декомпиляторы которые автоматически переводят код в читабельный вид, у меня нет исходного кода стандартого Обфускатора чтобы поменять в нём алгоритм криптования, по этому пытаюсь написать свой
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Вот здесь ошибка,только не пойму какая?!

Код:
$oSplit = StringSplit($aAu3Read, "{Delimiters}", 1) ; Файл au3 скрипта
	For $i = 1 To $oSplit[0]
		$ApfSplit = StringSplit($aApfRead, @CRLF, 1) ; Файл в котором записаны строки для сравнения
		For $t = 1 To $ApfSplit[0]
			If StringInStr($oSplit[$i],$ApfSplit[$t]) Then ; Если строка au3 скрипта = строке для сравнения то
				$aAu3Temp &= StringToBinary($oSplit[$i]) & @CRLF ; переводится в бинарный код
			Else
				$aAu3Temp &= $oSplit[$i] & " " ; Либо если нет то сохраняем как есть
			EndIf	
		Next
	Next
 
Верх