Что нового

RemoteAut - удаленное выполнение AutoIt скриптов

firex

AutoIT Гуру
Сообщения
943
Репутация
203
AutoIt: >=3.3.12.0
Версия: 0.5.0

Категория: Администрирование, Интернет, Шифрование, Сеть, Разное

Описание: Работает по принципу Backdor(Back Connect); Позволяет осуществлять дистанционное выполнение AutoIt кода. Разработка может быть использована в целях создания устойчивых ко взлому ботов ( так как серверу не доступен полный исходный код ), или автоматизации операций на множестве удаленных компьютеров.

Основные возможности:
  • Данные передаются в зашифрованном виде
  • Автоматическое восстановление соединения при его обрыве
  • Поддержка Array, Int32, Int64, Binary, Bool, Ptr, Double, String, Keyword
  • Возможность передачи данных любых объемов
  • Относительно высокая скорость обработки принятых данных
  • Открытие именованных заданий для сохранения данных в буфер
  • Индексирование буфера исходя из максимального размера пакета

Парочка примеров: (Задание | Аргумент | Буфер)
Более подробно со списком заданий, их типами и аргументами вы можете ознакомиться в исходном коде.
Код:
Запрос: Execute | 0 | MsgBox( 64, '', 'Hello' )
Ответ: Кол-во пакетов|Общий размер данных

1) Поскольку тип задания Execute - сервер откроет задание "Execute" и положит данные в буфер.
2) Для получения этих данных мы отправим запрос с аргументом -100 (!Next):
    Execute | -100 | 1 , где 1 - номер пакета в буфере.
3) В ответ мы получим пакет типа Custom ( реальный тип 100-Custom ) с нашей частью данных.
4) Как только мы закончили работу  с этим заданием - мы можем закрыть его и освободить буфер:
    CloseChallenge | 0 | Execute
Код:
Запрос: Execute_v2 | 0 | MsgBox( 64, '', 'Hello' )
Ответ: Данные возвращенные после выполнения

1) Команда Execute_v2 принадлежит классу "Instant", они игнорируют открытые задания и не создают буфер.
Код:
Запрос: Execute_v2 | -102 | MsgBox( 64, '', 'Hello' )
Ответ: Ответа нет

1) Аргумент -102(!NoResponse) указывает, что отвечать клиенту нет нужды.

Код/Пример:
Код:
#Include <WinAPI.au3>
#Include <APIConstants.au3>
#Include <Array.au3>
#Include <Crypt.au3>
#Include <GUIEdit.au3>

TCPStartup()
Opt( "TCPTimeout", 0 )

Global Const $__AUTTYPE[10][2] = [ [9], [10, "Array"], [11, "Int32"], [12, "Int64"], [13, "Binary"], [14, "Bool"], [15, "Ptr"], [16, "Double"], [17, "String"], [18, "Keyword"] ]
Global Const $tagRAUT = "DWORD rAut; UINT uId; INT iFlag; INT Error; INT Extended;", $tagRAUTSZ = 0x14

Global Const $__PARAMS[7] = [ 0x54554152, "testEncKey", @IPAddress1, 1818 ]


; << GUI CREATE
Local $hGui, $iEdit, $iDummy, $aInput[5], $aKeys[1][2] = [["{ENTER}", 0]]
; -
$hGui = GUICreate( 'client_[console] - example', 890, 320, -1, -1, 0x16CF0000, 0x00000100 )
$iEdit = GUICtrlCreateEdit( 'Build nightly Jul 08 2013.' & @CRLF, 3, 3, 884, 289, 0x50200844 )
$aInput[0] = GUICtrlCreateInput( '1', 3, 296, 29, 20 )
$aInput[1] = GUICtrlCreateInput( '10', 41, 296, 91, 20 )
$aInput[2] = GUICtrlCreateInput( 'MsgBox( 64, "Title", "Text", 5 )', 141, 296, 677, 20 )
$aInput[3] = GUICtrlCreateInput( '-101', 827, 296, 60, 20 )
$iDummy = GUICtrlCreateDummy()
	$aKeys[0][1] = $iDummy
	GUISetAccelerators( $aKeys )

