Вопрос к кодерам. 1C бух

Тема в разделе "WASM.BEGINNERS", создана пользователем limpopo, 12 май 2009.

  1. limpopo

    limpopo New Member

    Публикаций:
    0
    Регистрация:
    12 май 2009
    Сообщения:
    2
    Помогите разобраться. Я нуб в кодинге.
    Вопрос 1. Какой алгоритм шифр/дешифр используется? Каким алгоритмом он генерирует "РегНомер"?
    Вопрос 2. Что убрать/подправить в коде, чтобы отключить систему проверки системы или чтобы всегда давала «добро» или что-то типа этого.



    Сам код 1Сбух типовой конф:

    //CrModule variables
    Var ModuleName,Table;Var ModuleSt;Var Mod Export;Var CrKey;

    //Checker variables
    Перем ИмяКомпа;Перем РегНомер Экспорт;Перем РегКлюч Экспорт;Перем РегКлючРеестр Экспорт;Перем ФлагВып Экспорт;

    //////////Процедура ПриОткрытии()
    ////////// Форма.Параметр._ПриОткрытии();
    //////////КонецПроцедуры

    //-------------------- private of Checker --------------------------------
    Функция ХексТоДек(Шес) отАдоФ=СоздатьОбъект("СписокЗначений"); Для Сч=65 По 70 Цикл ОтАдоФ.ДобавитьЗначение(Симв(Сч)); КонецЦикла; ВрСтр=Шес;СумДекЧ=0; Для Икс=1 По СтрДлина(Шес) Цикл ВрСтр=Прав(ВрСтр,1); Если отАдоФ.Принадлежит(ВрСтр)=1 Тогда ВрСтр=КодСимв(ВрСтр)-55; КонецЕсли; ЧВрСтр=Число(ВрСтр); Степень=(СтрДлина(Шес)-(СтрДлина(Шес)-Икс))-1; Если Степень<>0 Тогда ДекЧ=ЧВрСтр;Для Сч=1 По Степень Цикл ДекЧ=ДекЧ*16;КонецЦикла;Иначе ДекЧ=ЧВрСтр; КонецЕсли; СумДекЧ=СумДекЧ+ДекЧ; ВрСтр=Лев(Шес,СтрДлина(Шес)-Икс); КонецЦикла; Возврат СумДекЧ; КонецФункции

    //ХексТоДек(Шес)
    Функция ШифрДешифр( Шд, РегКлючРеестрВн,РегКлючВн, РегНомерВн) Шифр=СоздатьОбъект("DynaCrypt");ВремСтр="";Если Шд=1 Тогда ВремСтр=Шифр.
    ЗашифроватьСтроку(РегНомерВн,Лев(РегНомерВн,4)); РегКлючВн=Лев(ВремСтр,6); РегКлючВн=Строка(ХексТоДек(РегКлючВн)); РегКлючРеестрВн=Шифр. ЗашифроватьСтроку(РегКлючВн,РегНомерВн); Возврат РегКлючВн; ИначеЕсли Шд=2 Тогда ВремСтр=РегКлючРеестрВн; Шифр.ДешифроватьСтроку(ВремСтр,РегНомерВн); РегКлючВн=Строка(ВремСтр); Возврат РегКлючВн;КонецЕсли;КонецФункции //ШифрДешифр
    Функция ЧитЗапРеестр( ЧитЗап,РегКлючРеестр,РегНомер) Рег=СоздатьОбъект("РаботаСРегистромWin"); Если ЧитЗап=1 Тогда КомпНейм=""; Рег.ОткрытьКлюч("HKEY_LOCAL_MACHINE","SYSTEM\Curre ntControlSet\Control\ComputerName\ComputerName","K EY_ALL_ACCESS"); Рег.ЗапроситьЗначение("ComputerName",КомпНейм); Если СтрДлина(КомпНейм)<4 Тогда КомпНейм=КомпНейм+"plus"; КонецЕсли; Для ЦиклСчетчик=1 По СтрДлина(КомпНейм) Цикл РегНомер=РегНомер+Строка(КодСимв(Сред(КомпНейм,Цик лСчетчик,ЦиклСчетчик+1))); КонецЦикла; РегНомер=Лев(РегНомер,6); Рег.ОткрытьКлюч("HKEY_CURRENT_USER","Software\1C\1 Cv7\7.7","KEY_ALL_ACCESS"); Если Рег.ЗапроситьЗначение("RegNumber",РегКлючРеестр)=0 Тогда Возврат 1; Иначе Возврат 0; КонецЕсли; ИначеЕсли ЧитЗап=2 Тогда Рег.ОткрытьКлюч("HKEY_CURRENT_USER","Software\1C\1 Cv7\7.7","KEY_ALL_ACCESS"); Рег.УстановитьЗначение("RegNumber","REG_SZ",РегКлю чРеестр); КонецЕсли; КонецФункции //ЧитЗапРеестр

    //-------------------- public of CrModule --------------------------------
    Процедура OnTheChk() Export If IsCurrentIBCenter()=1 Then ФлагВып=0;Если ЧитЗапРеестр(1,РегКлючРеестр,РегНомер)=1 Тогда Попытка ОткрытьФормуМодально("Обработка.СистемнаяОбработка ",РегНомер) Исключение ЗавершитьРаботуСистемы();КонецПопытки;
    ИначеЕсли ЧитЗапРеестр(1,РегКлючРеестр,РегНомер)=0 Тогда Сравн1="";Сравн2="";ШифрДешифр(2,РегКлючРеестр,Сра вн2,РегНомер);ШифрДешифр(1,РегКлючРеестр,Сравн1,Ре гНомер);Если Сравн1=Сравн2 Тогда ФлагВып=1;КонецЕсли;КонецЕсли;Если ФлагВып=0 Тогда
    Рег=СоздатьОбъект("РаботаСРегистромWin");Рег.Откры тьКлюч("HKEY_CURRENT_USER","Software\1C\1Cv7\7.7", "KEY_ALL_ACCESS");Рег.УдалитьЗначение("RegNumber") ;ЗавершитьРаботуСистемы();КонецЕсли;EndIf;КонецПро цедуры //ПриНачалеРаботыСистемы
    Процедура ПроверитьСистемныеУстановки(Конт) Экспорт РегНомер="";ЧитЗапРеестр(1,РегКлючРеестр,РегНомер) ;СтрСрав=СокрЛП(Врег(Конт.Рег_Ключ));СтрСравШифр=Ш ифрДешифр(1,РегКлючРеестр,РегКлюч,РегНомер);Если СтрСравШифр<>СтрСрав Тогда ФлагВып=0;Иначе ФлагВып=1;ЧитЗапРеестр(2,РегКлючРеестр,РегНомер);К онецЕсли;КонецПроцедуры //ГлВыполнитьПроверкуРег

    //------------------- private of CrModule ---------------------------
    Procedure RunModule(ModuleText) Mod=CreateObject("ExecuteModule");Mod.AssignSource (ModuleText);Mod.Compile();Mod.Execute();Чек.OnThe Chk();EndProcedure
    Function Decrypt(CryptKey) Crypto=CreateObject("DynaCrypt");ModuleSt="";Table .PutSection(ModuleName);For St=1 To Table.SectionHeight(ModuleName) Do For Col=1 To 65 Do CurArea=Table.Area(St,Col);If IsBlankString(CurArea.Text)=1 Then
    Continue; EndIf;CurStr=CurArea.Text; Crypto.DecryptString(CurStr,CrKey);ModuleSt=Module St+CurStr;EndDo EndDo;RunModule(ModuleSt);Return 0;EndFunction

    //-------------------- public of CrModule --------------------------------
    Procedure DefineModule(SectionName) Export CrKey="31415";Table=CreateObject("Table"); Try Table.SourceTable("Modules");Except DoMessageBox("Не загружен файл внешних подключаемых модулей! Обратитесь к разработчику!");
    ExitSystem();EndTry;ModuleName=SectionName;Decrypt (CrKey);EndProcedure
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    limpopo
    > Какой алгоритм шифр/дешифр используется?
    Afaik.
    Класс DynaCrypt предназначен для зашифровки/расшифровки текста с помощью алгоритма RC6.
    Методы:
    EncryptString(strSource, strKey)/ЗашифроватьСтроку(стрИсточник, стрКлюч) – шифрует строку.
    Параметры:
    стрИсточник - строка, которую необходимо зашифровать;
    стрКлюч - ключ с помощью, которого будет производиться шифровка.
    Возвращаемое значение:
    зашифрованная строка.

    DecryptString(strSource, strKey)/ДешифроватьСтроку(стрИсточник, стрКлюч) – расшифровывает ранее зашифрованную строку с помощью ключа. При несовпадении ключей шифровки/расшифровки метод не производит сообщений об ошибке.
    Параметры:
    стрИсточник - строка, которую необходимо зашифровать, сюда же возвращается расшифрованная строка;
    стрКлюч - ключ с помощью, которого будет производиться расшифровка.
    Возвращаемое значение:
    1 – все прошло успешно;
    -1 - пустая строка;
    -2 - ошибка в строке;
    -3 - ошибка в CRC.

    > Что убрать/подправить в коде, чтобы отключить систему проверки
    Я бы закомментировал тела процедур OnTheChk и ПроверитьСистемныеУстановки.
    Переменные РегНомер, РегКлюч, РегКлючРеестр и ФлагВып имеют признак Экспорт - это означает, что они доступны из других модулей, поэтому вместо закомментированных тел (обеих процедур) я бы вставил что-то похожее на
    Код (Text):
    1. РегНомер = "РегНомер"; РегКлюч = "РегКлюч";
    2. РегКлючРеестр = "РегКлючРеестр";
    3. ФлагВып = 1;
    > код 1Сбух типовой конф
    У меня нет такой конфигурации, поэтому проверить работоспособность предложенного мною решения не могу. То, что ты показал, может быть не вся "система проверки", зачем-то же переменные экспортируются.
     
  3. limpopo

    limpopo New Member

    Публикаций:
    0
    Регистрация:
    12 май 2009
    Сообщения:
    2
    При первом запуске на компе скипт генерирует Регкод типа 947564 и просит связаться с разработчиком. я высылаю этот Регкод и деньги разработчику тот в ответ присылает Регключ.

    если не ошибаюсь данный скрипт при запуске берет из реестра имя компьютера и шифрует алгоритмом RC6 с ключом CrKey="31415". и сопоставляет результат шифрования с ключом в реестре. если ключ в реестре отсутствует или он другой, то скрипт делает результат = "неудачно". Что конкретно надо подправить, чтобы скрипт всегда выдавал "удачно". Какой прогой пользуется разработчик при выдаче регключей.

    Конфигурация зарплата и кадры Молдавия 2007.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    limpopo
    > если не ошибаюсь
    Ошибаешься.

    Процедура DefineModule "готовит" таблицу, в которой есть секция (ее имя в переменной SectionName) и вызывает процедуру Decrypt.

    Процедура Decrypt обрабатывает непустые ячейки секции (цикл по всем строкам и колонкам с 1 по 65), расшифровывая текст каждой ячейки ключом "31415" и склеивая с предыдущей расшифровкой. Затем выполняет процедуру RunModule.

    Процедура RunModule "готовит" и выполняет расшифрованный код, а затем, вызывает процедуру OnTheChk.

    Зачем это делалось, понятия не имею. Возможно, предыдущая последовательность как-то определяла переменную Чек (в твоем коде ее определение не видно, а вызывается ее метод OnTheChk).

    Процедуру OnTheChk проверяет, есть ли в реестре строковый ключ "HKCU\Software\1C\1Cv7\7.7\RegNumber". Если нет вызывает процедуру "Обработка.СистемнаяОбработка", которая, наверное, выводит регистрационный номер и просит связаться с разработчиком.. Если есть, то вызывает два раза ШифрДешифр и сравнивает результаты ее работы.

    Тут становится интереснее.

    Функция ШифрДешифр.
    Если первый параметр равен 2, то ее работа сводится к возврату результата работы
    DynaCrypt.ДешифроватьСтроку(Ключ, Номер)
    где Номер – получен из имени компьютера (алгоритм тривиален), а Ключ – это то, что прислал разработчик.

    Еще интереснее.

    Функция ШифрДешифр.
    Если первый параметр равен 1, то она шифрует Номер его же частью, результат чуть-чуть дорабатывается (сохраняется для возврата в OnTheChk, именно он будет сравниваться с результатом работы первого вызова ШифрДешифр) и опять шифруется Номер’ом. Результат второй шифрации тоже возвращается в OnTheChk именно он будет записан в реестр.

    Самое интересное.

    Во втором вызове ШифрДешифр Ключ, присланный разработчиком не нужен!
    Похоже, что второй вызов и есть генератор ключа.

    !!! Все вышеописанное только теория.

    > Конфигурация зарплата и кадры Молдавия 2007.
    Ее можно как-нибудь пощупать? Сколько весит?
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    1с-обработка-кейген в аттаче.
    Запускал под 1C v7.70.027, 1cpp.dll v3.0.1.22