Piaro LSSender protocol reverse
Заказал мне недавно один человек отвязку данного софта от железа. Так как сначала хотелось побыстрее сделать кряк и получить свои шекели, то было принято решение снять пакер и пропатчить софт, чтобы работал везде. Моим планам не суждено было сбыться, т.к. заказчик исчез. Чтобы не пропадал софт и потраченное время, я решил посмотреть какую информацию собирает софт о компьютере, как взаимодействует с контрольной панелью и т.д.
Получение информации о железе.
Здесь все как и у всех - используется известная многим либа hddinfo.pas (она была нагуглена по строкам ошибок вида: 'DeviceIoControl filed!', 'GetDevInfoNTScsibyName filed!')
Вот они в дампе:

Чтобы узнать как информация о компьютере будет шифроваться или хэшироваться, можно использовать CryptoSearcher

Как мы видим на скриншоте, программа нашла целых 17 сигнатур, что довольно-таки много для простого спаммера по личкам.
Взаимодействие с сервером.
Так как для данного приложения нужен логин и серийный номер, который мы получаем на сайте автора, то данное приложение должно как-то взаимодействовать с сервером. Чтобы узнать куда стучит и какую информацию получает достаточно обычного снифера. Итак, с помощью снифера мы определили, что приложение обращается к двум скриптам автора:
1. http://%AUTHOR_HOST%/requests/api.php
2. http://%AUTHOR_HOST%/requests/info_api.php
На первый скрипт данные пост запроса выглядят так:
id=1&iv=[data1]&da=base64_encode([data2])
Примеры запросов:
id=1&iv=1fefc75027e719bc&da=base64_encode([data2])
id=1&iv=6355d0e74937b48f&da=base64_encode([data2])
Внимательные заметят, что параметр iv всегда разный по значению но одинаковый по длине. Возможно, этот параметр является ключом к расшифровке полученных от сервера данных.
Разбор данных.
Пример:
как мы видим, данные, полученные от сервера закодированы с помощью алгоритма base64. После раскодирования мы получаем набор каких-то данных, из этого следует, что данные зашифрованы.
За расшифровку отвечает процедура, расположенная по адресу 0070B37C . Так как мы имеем дело с приложением, написанным на делфи, то данные параметры в функцию передаются через регистры. (fastcall)
Как видим данные на сервере шифруются с помощью алгоритма rijndael. Но как мы помним на сервер отсылается параметр iv, который всегда разный. Пропустив процедуры инициализации rijndael мы попадем в цикл расшифровки данных (этот цикл отвечает за расшифроку большинства данных) - 006F85C4
Функция по адресу 06F6898 являет собой обычный ксор
В итоге расшифрованные данные имеют вид:
С полями time и date все понятно, но за что же отвечает поле license. Чтобы узнать это достаточно зарегистрироваться на сайте автора, перейти в панель упраления программами и посмотреть код select'а параметра "Тип лицензии".
Из этого получаем license ids:
1 - стандартная
2 - PRO
3 - Demo
Вот и всё. = )
P.S.: надеюсь, что ваши заказчики не будут такими говноедами. = )
P.P.S.: тем кому надоест обходить антиотладку и прочий треш, советую использовать Phantom Plugin 1.85 для OllyDebugger
Мануал по использованию кряка (Windows):
1. устанавливаем denwer на компьютер
2. в файле hosts пишем 127.0.0.1 www.piaro.org
3. в папке localhost денвера создает папку requests и кладем туда наш скрипт api.php
В итоге получаем прогу с нужной себе лицензией.
В аттаче найдете некоторые наработки по генерации хэша системы и расшифровки файла с лицензией.
Заказал мне недавно один человек отвязку данного софта от железа. Так как сначала хотелось побыстрее сделать кряк и получить свои шекели, то было принято решение снять пакер и пропатчить софт, чтобы работал везде. Моим планам не суждено было сбыться, т.к. заказчик исчез. Чтобы не пропадал софт и потраченное время, я решил посмотреть какую информацию собирает софт о компьютере, как взаимодействует с контрольной панелью и т.д.
Получение информации о железе.
Здесь все как и у всех - используется известная многим либа hddinfo.pas (она была нагуглена по строкам ошибок вида: 'DeviceIoControl filed!', 'GetDevInfoNTScsibyName filed!')
Вот они в дампе:

Чтобы узнать как информация о компьютере будет шифроваться или хэшироваться, можно использовать CryptoSearcher

