|
Расшифровка 1Cv7.DBA с использованием 1C++ | ☑ | ||
---|---|---|---|---|
0
Warlock
23.04.10
✎
11:38
|
Может кому-нибудь понадобится:
ФайлDBA = СоздатьОбъект("BinaryData"); Если ФайлDBA.ПодключитьсяКФайлу(КаталогИБ() + "1Cv7.DBA", 1, 1) = 0 Тогда Сообщить("Ошибка при открытии файла 1Cv7.DBA. База должна быть SQL"); КонецЕсли; ДанныеDBA = ""; ФайлDBA.ПрочитатьСтроку(ДанныеDBA); КлючSQL = "19465912879oiuxc ensdfaiuo3i73798kjl"; Math = СоздатьОбъект("Math"); СтрокаСоединения = ""; Для Ном = 1 По СтрДлина(ДанныеDBA) Цикл СтрокаСоединения = СтрокаСоединения + Симв(Math.XOR(КодСимв(Сред(ДанныеDBA, Ном, 1)), КодСимв(Сред(КлючSQL, (Ном-1) % 36 + 1, 1)))); КонецЦикла; СЗ = СоздатьОбъект("СписокЗначений"); СЗ.ИзСтрокиСРазделителями(СтрЗаменить(СтрЗаменить(СтрокаСоединения, "}", ""), "{", "")); Сообщить("Сервер SQL: " + СЗ.ПолучитьЗначение(2)); Сообщить("База данных SQL: " + СЗ.ПолучитьЗначение(4)); Сообщить("Имя пользователя SQL: " + СЗ.ПолучитьЗначение(6)); Сообщить("Пароль пользователя SQL: " + СЗ.ПолучитьЗначение(8)); Некоторые моменты посмотрел в sqlconnectread.ert с проклаба |
|||
1
Sadovnikov
23.04.10
✎
11:40
|
(0) И? Уже несколько лет назад, как это сделано.
|
|||
2
Ёпрст
23.04.10
✎
11:46
|
+1 и без использования 1c++ вообще.
|
|||
3
Warlock
23.04.10
✎
11:56
|
Пример работы с некоторыми методами 1С++.
Дополнительный источник данной процедуры в инете. |
|||
4
Sadovnikov
23.04.10
✎
12:22
|
(3) Ну на тебе еще тогда информации, если на то пошло...
if Kind = 0 then begin //Получим хэндл 1С-ки hdbc1 := dword(Ptr(dword(Ptr(GetDefault()+$20)^)+$4c)^); end else begin //создадим новое подключение try BasePath := obj.EvalExpr('IBDir()'); ResStr:=''; //анализируем файл if Not(FileExists(BasePath + '1cv7.dba')) then begin TempVar := 'Не найден файл 1cv7.dba'; PutNParam(paParams,0,TempVar); GoQuerySQL := '##Ошибка##'; end; f := TFileStream.Create(BasePath + '1cv7.dba', fmOpenRead or fmShareDenyWrite); try mem := TMemoryStream.Create; try mem.LoadFromStream(f); size := mem.Size; mem.Position:=0; while mem.Position < Size do begin CurByte := PByte(Integer(Mem.Memory)+mem.Position)^; //вычислим хэш-символ hash := key[(mem.position mod 36)+1]; ResStr := ResStr + char(CurByte xor ord(hash)); mem.Position := mem.Position+1; end; finally FreeAndNil(Mem); end; finally FreeAndNil(f); end; except TempVar := 'Произошла ошибка при подключении к базе '+GetNParam(paParams,3); PutNParam(paParams,0,TempVar); GoQuerySQL := '##Ошибка##'; exit; end; BasePath := GetNParam(paParams,3); BasePath := 'DRIVER={SQL Server};SERVER='+GetParam(ResStr, '{"Server"')+';UID='+GetParam(ResStr, '{"UID"')+';PWD='+GetParam(ResStr, '{"PWD"')+';DATABASE='+BasePath; StrError := PChar(BasePath); |
|||
5
Warlock
23.04.10
✎
12:28
|
Отлично! Ну уже на C реализовывать нет необходимости, думаю... :-)
А вот оригинал на 1С без использования ВК выложу: http://1c.proclub.ru/modules/mydownloads/personal.php?cid=78&lid=4730 Var Connect; //***** Function GetParam(ParamName) NamePos = Find(Connect, ParamName); If NamePos = 0 Then Return ""; EndIf; Connect = Mid(Connect, NamePos + StrLen(ParamName) + 3); EndPos = Find(Connect, """"); Result = Left(Connect, EndPos - 1); Connect = Mid(Connect, EndPos + 1); Return Result; EndFunction //***** Function XOR(Val ParA, Val ParB) Res = 0; Koef = 1; For BitNumber = 1 To 8 Do BitA = ParA % 2; BitB = ParB % 2; ParA = Int(ParA / 2); ParB = Int(ParB / 2); BitC = (BitA + BitB) % 2; Res = Res + BitC * Koef; Koef = Koef * 2; EndDo; Return Res; EndFunction //***** Procedure OnOpen() Var CurDir, SQLKeyCode[36], ConnectCode[200]; FilePath(CurDir); ReturnStatus(0); srvList = Form.Parameter; If ValueTypeStr(srvList) <> "СписокЗначений" Then DoMessageBox("Этот файл используется другими и не может использоваться самостоятельно"); Return; EndIf; srvList.Set("Статус", 0); ConnectFile = IBDir() + "1Cv7.DBA"; If FS.ExistFile(ConnectFile) = 0 Then Message("Это база не SQL - формата!", "!"); Form.Close(); Return; EndIF; FSO = CreateObject("Scripting.FileSystemObject"); F = FSO.OpenTextFile(ConnectFile, 1); ConnectLen = 0; While F.AtEndOfStream = 0 Do While F.AtEndOfLine = 0 Do ConnectLen = ConnectLen + 1; ConnectCode[ConnectLen] = Asc(F.Read(1)); EndDo; If F.AtEndOfStream = 0 Then F.SkipLine(); ConnectLen = ConnectLen + 1; ConnectCode[ConnectLen] = 10; EndIf; EndDo; F.Close(); FSO = 0; SQLKey = "19465912879oiuxc ensdfaiuo3i73798kjl"; For i = 1 To 36 Do SQLKeyCode[i] = Asc(Mid(SQLKey, i, 1)); EndDo; Connect = ""; For i = 1 To ConnectLen Do Connect = Connect + Chr(XOR(ConnectCode[i], SQLKeyCode[(i - 1) % 36 + 1])); EndDo; srvList.Set("Статус", 1); srvList.Set("Connect", Connect); srvList.Set("ServerName", GetParam("Server")); srvList.Set("DBName", GetParam("DB")); srvList.Set("User", GetParam("UID")); srvList.Set("Password", GetParam("PWD")); // Message("-" + srvList.Get("ServerName") + "-" + srvList.Get("DBName") + "-" + srvList.Get("User") + "-" + srvList.Get("Password") + "-"); EndProcedure |
|||
6
Sadovnikov
23.04.10
✎
12:30
|
(5) А чего "Отлично"? В чем великий смысл?
|
|||
7
Warlock
23.04.10
✎
12:34
|
(6)Там вообще-то смайлик в конце. К чему такая серьёзность?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |