Что нового

Создание dll для кодирования/декодирования xxe и uue

Автор
A

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Подправил 2 строки и заработало!!! Урра!!! Конвертирует быстро!
Код:
$hFile=FileOpen($FileName)
...
$bin2xxe=DllCall("xxe.dll", "str", "bin2xxe", "str", $Data, "int", BinaryLen($Data), "str", $Name)


Но при файлах более 500 кб происходит крах ((
Это происходит на бинарных файлах. Текстовые файлы отлично.

Код:
  Имя события проблемы:	APPCRASH
  Имя приложения:	AutoIt3.exe
  Версия приложения:	3.3.9.21
  Штамп времени приложения:	52301eb3
  Имя модуля с ошибкой:	xxe.dll
 

sims

Осваивающий
Сообщения
184
Репутация
24
Ошибка возможно из-за того, что бинарные данные передаются как текстовые. В вызове функции, перед $Data, нужно заменить "str" на "ptr" или "int*".

Если не поможет, то попробуйте эту dll. http://rghost.ru/52401494
В ней имеется отладочная информация, позволяющая найти место ошибки в коде.
 
Автор
A

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
При замене "str" на "ptr" конвертирования не происходит
При замене "str" на "int*" конвертирования происходит не правильным - при декодировании ошибочные файлы
вернул обратно.

Ошибка в отладчике такая:

Код:
Ошибка в строке 71, файла: C:\xxe_dll.pb
Тип Ошибки: "Invalid memory access"

Любые бинарные файлы кодируются не правильно, а текстовые отлично! Текстовый файл 35 мб 4-5 секунд
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
ConsoleWrite(bin2xxe(@ScriptFullPath) & @LF)


Func bin2xxe($file_path)
	Local $file_name = $file_path ;Заменить на имя файла
	Local $hFile = FileOpen($file_path,16)
	Local $bData = FileRead($hFile)
	FileClose($hFile)

	Local $data_len = BinaryLen($bData)
	Local $t = DllStructCreate('BYTE['&$data_len&']')
	DllStructSetData($t,1,$bData)

	Local $return=DllCall("xxe.dll", "str", "bin2xxe", "ptr", DllStructGetPtr($t), "int", $data_len, "str", $file_name)

	If @error Then Return SetError(1,@error,0)
	Return $return[0]
EndFunc
 
Автор
A

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
inververs, спасибо, поддержал и в этот раз!

sims, Всё работает!

Нет слов!!! :laugh: Думаю, декодирование будет с такой же скоростью..
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
:
что бы не таскать с собой библиотеку, ее можно поместить в скрипт, и с помощью MemoryDll.au3 UDF вызывать функции
 

sims

Осваивающий
Сообщения
184
Репутация
24
Добавил функцию декодирования.
Код:
xxe2bin(Src$, *ResultSize.Long)
В первом параметре передаем закодированную строку. А во втором указатель на переменную типа Long. В ней функция вернет размер декодированных данных. Если возникают сложности с указателями, то в место него указываешь 0. А размер данных получаешь используя функцию
Код:
xxe2bin_Len()

Функция xxe2bin вернет указатель на массив данных.

http://rghost.ru/52414241
 

sims

Осваивающий
Сообщения
184
Репутация
24
Если нужно расшифровывать текст, то все просто.
Код:
$Test="12345"
$dll=DllOpen("xxe.dll")
$return=DllCall($dll, "str", "bin2xxe", "str", $Test, "int", 5, "str", "blablabla")
MsgBox(0, "", $return[0], 0)
$return_1=DllCall($dll, "str", "xxe2bin", "str", $return[0], "int", 0)
MsgBox(0, "", $return_1[0], 0)
С бинарными данными, нужно заменить в DllCall возвращаемый тип на ptr или аналогичный ему и обрабатывать данные как последовательность байт.
Файлы. http://rghost.ru/52421134
 
Автор
A

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
sims

Декодирование начинаю тестить, немогли ли вы подключить и uue
Там отличие в строке символов, вместо h - M , и вместо + - `
Выше я выкладывал общую функцию на au3.

Код:
$sLineX='`!"#$%&'&"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_"
        $SymX='M'
        $SymB='`'
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
sims [?]
С бинарными данными, нужно заменить в DllCall возвращаемый тип на ptr или аналогичный ему и обрабатывать данные как последовательность байт.
именно с бинарными не получается
 

sims

Осваивающий
Сообщения
184
Репутация
24
Форма выхода одинакова для текста и для бинарных данных (текст это частный случай двоичных данных). Функция возвращает адрес первой ячейки с данными, которые расположены последовательно в памяти.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
sims
ну ладно :smile: зачем вы это все написали, просили же пример :smile:
 

sims

Осваивающий
Сообщения
184
Репутация
24
Andrey_A [?]
Декодирование начинаю тестить, немогли ли вы подключить и uueТам отличие в строке символов, вместо h - M , и вместо + - `
Добавил.
Пример с использованием xxe и uue (текстовые данные).
Код:
$Test="12345"
$dll=DllOpen("xxe.dll")

$return=DllCall($dll, "str", "bin2xxe", "str", $Test, "int", 5, "str", "blablabla")
MsgBox(0, "xxe", $return[0], 0)
$return_1=DllCall($dll, "str", "xxe2bin", "str", $return[0], "int", 0)
MsgBox(0, "xxe ", $return_1[0], 0)

$return=DllCall($dll, "str", "bin2uue", "str", $Test, "int", 5, "str", "blablabla")
MsgBox(0, "uue", $return[0], 0)
$return_1=DllCall($dll, "str", "uue2bin", "str", $return[0], "int", 0)
MsgBox(0, "uue", $return_1[0], 0)



inververs [?]
просили же пример
Не вопрос, но с вас нормальный пример работы с памятью (запись в файл данных по указателю). Похоже что в автоите с этим напряг. Для выхода из положения добавил в dll функцию DataToFile, записывающую данные в файл.
Код:
DataToFile(File.s, *Point, Size)
У нее довольно простой код, но на автоите так же просто не получается сделать.
Код:
ProcedureDLL DataToFile(File.s, *Point, Size)
  CreateFile(0, File)
  WriteData(0, *Point, Size)
  CloseFile(0)
EndProcedure

Пример с использованием xxe (uue аналогично, но имена функций другие).
Код:
$hFile=FileOpen("xxe.dll",16)
$Data=FileRead($hFile)
FileClose($hFile)

Local $data_len = BinaryLen($Data)
Local $st = DllStructCreate('BYTE['&$data_len&']')
DllStructSetData($st,1,$Data)

$dll=DllOpen("xxe.dll")
$return=DllCall($dll, "str", "bin2xxe", "ptr", DllStructGetPtr($st), "int", BinaryLen($Data), "str", "blablabla")
MsgBox(0, "xxe", $return[0], 0)
$return_1=DllCall($dll, "int", "xxe2bin", "str", $return[0], "int", 0)
$Size=DllCall($dll, "int", "BinLen")
MsgBox(0, "xxe ", "Размер декодированных данных "&$Size[0]&" байт", 0)

DllCall($dll, "int", "DataToFile", "str", "xxe.bin", "int", $return_1[0], "int", $Size[0])


Файлы. http://rghost.ru/52427857


Добавлено:
Сообщение автоматически объединено:

Запись в файл с использованием WinAPI.
Код:
#include "WinAPI.au3"

$hFile=FileOpen("xxe.dll",16)
$Data=FileRead($hFile)
FileClose($hFile)

Local $data_len = BinaryLen($Data)
Local $st = DllStructCreate('BYTE['&$data_len&']')
DllStructSetData($st,1,$Data)

$dll=DllOpen("xxe.dll")
$return=DllCall($dll, "str", "bin2xxe", "ptr", DllStructGetPtr($st), "int", BinaryLen($Data), "str", "blablabla")
MsgBox(0, "xxe", $return[0], 0)
$return_1=DllCall($dll, "int", "xxe2bin", "str", $return[0], "int", 0)
$Size=DllCall($dll, "int", "BinLen")
MsgBox(0, "xxe ", "Размер декодированных данных "&$Size[0]&" байт", 0)

;DllCall($dll, "int", "DataToFile", "str", "xxe.bin", "int", $return_1[0], "int", $Size[0])

$hFile=_WinAPI_CreateFile("xxe.bin", 1)
if $hFile <> $INVALID_HANDLE_VALUE Then
   $Write=0
  _WinAPI_WriteFile($hFile, $return_1[0], $Size[0], $Write)
  _WinAPI_CloseHandle($hFile)
endif
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
sims [?]
Не вопрос, но с вас нормальный пример работы с памятью (запись в файл данных по указателю). Похоже что в автоите с этим напряг.
Нет не напряг, если возращается указатель на блок памяти с данными, то что бы их получить нужно при создании структуры передать указатель вторым параметром.
типа так:
Код:
DllStructCreate('BYTE[' & размер данных & ']', указатель)

Ну а затем, получив бинарные данные, записываешь их в файл, открытый в таком же режиме.
 

sims

Осваивающий
Сообщения
184
Репутация
24
Память при выходе из функции не очищается (иначе толку от нее не было). Функция может вернуть ноль, если произошла ошибка, а неправильный указатель в принципе быть не может, поскольку в коде память явно не выделяется. В место этого создан байтовый массив, в который записываются данные и функция на него возвращает указатель.
Код:
Procedure.i Decoder(*Src, *ResultSize.Long, *Param.Param)
  Static Dim dst.a(0)
     
  ; Код.
    
  ProcedureReturn @dst()
EndProcedure
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
sims [?]
В место этого создан байтовый массив, в который записываются данные и на него функция возвращает указатель.
Получается утечка памяти? нужно же этот массив при ненадобности очищать?
 

sims

Осваивающий
Сообщения
184
Репутация
24
Нет, утечки памяти не будет. Массив объявлен статическим и при каждом вызове функции его содержимое будет очищено если в этом есть необходимость. Статический массив это тоже что и глобальный, но его область видимости ограничивается функцией в которой он находится.
 
Верх