Имя: Пароль:
1C
 
Расшифровка 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)Там вообще-то смайлик в конце. К чему такая серьёзность?
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.