Помогите разобраться. Я нуб в кодинге. Вопрос 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
limpopo > Какой алгоритм шифр/дешифр используется? Afaik. Класс DynaCrypt предназначен для зашифровки/расшифровки текста с помощью алгоритма RC6. Методы: EncryptString(strSource, strKey)/ЗашифроватьСтроку(стрИсточник, стрКлюч) – шифрует строку. Параметры: стрИсточник - строка, которую необходимо зашифровать; стрКлюч - ключ с помощью, которого будет производиться шифровка. Возвращаемое значение: зашифрованная строка. DecryptString(strSource, strKey)/ДешифроватьСтроку(стрИсточник, стрКлюч) – расшифровывает ранее зашифрованную строку с помощью ключа. При несовпадении ключей шифровки/расшифровки метод не производит сообщений об ошибке. Параметры: стрИсточник - строка, которую необходимо зашифровать, сюда же возвращается расшифрованная строка; стрКлюч - ключ с помощью, которого будет производиться расшифровка. Возвращаемое значение: 1 – все прошло успешно; -1 - пустая строка; -2 - ошибка в строке; -3 - ошибка в CRC. > Что убрать/подправить в коде, чтобы отключить систему проверки Я бы закомментировал тела процедур OnTheChk и ПроверитьСистемныеУстановки. Переменные РегНомер, РегКлюч, РегКлючРеестр и ФлагВып имеют признак Экспорт - это означает, что они доступны из других модулей, поэтому вместо закомментированных тел (обеих процедур) я бы вставил что-то похожее на Код (Text): РегНомер = "РегНомер"; РегКлюч = "РегКлюч"; РегКлючРеестр = "РегКлючРеестр"; ФлагВып = 1; > код 1Сбух типовой конф У меня нет такой конфигурации, поэтому проверить работоспособность предложенного мною решения не могу. То, что ты показал, может быть не вся "система проверки", зачем-то же переменные экспортируются.
При первом запуске на компе скипт генерирует Регкод типа 947564 и просит связаться с разработчиком. я высылаю этот Регкод и деньги разработчику тот в ответ присылает Регключ. если не ошибаюсь данный скрипт при запуске берет из реестра имя компьютера и шифрует алгоритмом RC6 с ключом CrKey="31415". и сопоставляет результат шифрования с ключом в реестре. если ключ в реестре отсутствует или он другой, то скрипт делает результат = "неудачно". Что конкретно надо подправить, чтобы скрипт всегда выдавал "удачно". Какой прогой пользуется разработчик при выдаче регключей. Конфигурация зарплата и кадры Молдавия 2007.
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. Ее можно как-нибудь пощупать? Сколько весит?