GUISetBkColor( 0x76bbec )
GUICtrlSetBkColor( $aInput[2], 0xffff00 )
GUiCtrlSetFont( $iEdit, 11 )
GUISetState(@SW_SHOW, $hGui)
_WinAPI_RedrawWindow( GUICtrlGetHandle( $aInput[2] ) ) ;Fix AutoIt bug


; << OPEN SOCKET
Local $hSocket, $hClSock, $aClients[1][2]
; -
$hSocket = TCPListen( $__PARAMS[2], $__PARAMS[3] )
If @Error Then _
	Exit MsgBox( 16, 'WSA Error', 'Code=' & @Error )


; << SETUP CRYPT
Local $hCryptKey = _Crypt_DeriveKey( $__PARAMS[1], 0x00006601 )


; << MAIN LOOP
Local $iMsg, $ClIdx, $sZ, $tBuffer, $tRaut, $tData, $vPack
; -
While 1
	$iMsg = GUIGetMsg()
    Switch $iMsg
		Case -3 ;GUI_EVENT_CLOSE
			GUIDelete( $hGui )
			; -
			For $ClIdx = 1 To $aClients[0][0] Step 1
				__RemoveUser( $ClIdx )
			Next
			TCPCloseSocket( $hSocket )
			TCPShutdown()
			ExitLoop
		Case $iDummy ;SEND PACKAGE
			; HOW TO SEND PACKAGE
			$tRaut = DllStructCreate( $tagRAUT )
				$tRaut.rAut = $__PARAMS[0]
				$tRaut.uId = Int( GUICtrlRead( $aInput[1] ) )
				$tRaut.iFlag = Int( GUICtrlRead( $aInput[3] ) )

			$tBuffer = DllStructCreate( "byte Buffer[" & $tagRAUTSZ & "]", DllStructGetPtr( $tRaut ) )
			$vPack = $tBuffer.Buffer ;Header
			$vPack &= StringTrimLeft( StringToBinary( GUICtrlRead( $aInput[2] ) ), 2 ) ;Data

			$ClIdx = Int( GUICtrlRead( $aInput[0] ) )
			__PackageSend( $aClients[$ClIdx][0], Binary( $vPack ) )
			__ConsolePrint( ' >>> Sended: ' & $aClients[$ClIdx][1] & '> [' & $tRaut.uId & ']{' & GUICtrlRead( $aInput[2] ) & '}' & '<' & $tRaut.iFlag & '>'  )


			$tBuffer = 0
			$tRaut = 0
	EndSwitch

	$hClSock = TCPAccept( $hSocket )
	If $hClSock <> -1 Then
		$aClients[0][0] += 1

		$sZ = $aClients[0][0]
		ReDim $aClients[$sZ+1][2]

		$aClients[$sZ][0] = $hClSock
		$aClients[$sZ][1] = __SocketToIP( $hClSock )

		__ConsolePrint( 'New user [' & $aClients[$sZ][1] & '@' & $sZ & '] connected on ' & $__PARAMS[3] & ' port!' )
		ContinueLoop
	EndIf

	For $ClIdx = 1 To $aClients[0][0] Step 1
		$tBuffer = __PackageRecv( $aClients[$ClIdx][0] )
		If @Error Then
			__RemoveUser( $ClIdx, @Error )
			If Not @Error Then _
				ExitLoop ;User removed
		ElseIf IsDllStruct( $tBuffer ) Then
			$tRaut = DllStructCreate( $tagRAUT, $tBuffer.Pointer ) ;Get response header
			$tData = DllStructCreate( "byte Buffer[" & ( $tBuffer.Size - $tagRAUTSZ ) & "]", $tBuffer.Pointer + $tagRAUTSZ ) ;Get response body
			; -
			__ConsolePrint( '>New package from [' & $aClients[$ClIdx][1] & ']: ' & $tRaut.uId )
			__ConsolePrint( @TAB & 'DATA[' & __VarType( $tRaut.iFlag ) & ']: ' & BinaryToString( $tData.Buffer ) )
			__ConsolePrint( @TAB & 'With Error code = ' & $tRaut.Error )
			__ConsolePrint( @TAB & 'With Extended code = ' & $tRaut.Extended & @CRLF )

			$tBuffer = 0
			$tRaut = 0
			$tData = 0
		EndIf
	Next
