Сейчас на форуме: (+6 невидимых)

 eXeL@B —› Протекторы —› Донглы DеsКеу
Посл.ответ Сообщение

Ранг: 5.5 (гость)
Активность: 0.01=0.01
Статус: Участник

Создано: 08 марта 2017 18:09
· Личное сообщение · #1

Исследую программу, защищенную сабжевыми донглами.--> Link <--
По началу все просто:

Code:
  1. 001E179D call    FindDESkey
  2. 001E17A2 test    eax, eax

Code:
  1. 002DC4A8 call    DESkeyGetAPIVersion
  2. 002DC4AD push    offset unk_40786C
  3. 002DC4B2 push    dword_457588
  4. 002DC4B8 call    FindDESkey
  5. 002DC4BD test    eax, eax
  6. 002DC4BF jz      short loc_2DC469
  7. 002DC4C1 push    3E8h
  8. 002DC4C6 push    offset byte_5DBB20
  9. 002DC4CB push    0
  10. 002DC4CD push    dword_457588
  11. 002DC4D3 push    eax
  12. 002DC4D4 call    DESkeyReadRandomNumbers


И вот после вызова последней функции, которая возвращает 1000 псевдослучайных (seedable) значений, я не понимаю что происходит, но каждый раз приходим к окну с секьюрити еррор -3.

От модератора: Используй тег ASM



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 08 марта 2017 20:00
· Личное сообщение · #2

deff0
Ну дык чего ж ты самую смакоту упустил. Может эти RandomNumbers не рандом совсем и как раз и проверяется предопределенные значения либо используются в расчете чего-то?

-----
старый пень




Ранг: 5.5 (гость)
Активность: 0.01=0.01
Статус: Участник

Создано: 08 марта 2017 20:10
· Личное сообщение · #3

Они 100% не рандомные. Они генерятся на базе seed'а, известного донглу, известного программе. У вудмана есть допотопная статья на тему этих донглов, но мне она не помогла. Он там копал старую версию донгла и со стороны дллки. Распутать этот клубок у меня пока не выходит. На пятый день я обратился к комьюнити.



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 08 марта 2017 21:46
· Личное сообщение · #4

deff0
Дык задампь донгл в той же последовательности и потом используй таблицу для возврата рандома.

-----
старый пень




Ранг: 397.0 (мудрец), 179thx
Активность: 0.170.1
Статус: Участник

Создано: 08 марта 2017 23:01 · Поправил: BfoX
· Личное сообщение · #5

не рандомные это точно.
используются для трансформа (ака DK2_RandomNumbers) 2 большие таблицы. они уникальны для каждого производителя. обе высчитываются из данных, полученных от донгла. как-то так

зы: давно существует полный эмулятор для данного типа ключей
зы2: и еще два типа команд для обмена с донглом используются.

-----
...или ты работаешь хорошо, или ты работаешь много...




Ранг: 5.5 (гость)
Активность: 0.01=0.01
Статус: Участник

Создано: 08 марта 2017 23:23
· Личное сообщение · #6

r_e
Был бы у меня донгл, я бы не плодил постов на форумах, а жамкал кнопки в программе.
BfoX
Да, там еще команды чтения и записи есть.
О существовании эмулей всего и вся по килобаксу за штуку, вообще никто не сомневается. Но это, во-первых, килобакс, а во-вторых, свистопляска с неподписанными драйверами.



Ранг: 397.0 (мудрец), 179thx
Активность: 0.170.1
Статус: Участник

Создано: 08 марта 2017 23:27 · Поправил: BfoX
· Личное сообщение · #7

deff0 пишет:
Да, там еще команды чтения и записи есть.


я не про это. это связано с шифрованием пакетов через трансформ.

-----
...или ты работаешь хорошо, или ты работаешь много...





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 09 марта 2017 20:19
· Личное сообщение · #8

deff0 пишет:
а во-вторых, свистопляска с неподписанными драйверами

многие купили серты в этом году. пару раз уже видел от разных типов. тот же bfox не зря пиарится

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 397.0 (мудрец), 179thx
Активность: 0.170.1
Статус: Участник

Создано: 09 марта 2017 22:17 · Поправил: BfoX
· Личное сообщение · #9

ajax
не, тут неправда ваша. свои 150 бакинских я прое... потерял - GoDaddy ничего не продали. там в NDA прописано что бабосы не возвращают если проблемы с показом юрика =)
а тест моду автоматизировали - никаких бубнов с плясками.

для ТС еще напишу пару строк - посмотрел я софт. без ключа анрил, ихмо. через трансформ ключа память прогоняется. можно попробовать только патчить сравнения на выходе, но это как кому по вкусу...

все вышесказанное верно для deskey2 usb, хотя Saab и Xor37 разбирали lpt-шную железку и свой ресерч выложили на вудмане. по deskey3 usb не смотрел, но тоже очень похож

