Показать полную графическую версию : нужна помощь по кодированию строки
полная предыстория:
есть такой jabber клиент jajc хочется его развернуть в домене
доменное имя пользователя = имя юзера на jabber сервере
так вот jajc хранит логин/пароль в реестре в шифрованном виде
идея такая - при первом запуске юзером jajc писать в реестр все настройки
вопрос: как писать в реестр уже шифрованное значение?
оговорюсь сразу программист из меня не очень
что удалось выяснить:
строку jajc хранит там в Base 64 вроде как
если поможет то на оф. форуме (http://forum.jrudevels.org/viewtopic.php?p=4378&sid=5ff73a44c46fe4fb44a83a415ef643ae) эта тема поднималась но я если честно не очень понял как сделать
пример строки: admin на выходе получаем cQf4Zvo=
Другими словами, нужно перекодировать строку в Base64 и/или обратно?
Вот функции для этого:
$sEncode = _Base64Encode("admin")
$sDecode = _Base64Decode($sEncode)
ConsoleWrite("_Base64Encode: " & $sEncode & @CRLF)
ConsoleWrite("_Base64Decode: " & $sDecode & @CRLF)
Func _Base64Decode($Data)
Local $Opcode = "0xC81000005356578365F800E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF000102030405060708090A 0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132338F45F0 8B7D0C8B5D0831D2E9910000008365FC00837DFC047D548A034384C0750383EA033C3D75094A803B3D75014AB00084C0751A 837DFC047D0D8B75FCC64435F400FF45FCEBED6A018F45F8EB1F3C2B72193C7A77150FB6F083EE2B0375F08A068B75FC8844 35F4FF45FCEBA68D75F4668B06C0E002C0EC0408E08807668B4601C0E004C0EC0208E08847018A4602C0E00624C00A460388 47028D7F038D5203837DF8000F8465FFFFFF89D05F5E5BC9C21000"
Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
DllStructSetData($CodeBuffer, 1, $Opcode)
Local $Ouput = DllStructCreate("byte[" & BinaryLen($Data) & "]")
Local $Ret = DllCall("user32.dll", "int", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
"str", $Data, _
"ptr", DllStructGetPtr($Ouput), _
"int", 0, _
"int", 0)
Return BinaryToString(BinaryMid(DllStructGetData($Ouput, 1), 1, $Ret[0]))
EndFunc
Func _Base64Encode($Data, $LineBreak = 76)
Local $Opcode = "0x5589E5FF7514535657E8410000004142434445464748494A4B4C4D4E4F505152535455565758595A616263646566676869 6A6B6C6D6E6F707172737475767778797A303132333435363738392B2F005A8B5D088B7D108B4D0CE98F0000000FB633C1EE 0201D68A06880731C083F901760C0FB6430125F0000000C1E8040FB63383E603C1E60409C601D68A0688470183F90176210F B6430225C0000000C1E8060FB6730183E60FC1E60209C601D68A06884702EB04C647023D83F90276100FB6730283E63F01D6 8A06884703EB04C647033D8D5B038D7F0483E903836DFC04750C8B45148945FC66B80D0A66AB85C90F8F69FFFFFFC607005F 5E5BC9C21000"
Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
DllStructSetData($CodeBuffer, 1, $Opcode)
$Data = Binary($Data)
Local $Input = DllStructCreate("byte[" & BinaryLen($Data) & "]")
DllStructSetData($Input, 1, $Data)
$LineBreak = Floor($LineBreak / 4) * 4
Local $OputputSize = Ceiling(BinaryLen($Data) * 4 / 3)
$OputputSize = $OputputSize + Ceiling($OputputSize / $LineBreak) * 2 + 4
Local $Ouput = DllStructCreate("char[" & $OputputSize & "]")
DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
"ptr", DllStructGetPtr($Input), _
"int", BinaryLen($Data), _
"ptr", DllStructGetPtr($Ouput), _
"uint", $LineBreak)
Return DllStructGetData($Ouput, 1)
EndFunc
здорово
но не то возвращает что нужно
admin
на выходе должно быть
cQf4Zvo=
а получаем
YWRtaW4=
гляньте на оф. форум то что я ссылку давал может что то прояснится почему
не то возвращает что нужно »
Возвращает перекодированную строку в base64. А вам видимо нужно расшифровать логин полученный из реестра. Алгоритмы шифрования для меня смутная тема, но я вот попробовал перевести функцию Decrypt с дельфи (та что в теме по ссылке):
$sDecrypt = Decrypt(_Base64Decode("cQf4Zvo="), 4235)
ConsoleWrite("Decode: " & $sDecrypt & @CRLF)
Func Decrypt($S, $Key)
Const $c1 = 51472, $c2 = 30759
$aS = StringSplit($S, "")
$S = ""
For $i = 1 To $aS[0]
$S &= Chr(BitXOR($aS[$i], BitShift($Key, 8)))
$Key = ($aS[$i] + $Key) * $c1 + $c2
Next
$result = $S ;UTF8Decode($X)
Return $result
EndFunc
Func _Base64Decode($Data)
Local $Opcode = "0xC81000005356578365F800E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF000102030405060708090A 0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132338F45F0 8B7D0C8B5D0831D2E9910000008365FC00837DFC047D548A034384C0750383EA033C3D75094A803B3D75014AB00084C0751A 837DFC047D0D8B75FCC64435F400FF45FCEBED6A018F45F8EB1F3C2B72193C7A77150FB6F083EE2B0375F08A068B75FC8844 35F4FF45FCEBA68D75F4668B06C0E002C0EC0408E08807668B4601C0E004C0EC0208E08847018A4602C0E00624C00A460388 47028D7F038D5203837DF8000F8465FFFFFF89D05F5E5BC9C21000"
Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
DllStructSetData($CodeBuffer, 1, $Opcode)
Local $Ouput = DllStructCreate("byte[" & BinaryLen($Data) & "]")
Local $Ret = DllCall("user32.dll", "int", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
"str", $Data, _
"ptr", DllStructGetPtr($Ouput), _
"int", 0, _
"int", 0)
Return BinaryToString(BinaryMid(DllStructGetData($Ouput, 1), 1, $Ret[0]))
EndFunc
Но безрезультатно (не уверен на счёт UTF8Decode()), либо я что-то накосячил при переводе кода, либо нужен другой алгоритм/метод.
нет нужно наоборот зашифровывать и писать это в реестр
может ключевая фраза там (оф. форум) "Параметр Key для имени - 4235"
вопрос: как писать в реестр уже шифрованное значение? »
Очень сложно вычислить алгоритм этого шифрования. Но я предлагаю тебе сделать вот что, напиши скрипт, который будет создавать нового пользователя в jajc на твоем компе и потом из реестра брать зашифрованное значение. Таким образом можеш насоздавать себе сколько заготовок ИМЯ--ЗАШИФРОВАННОЕ ИМЯ, сколько тебе нужно для дела.
beve, ты про декодирование без ключа? эм... по идее это невозможно :teeth:
но по той ссыле говорят что ключ известен
ты про декодирование без ключа? »
Ему ж нужно не декодирование, а как раз наоборот. Я дал только идею, которой цена - пол копейки :) ...
спасибо всем
списался с разработчиком
он ответил что использует некий свой механизм шифровки и раскрывать его не хочет так что угадывать можно долго
будем думать как по другому сделать
Тема еще актуальна? Я на основе делфёвой функции сделал енкодер/декодер если кому-то это еще нужно - пишите в личку :)
Vorona, а какой именно код ты брал за основу? если тот, что в ссылке в шапке указан, то разраб изменил способ кодирования. да и переделали уже сразу же. Пост №4 (http://forum.oszone.net/post-1216600-4.html)
http://forum.jrudevels.org/viewtopic.php?p=4378&sid=bcece8e35f2f5164e37fabec305301cb#4378 вот эта функция, всё работает на ура, могу поделиться дллкой, чтобы не заморачиваться
Кстати, за что отдельное спасибо тов. Lion'у :)
Да и еще, насчёт переделали, что переделывали там, я не знаю, на на версии программы 0.0.8.125 (от 22.06.2009) всё работает отлично. Могу даже заделиться шойтан-программой, которая при установке в логон-скрипт (в АД) будет проверять наличие определённого ключа реестра и при его отсутствии запрашивать логин и пароль у юзера и производить авто - установку и настройу программы
вот эта функция »
тот код, что ты говоришь переделали сразу же, в том посте в котором я уже указывал (Пост 4)
Ну тот переделанный код в 4-м посте отличный от моего, по крайней мере мой работает :)
а ключи от логина 4235, а от пароля 2336
Подобрано брутфорсом :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.