WEnd

Func __PackageSend( $hSocket, $vPack )
	$vPack = _Crypt_EncryptData( $vPack, $hCryptKey, 0 )
	If Not @Error Then _
		TCPSend( $hSocket, $vPack )

	Return ( @Error = 0 )
EndFunc

Func __PackageRecv( $hSocket )
	Local $vRecv, $vRecvBuf = ''
	; ---
	Do
		$vRecv = TCPRecv( $hSocket, 131072, 1 )
		If @Error Then
			If @Error = -1 Then _
				SetError( 0 )

			ExitLoop
		ElseIf $vRecv <> '' Then
			$vRecvBuf &= StringTrimLeft( $vRecv, 2 )
			; ---
			Sleep( 10 )
			ContinueLoop
		EndIf
	Until $vRecv = ''
	If $vRecvBuf And Not @Error Then
		$vRecvBuf = Binary( "0x" & $vRecvBuf )
		$vRecvBuf = _Crypt_DecryptData( $vRecvBuf, $hCryptKey, 0 )
		If Not @Error Then
			Local $iBufSize = BinaryLen( $vRecvBuf ), _
				$tBuffer = DllStructCreate( "byte Buffer[" & $iBufSize & "]; uint Size; uint Pointer" )

			$tBuffer.Buffer = $vRecvBuf
			$tBuffer.Size = $iBufSize
			$tBuffer.Pointer = DllStructGetPtr( $tBuffer )
			Return $tBuffer
		EndIf
	EndIf
	Return 0
EndFunc

Func __RemoveUser( $iClSock, $iReason = -1 )
	If $iClSock <= $aClients[0][0] Then
		If $iReason >= 0 Then _
			__ConsolePrint( 'Remove user [' & $aClients[$iClSock][1] & '], reason: ' & $iReason )

		TCPCloseSocket( $aClients[$iClSock][0] )
		; ---
		$aClients[0][0] -= 1
		_ArrayDelete( $aClients, $iClSock )
		Return True
	EndIf
	Return SetError( 1, 0, False )
EndFunc

Func __SocketToIP( $hSocket )
	Local $tSOCKADDR, $aRet
	; ---
	$tSOCKADDR = DllStructCreate("short; ushort; uint; char[8]")
	$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $hSocket,"ptr", DllStructGetPtr($tSOCKADDR), "int*", DllStructGetSize($tSOCKADDR))
	If Not @error And $aRet[0] = 0 Then
		$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($tSOCKADDR, 3))
		If Not @error Then $aRet = $aRet[0]
	Else
		$aRet = 0
	EndIf
	Return $aRet
EndFunc

Func __ConsolePrint( $sMsg )
	_GUICtrlEdit_AppendText( $iEdit, $sMsg & @CRLF)
EndFunc

Func __VarType( $iVarType )
	Local $sType
	; ---
	For $Idx = 1 To $__AUTTYPE[0][0] Step 1
		If $iVarType == $__AUTTYPE[$Idx][0] Then _
			Return $__AUTTYPE[$Idx][1]
	Next
	Return 17
EndFunc

Файл: server_v.0.5.0.au3

Снимок:

Источник: autoit-script.ru
Автор(ы): Firex
 
