Внимание: Данная статья предназначена только для эмулирования легально купленных ключей, которые по каким-либо причинам не могут быть использованы в компьютере (отсутствие порта, его некорректная работа или занятость). Автор не несет никакой ответственности за нецелевое использование нижеизложенного материала.
Введение
В первой части этой статьи я рассказал, как можно найти значения ячеек электронного ключа защиты (Dongle) Sentinel SuperPro, когда этого ключа нет, а также, как можно сделать эмулятор функций Sentinel SuperPro sproFindFirstUnit, sproExtendedRead, sproQuery и sproActivate. В этой части статьи я расскажу о том, как можно сделать эмулятор этих функций на базе реестра операционной системы. Тем более, что сохранение изменяемых значений ячеек ключа защиты, выполняемых функцией sproActivate, можно выполнить только в реестре.
Запись значений ячеек ключа защиты в реестр
Итак, мы имеем следующие значения ячеек ключа, которые мы записали в тело файла psl.exe
Теперь эти значения мы должны перенести в реестр, считывать их из реестра, и перезаписывать при изготовлении лицензированного пакета перевода. Для начала, давайте откроем реестр в редакторе реестра, и посмотрим, что туда записывает программа Passolo 5. В ветке реестра HKEY_CURRENT_USER\Software\PASS Engineering\Passolo 5 мы видим большое число разных параметров реестра. Давайте просмотрим эти параметры. И первый параметр реестра - AddIn приводит нас к хорошей мысли - ведь значения 1, 2, 3 и т.д. чем-то напоминают нам ячейки ключа защиты, а значения
\PAIGlossary.pai|0|97, \PAIXML.pai|0|124 можно легко заменить значениями ячеек ключа защиты. Таким образом, нам нужно создать раздел реестра с названием Dongle, и в этот раздел записать ячейки ключа защиты с их значениями. Мы знаем, что для записи параметров в реестр используется функция ADVAPI32.RegSetValueExA, поэтому давайте посмотрим, откуда эта функция вызывается, для чего включим команду Найти в отладчике. Мы видим, что эта функция вызывается из многих мест, а нам надо найти тот адрес, который отвечает за запись раздела AddIn в реестре, поскольку, как это мы сказали раньше, этот раздел сильно похож на тот раздел Dongle, который мы хотим создать. Нам нет необходимости прописывать новый код создания такого раздела, лучше использовать имеющийся. Отслеживая процесс создания раздела AddIn и записи в него значений, я обнаружил, что эту работу выполняет функция RegSetValueExA. Для подготовки работы этой функции, необходимо провести некоторые работы:
1. Создать раздел реестра Dongle;
2. Записать в этот раздел ячейки ключа защиты;
3. Записать в реестр значение каждой ячейки ключа защиты.
Анализируя в отладчике запуск программы, в месте вызова ключа защиты, я нашел интересную строку - NetworkDongle, которой нет нигде в реестре, потому что у нас вообще нет никакого Dongle, ни сетевого, ни локального. Поэтому я решил использовать эту строку для создания нужного для нас раздела в реестре. Для создания такого раздела в реестре используется функция ADVAPI32.RegQueryValueExA. Однако возникает вопрос, а куда можно вставить подпрограмму создания раздела реестра? Ответ нашелся очень быстро - на место вызова функции Sentinel SuperPro sproFindFirstUnit. Тем более, что функция вызывается самой первой, после некоторых подготовительных функция Sentinel SuperPro.
Подпрограмму создания раздела реестра с именем NetworkDongle, я сделал по аналогии с подпрограммой создания раздела реестра с именем AddIn.
Листинг этой программы приведен нижеКак работает эта подпрограмма.
Сначала мы должны установить в реестре параметр 00, который называется (По умолчанию), а значение которого пишется (значение не присвоено). Это традиционное начало для создания нового раздела реестра. С помощью команды
005695E1 E8 CA5C0200 CALL 0058F2B0
мы переводим числовое значение в строку ASCII. Затем мы корректируем стек, подготавливаем создание раздела реестра, вводя параметр
005695EC 68 94536800 PUSH 00685394 ; ASCII "NetworkDongle"
Выполняя команду
005695F6 E8 F3550800 CALL 005EEBEE
мы создаем в реестре раздел NetworkDongle, и устанавливаем в нем параметр (По умолчанию).
Команда
005695FB 3D 05200000 CMP EAX,2005
введена для того, чтобы исключить перезапись значений реестра в разделе NetworkDongle при каждом запуске программы. Дело в том, что при выполнении функции Sentinel SuperPro sproActivate, производится изменение значений ячеек реестра, и нам надо сохранить эти измененные значения. Поэтому мы проверяем наличие значения ячейки ключа защиты 00, которое равно 2005.
На команде
00569602 66:3E:8B1C75 0 MOV BX,WORD PTR DS:[ESI*2+691F00]
мы берем значение из ячейки ключа защиты, номер которой определяется значением регистра ESI, копируем его в BX, и на следующей команде помещаем это значение в стек. Затем на команде
00569618 E8 935C0200 CALL 0058F2B0
мы переводим числовое значение номера ячейки ключа защиты в строку ASCII, и на команде
0056962B E8 894E0700 CALL 005DE4B9
мы записываем ячейку ключа защиты и ее значение в реестр (Параметр и Значение соответственно)
На команде
00569630 46 INC ESI
мы переходим к следующей ячейке ключа защиты, и повторяем этот цикл 3F раз, пока не запишем значение последней ячейки ключа защиты в реестр.
На команде
00569631 83FE 40 CMP ESI,40
мы проверяем запись последней ячейки ключа защиты, восстанавливаем значение регистра EDI, и переходим на эмуляцию выполнения функции sproFindFirstUnit
0056963B 33C0 XOR EAX,EAX
0056963D 5E POP ESI
0056963E 5B POP EBX
0056963F C2 0800 RETN 8
Таким образом, при выполнении функции sproFindFirstUnit, мы создаем раздел реестра NetworkDongle, и осуществляем запись значений ячеек ключа защиты в этот раздел.Чтение из реестра значений ячеек Dongle
Теперь мы должны заставить нашу программу читать из реестра значения ячеек ключа, для обеспечения своей работы. Т.е., мы должны выполнить эмуляцию функции sproExtendedRead. Для этих целей уже знакомая нам функция работы с реестром ADVAPI32.RegQueryValueExA. Ниже я привожу листинг эмулятора функции sproExtendedRead
Особых пояснений эта подпрограмма не требует. Команды 0056987B, 005698A0, 005698A4, 005698A8 и 005698AB, 005698AD, 005698AF, 005698B0, 005698B1, 005698B2 взяты из эмулятора функции sproExtendedRead, описанного в 1-й части этой статьи. Остальные команды подготовки значений реестра для записи и чтения описаны выше.
Эмулятор Dongle для функции sproQuery
Этот эмулятор мы оставляем без изменений, как этой описано в 1-й части этой статьи. Здесь нет чтения значений ячеек ключа защиты (Dongle).
Запись в реестр при выполнении функции SproActivate
Для записи изменяемых значений ячеек ключа защиты в реестр при применим следующую подпрограмму
Как работает эта подпрограмма.
На команде
00569937 66:8B4424 14 MOV AX,WORD PTR SS:[ESP+14]
мы получаем значение ячейки из стека, и помещаем его в регистр EAX. На следующей команде мы помещаем это значение в буфер на регистре EDX. Затем на команде
0056993E 66:8B4424 10 MOV AX,WORD PTR SS:[ESP+10]
мы получаем номер ячейки ключа защиты, и помещаем его в регистр EAX. На следующей команде мы помещаем это значение в буфер на регистре ESI. Этот номер ячейки ключа защиты мы переводим в строку ANSII на команде
0056994C E8 5F590200 CALL 0058F2B0
И, затем, на команде
0056995F E8 554B0700 CALL 005DE4B9
мы записываем новое значение ячейки ключа в реестр.
Затем восстанавливаем исходные значения регистров EDI и ESI (командыи делаем успешным выполнении функции sproActivate
Заключение
Как видно из приведенного материала, ничего сложного здесь нет. Изменения в коде программы оказались минимальными, а сама программа успешно работает. Для описания работы по снятию защиты Sentinel SuperPro я использовал файл программы Passolo v5.0.006 - psl.exe. В этой же программе имеется второй файл - psl_u.exe, предназначенный для работы в Unicode. Вы можете сами поработать с этим файлом, чтобы провести его реверсинг, используя материал в этой статье. Это поможет Вам более лучше понять все прелести реверсинга программы Passolo путем снятия весьма сильной защиты Sentinel SuperPro. Буду весьма признателен за отзывы, пожелания и замечания.
12-07-2005
vnekrilov