Как мы видим на скриншоте, программа нашла целых 17 сигнатур, что довольно-таки много для простого спаммера по личкам.
Взаимодействие с сервером.
Так как для данного приложения нужен логин и серийный номер, который мы получаем на сайте автора, то данное приложение должно как-то взаимодействовать с сервером. Чтобы узнать куда стучит и какую информацию получает достаточно обычного снифера. Итак, с помощью снифера мы определили, что приложение обращается к двум скриптам автора:
1. http://%AUTHOR_HOST%/requests/api.php
2. http://%AUTHOR_HOST%/requests/info_api.php
На первый скрипт данные пост запроса выглядят так:
id=1&iv=[data1]&da=base64_encode([data2])
Примеры запросов:
id=1&iv=1fefc75027e719bc&da=base64_encode([data2])
id=1&iv=6355d0e74937b48f&da=base64_encode([data2])
Внимательные заметят, что параметр iv всегда разный по значению но одинаковый по длине. Возможно, этот параметр является ключом к расшифровке полученных от сервера данных.
Разбор данных.
Пример:
Код:
Y0tgGWGAjnEWsbcKPHNJKcy3qiLD5r4rivqypHbMfQMMor3KaMESBrmY8Mmrzj3RwELTSD6BRcYbS0VGt8O6uUQ2DUT9egwqiSTUHJxQCZz3Xfq71qIGprnaHgLaK6D1H9viSOy3L8AdezLnFJ8bODM95NF0fI8vj7/yUVBC1TfpPrb8cZOYLHYBGSA/juAZ
как мы видим, данные, полученные от сервера закодированы с помощью алгоритма base64. После раскодирования мы получаем набор каких-то данных, из этого следует, что данные зашифрованы.
За расшифровку отвечает процедура, расположенная по адресу 0070B37C . Так как мы имеем дело с приложением, написанным на делфи, то данные параметры в функцию передаются через регистры. (fastcall)
Код:
MOV EDX,DWORD PTR SS:[EBP-54h] // данные, которые нужно расшифровать
MOV ECX,070C1B4h // ключ f5e52609 (статически зашит в билд )
XOR EAX,EAX // код алгоритма расшифровки (в данном случае eax = 0; 0 это rijndael)
CALL 070B37Ch
Код:
PUSH EBP
MOV EBP,ESP
PUSH 0h
PUSH 0h
PUSH 0h
PUSH 0h
PUSH 0h
PUSH 0h
PUSH EBX
PUSH ESI
PUSH EDI
MOV DWORD PTR SS:[EBP-8h],ECX
MOV DWORD PTR SS:[EBP-4h],EDX
MOV EBX,EAX <- айди алгоритма
MOV EAX,DWORD PTR SS:[EBP-4h]
CALL 040A334h
MOV EAX,DWORD PTR SS:[EBP-8h]
CALL 040A334h
MOV EAX,DWORD PTR SS:[EBP+10h]
CALL 040A334h
XOR EAX,EAX
PUSH EBP
PUSH 070B575h
PUSH DWORD PTR FS:[EAX]
MOV DWORD PTR FS:[EAX],ESP
TEST EBX,EBX
JNZ L030
MOV EAX,070B594h <- rijndael
CALL 070B2FCh
MOV ESI,EAX
L030:
CMP EBX,1h
JNZ SHORT 0070B3DDh
Как видим данные на сервере шифруются с помощью алгоритма rijndael. Но как мы помним на сервер отсылается параметр iv, который всегда разный. Пропустив процедуры инициализации rijndael мы попадем в цикл расшифровки данных (этот цикл отвечает за расшифроку большинства данных) - 006F85C4
Код:
L000:
MOV ESI,EBX
MOV EDX,ESI
MOV EDI,DWORD PTR SS:[EBP-8h]
MOV EAX,EDI
MOV ECX,10h
CALL 0406950h
LEA EDX,DWORD PTR SS:[EBP-1Ch]
MOV EAX,EDI
MOV ECX,10h
CALL 0406950h
MOV ECX,ESI
MOV EDX,ESI
MOV EAX,DWORD PTR SS:[EBP-4h]
MOV EDI,DWORD PTR DS:[EAX]
CALL DWORD PTR DS:[EDI+88h] < Rijndael.decrypt
MOV EAX,DWORD PTR SS:[EBP-4h]
LEA EDX,DWORD PTR DS:[EAX+50h] <- iv параметр, который являет начальным ксор ключом
MOV EAX,ESI <- данные, которые ксорим
MOV ECX,10h <- 16 байт это длина параметра iv, которая равна размеру блока в алгоритме rijndael
CALL 06F6898h <- !!
MOV EAX,DWORD PTR SS:[EBP-4h]
LEA EDX,DWORD PTR DS:[EAX+50h]
LEA EAX,DWORD PTR SS:[EBP-1Ch]
MOV ECX,10h
CALL 0406950h
ADD DWORD PTR SS:[EBP-8h],8h10h
ADD EBX,10h
DEC DWORD PTR SS:[EBP-0Ch]
JNZ L000
Функция по адресу 06F6898 являет собой обычный ксор
Код:
PUSH ESI
PUSH EDI
MOV ESI,EAX
MOV EDI,EDX
MOV EDX,ECX
DEC EDX
TEST EDX,EDX
JB L015
INC EDX
XOR EAX,EAX
L010:
MOVZX ECX,BYTE PTR DS:[EDI+EAX]
XOR BYTE PTR DS:[ESI+EAX],CL
INC EAX
DEC EDX
JNZ L010
L015:
POP EDI
POP ESI
RET
В итоге расшифрованные данные имеют вид:
Код:
<data>"id":"1";"msg":"%MSG_TEXT%";"license":"%LIC_ID%";"data":"vk.com";</data><time>%REG_TIME%</time><spec>bla-bla-bla</spec><date>%REG_DATE% %REG_TIME%</date>
С полями time и date все понятно, но за что же отвечает поле license. Чтобы узнать это достаточно зарегистрироваться на сайте автора, перейти в панель упраления программами и посмотреть код select'а параметра "Тип лицензии".
Код:
<td class="tdfill1">
<select id="sellic_1" class="sellic cselected">
<option value="0">Выберите лицензию</option>
<option value="1">Стандартная</option><option value="2">Расширенная (PRO)</option><option value="3">Бесплатная (Demo)</option>
</select>
</td>
1 - стандартная
2 - PRO
3 - Demo
Вот и всё. = )
P.S.: надеюсь, что ваши заказчики не будут такими говноедами. = )
P.P.S.: тем кому надоест обходить антиотладку и прочий треш, советую использовать Phantom Plugin 1.85 для OllyDebugger
Мануал по использованию кряка (Windows):
1. устанавливаем denwer на компьютер
2. в файле hosts пишем 127.0.0.1 www.piaro.org
3. в папке localhost денвера создает папку requests и кладем туда наш скрипт api.php
В итоге получаем прогу с нужной себе лицензией.
В аттаче найдете некоторые наработки по генерации хэша системы и расшифровки файла с лицензией.