АТ
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
203
Забыл прикрепить вспомогательные функции( для клиента ):
Код:
Func _rAut_PackToArray( $sPack ) ;1D / 2D
	Local $aPack, $aSize, $aRet[1], _
		$vVal, $Rows, $Cols, $Idx, $Jix
	; ---
	$aPack = StringSplit( $sPack, "=" )
	If $aPack[0] = 2 Then
		$aSize = StringRegExp( $aPack[1], 'Array(\d+)x(\d+)', 3 )
		If IsArray( $aSize ) Then
			$Rows = Int( $aSize[0] )
			$Cols = Int( $aSize[1] )
			; -
			If $Rows Then
				If Not $Cols Then
					ReDim $aRet[$Rows]
				Else
					ReDim $aRet[$Rows][$Cols+1]
				EndIf
			EndIf

			$aPack = StringSplit( $aPack[2], "|" )
			For $Idx = 1 To $Rows Step 1
				For $Jix = 0 To $Cols Step 1
					$vVal = BinaryToString( '0x' & $aPack[$Idx*($Cols+1)] )
					If $Cols Then
						$aRet[$Idx-1][$Jix] = $vVal
					Else
						$aRet[$Idx-1] = $vVal
					EndIf
				Next
			Next
		EndIf
	EndIf
	Return $aRet
EndFunc

Func __ReinterpretCast( $sType, ByRef $vVar )
	Switch $sType
		Case "Array"
			$vVar = _rAut_PackToArray( $vVar )
		Case "Int32", "Int64"
			$vVar = Int( $vVar )
		Case "Binary"
			If StringLeft( $vVar, 2 ) <> "0x" Then _
				$vVar = "0x" & String( $vVar )
			$vVar = Binary( $vVar )
		Case "Bool"
			Switch $vVar
				Case "True"
					$vVar = True
				Case "False"
					$vVar = False
				Case Else
					$vVar = ( Number( $vVar ) >= 1 )
			EndSwitch
		Case "Ptr"
			$vVar = Ptr( Int( $vVar ) )
		Case "Double"
			$vVar = Round( $vVar, 16 )
		Case "String"
			$vVar = String( $vVar )
		Case "Keyword"
			Switch $vVar
				Case "Null"
					$vVar = Null
				Case "Default"
					$vVar = Default
				Case Else
					$vVar = Default
			EndSwitch
		Case Else
			Return SetError( 1 )
	EndSwitch
EndFunc
 

ahjkcfout7

Новичок
Сообщения
19
Репутация
4
у меня при первом запуске сервера выводит
D:\downloads\server_v.0.5.0[fix1](2).au3 (90) : ==> Error in expression.:
Global Const $__SVR[] = [ '0.5.0', 'DebugGroup', @IPAddress1, '1818', 'testEncKey', 16, 2, 65536 ]
Global Const $__SVR[^ ERROR
D:\downloads\server_v.0.5.0[fix1](2).au3 (158) : ==> Variable used without being declared.:
If $_rAut_hEncKey Then _rAut_CryptDestroyKey( $_rAut_hEncKey )
If ^ ERROR
после обьявление переменых Global $_rAut_hEncKey,$_rAut_aCrypt,$_rAut_hSocket следующие ошибки
Global Const $__SVR[] = [ '0.5.0', 'DebugGroup', @IPAddress1, '1818', 'testEncKey', 16, 2, 65536 ]
Global Const $__SVR[^ ERROR
$_rAut_tBuffer.BufSize = DllStructGetSize( $_rAut_tBuffer ) - 0x0C
$_rAut_tBuffer^ ERROR
 

sensiro

Чайник
Сообщения
1
Репутация
0
Не подскажите как запустить графический интерфейс? у меня только иконка в трее
 
АТ
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
203
sensiro
Файл - сервер. Пример - клиент.

Для теста нужно запустить у себя сервер и клиент. Клиент имеет графический интерфейс и управляет сервером.
 
Верх