-----
...или ты работаешь хорошо, или ты работаешь много...





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 10 марта 2017 13:44
· Личное сообщение · #10

BfoX
за 150 серт без юр лица... открыть чтоль конторку по разводу Sab, без а

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 397.0 (мудрец), 179thx
Активность: 0.170.1
Статус: Участник

Создано: 10 марта 2017 16:31 · Поправил: BfoX
· Личное сообщение · #11

ajax
Sab, без а

c одним 'a'

-----
...или ты работаешь хорошо, или ты работаешь много...




Ранг: 5.5 (гость)
Активность: 0.01=0.01
Статус: Участник

Создано: 26 марта 2017 18:22
· Личное сообщение · #12

Потупив еще немного в дебаггере, имею следующие результаты:
1. ReadRandom вызывается один раз. Из нее генерится последовательность по алгоритму и сверяется с зашитой константой. В обратную сторону я восстановил 16 байт для прохождения этой проверки, на случай если когда-нибудь дорасту до написания эмулятора.

2. Шифрование
- Программа в 3 этапа разными кусками вычитывает всю память ключа. Этот массив прогоняется через шифратор ключа. Дальше идет работа с полученным массивом.
- Перед записью данных в ключ, данные прогоняются через процедуру шифрования.

Имею мнение, что данные в памяти ключа находятся в зашифрованном виде, а программа внутри себя оперирует с плейнтекстом.

4. На текущий момент обхожу ошибки с истечением срока действия лицензии и с соответствием версии запускаемой программы к версии в лицензии. В дебаггере программа запускается без ошибок, но одним НО: доступный функционал у нее как у программы без какой либо лицензии вообще. То есть я упускаю момент, где из лицензии берутся доступные фичи и разблокируются. Получается отловить вызов "DeleteMenu" и не дать его выполнить, но это никак не меняет результат.

Все еще надеюсь, что в донгле нет жизненноважной информации.



Ранг: 5.5 (гость)
Активность: 0.01=0.01
Статус: Участник

Создано: 06 апреля 2017 13:18
· Личное сообщение · #13

Продолжаем донглострадания...

Решил дальше действовать подменой дллки, реализующей API донгла. Споткнулся на реализации функции ReadMemory. Родная длл после вызова функции очищает стек от параметров, передаваемых функции и ESP принимает значение до первого пуша. Программой эта функция вызывается 3 раза.

В моей же дллке после возвращения из вызова, стек не очищается. На третьем вызове один из передаваемых параметров передается с помощью
Code:
  1. push    [esp+20h+arg_C]

А поскольку значение ESP похерено предыдущими вызовами, передается неверный параметр и ловим сегфолт.

Как писать функции в длл, чтобы стек чистился?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 06 апреля 2017 13:28
· Личное сообщение · #14

Язык-то какой? Менять конвенцию вызова с cdecl на stdcall? втыкать ret 0c вместо ret?

| Сообщение посчитали полезным: deff0

Ранг: 5.5 (гость)
Активность: 0.01=0.01
Статус: Участник

Создано: 06 апреля 2017 14:09
· Личное сообщение · #15

C++, функция типа VOID.




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 06 апреля 2017 14:38 · Поправил: -=AkaBOSS=-
· Личное сообщение · #16

deff0 пишет:
Родная длл после вызова функции очищает стек от параметров, передаваемых функции

очищает после вызова или при возврате?
определись, как выглядит вызов этой функции в программе.

если в программе код вида
push aaa
push bbb
call dword [ReadMemory]
add esp, xx
тогда это нифига не stdcall.



Ранг: 5.5 (гость)
Активность: 0.01=0.01
Статус: Участник

Создано: 06 апреля 2017 14:53 · Поправил: deff0
· Личное сообщение · #17

Получилось вот так
__declspec(dllexport) VOID __stdcall ReadMemory

программе код вида
push aaa
push bbb
call dword [ReadMemory]
push aaa
push ccc
call dword [ReadMemory]
push aaa
push [esp+20h+arg_c]
call dword [ReadMemory]



Ранг: 397.0 (мудрец), 179thx
Активность: 0.170.1
Статус: Участник

Создано: 06 апреля 2017 18:30
· Личное сообщение · #18

#ifndef APIENTRY
#define APIENTRY FAR PASCAL
#endif

void APIENTRY DK2ReadMemory( WORD DataReg,
LPSTR Id,
WORD Seed,
WORD Address,
LPSTR Buffer,
WORD BytesToRead );

Добавлено спустя 1 минуту
это для DK2

-----
...или ты работаешь хорошо, или ты работаешь много...




Ранг: 5.5 (гость)
Активность: 0.01=0.01
Статус: Участник

Создано: 06 апреля 2017 18:35
· Личное сообщение · #19

В третьем так же.


 eXeL@B —› Протекторы —› Донглы DеsКеу
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати