Как найти отпечатки софта (триальный софт) или как я долго пытаюсь крякнуть софт

BeginnerСracker

Зарегистрированный
Сообщения
7
Реакции
0
Доброго времени суток! Я хочу составить программу, которая будет сбрасывать триал (trial-reset). Сразу скажу, что я не являюсь тем кто долго занимался реверсингом, у меня в этом деле очень мало опыта, я в основной взламывал софт путем эмуляции сервера (на уровне обмена запросов между сервером и клиентом ). Софт, для которого я хочу сделать trial-reset, является закрытым, в сети его невозможно найти, доступ к нему, и саму копию дают определенному коллективу студентов инженеров. В общем, я пытался его несколько раз взломать, путем той-же эмуляции сервера, но не вышло, к сожалению, у них стоит защита от этого, в их софт внедрена защита от Sentinel для контроля лицензии, и судя по админке далеко не последняя версия, про защиту скажу вкратце, что там поднимается локальный сервер и при запуске софта к нему посылаются пакеты для получения информации о компьютере (есть триал или лицензия). Сам софт написан на .net basic, я декомпилировал главный exe, и пытался отвязать от него все модули, которые он использует для проверки лицензии, но я также не смог зависимость между exe'шником и dll'ками отвечающие за работу контроллера лицензии.


В общем, как вы поняли у меня не вышло взломать его таким путем, поэтому я прекратил ковыряться в коде и хочу составить trial-reset, я не мало пробовал узнать где программа хранит отпечатки по которым он определяет что я уже юзал их софт. Я использовал самый топовый софт из рейтинга для удаления программы без следов, но даже он не помог, я почистил все ветки реестра, временные файлы от инсталлера, а также удалил службу который отвечает за работу их контроллера лицензии, но после переустановки программа все равно восстанавливает реальный срок триала. Скажите, как мне найти отпечатки которые софт оставляет для защиты триала ? с чего начать их поиск ? я думал что программа привязывается по железу, но это не так, после переустановки windows, триал сбрасывается.

Извиняюсь за ошибки в тексте. Хотел исправить, но нему невозможно редактировать.
 

zds

Новичок
Постоянный
Сообщения
5
Реакции
13
я так понял лицензия софтверная, а не донгл.
у меня была программа с Sentinel, там тоже была софтверная лицензия
я делал свою scrruntime.dll, которая возвращала нужные мне данные, и подменял оригинальную.
в моем случае вызвались следующие функции и соответственно я реализовал их в своей dll: scr_getInfo, scr_acquireLicenseClient, scr_getIdentity, scr_login, scr_logout, scr_refreshSession, scr_releaseLicenseClient
+ нужно было реализовать некоторые типы scr_LicenseAttribute, scr_License, scr_Feature, scr_GetInfoResponse, которые используются в этих функциях
запусти прогу под отладчиком, поставь точки останова на все экспортируемые функции в scrruntime.dll и посмотри какие вызываются твоей программой и что возвращается. и сделай свою dll где будешь возвращать уже свои значения.
у них на сайте есть SDK он поможет разобраться с функциями и типами.

по поводу где хранит триал, могу только предположить, т.к. сам этим не занимался
на сколько я помню защита создает на ПК файл защищенного хранилища, по типу как в FlexNet, в нем и хранит лицензии. Могу предполжить, что в том числе и триальные. Лицензии привязаны к железу ПК, у Sentinel это называется fingerprint вроде. Поэтому да, скорее всего сбросить триал можно только поменяв fingerprint, который как раз и может меняться после перестановки винды.
 
Последнее редактирование:

BeginnerСracker

Зарегистрированный
Сообщения
7
Реакции
0
я так понял лицензия софтверная, а не донгл.
у меня была программа с Sentinel, там тоже была софтверная лицензия
я делал свою scrruntime.dll, которая возвращала нужные мне данные, и подменял оригинальную.
в моем случае вызвались следующие функции и соответственно я реализовал их в своей dll: scr_getInfo, scr_acquireLicenseClient, scr_getIdentity, scr_login, scr_logout, scr_refreshSession, scr_releaseLicenseClient
+ нужно было реализовать некоторые типы scr_LicenseAttribute, scr_License, scr_Feature, scr_GetInfoResponse, которые используются в этих функциях
запусти прогу под отладчиком, поставь точки останова на все экспортируемые функции в scrruntime.dll и посмотри какие вызываются твоей программой и что возвращается. и сделай свою dll где будешь возвращать уже свои значения.
у них на сайте есть SDK он поможет разобраться с функциями и типами.

по поводу где хранит триал, могу только предположить, т.к. сам этим не занимался
на сколько я помню защита создает на ПК файл защищенного хранилища, по типу как в FlexNet, в нем и хранит лицензии. Могу предполжить, что в том числе и триальные. Лицензии привязаны к железу ПК, у Sentinel это называется fingerprint вроде. Поэтому да, скорее всего сбросить триал можно только поменяв fingerprint, который как раз и может меняться после перестановки винды.
Спасибо за отклик. Кстати, да, там в передаваемых данных к серверу присутствует и блок параметров с названием fingerprint, попробую их подделать, посмотрю что будет, если отправить ложный отпечаток, предполагаю, что сервер выделит новую лицензию для поддельных параметров, нужно будет только их постоянно отправлять при перезапуске софта. А насчет scrruntime.dll, такой dll'ки там нету, ни в файлах локального сервера ни в файлах самого софта, есть только Common.dll
 

zds

Новичок
Постоянный
Сообщения
5
Реакции
13
Спасибо за отклик. Кстати, да, там в передаваемых данных к серверу присутствует и блок параметров с названием fingerprint, попробую их подделать, посмотрю что будет, если отправить ложный отпечаток, предполагаю, что сервер выделит новую лицензию для поддельных параметров, нужно будет только их постоянно отправлять при перезапуске софта. А насчет scrruntime.dll, такой dll'ки там нету, ни в файлах локального сервера ни в файлах самого софта, есть только Common.dll
боюсь, что это не поможет. сервер может и выделит новую лицензию, но ее не примет сама программа, т.к. в ней будет другой fingerprint. из защищенного хранилища будут браться только лицензии с подходящим fingerprint. либо тогда все равно нужно будет патчить его проверку, чтобы программа принимала лицензии с любым fingerprint.
да сейчас посмотрел, scrruntime.lib это название библиотеки в SDK. в моем случае разрабы видимо не особо запаривались и скомпилировали dll с таким же именем. и мне так же еще повезло, что эта dll отвечала только за лицензирование и в ней были функции только из указанной выше библиотеки. поэтому подменить было легко. у тебя она может называться по другому либо они могли вообще не делать отдельную dll для этого, а использовать scrruntime.lib в одной dll вместе со своим кодом, тогда уже надо делать лоадер или еще что-то чтобы при вызове этих функций был переход на твои, где ты уже будешь возвращать свои значения.
 

BeginnerСracker

Зарегистрированный
Сообщения
7
Реакции
0
боюсь, что это не поможет. сервер может и выделит новую лицензию, но ее не примет сама программа, т.к. в ней будет другой fingerprint. из защищенного хранилища будут браться только лицензии с подходящим fingerprint. либо тогда все равно нужно будет патчить его проверку, чтобы программа принимала лицензии с любым fingerprint.
да сейчас посмотрел, scrruntime.lib это название библиотеки в SDK. в моем случае разрабы видимо не особо запаривались и скомпилировали dll с таким же именем. и мне так же еще повезло, что эта dll отвечала только за лицензирование и в ней были функции только из указанной выше библиотеки. поэтому подменить было легко. у тебя она может называться по другому либо они могли вообще не делать отдельную dll для этого, а использовать scrruntime.lib в одной dll вместе со своим кодом, тогда уже надо делать лоадер или еще что-то чтобы при вызове этих функций был переход на твои, где ты уже будешь возвращать свои значения.
Ждал когда закончится триал, чтобы было легче анализировать, долго не стал задерживаться над поиском функций что вы перечислили, потому что предполагал что у меня ничего не выйдет, мне не удалось выйти на библиотеку, которая содержит упомянутые те функции. У меня мало опыта в реверсинге, как я уже говорил и поэтому я хочу взломать эту программу косвенно, то есть, не трогая ее внутренности. Знайте, я вот размышляю.. Я ведь максимально пытался избавится от следов, которые оставляет это программа в системе, даже поменяв mac адреса адаптеров/HWID железа итп. Я у них на форуме спросил где содержится информация о триале, они ответили вот что (рис 1) но я и это чистил то что они перечислили высокоинтеллектуальными сканерами, которые перед установкой программы делают снимок того что она оставила. Как бы мне выйти на остальные следы что я пропустил?
 

Прикрепленные файлы:

sefkrd

Свой в доску..
Ветеран
Сообщения
45
Реакции
110
@BeginnerСracker,
Доров!
Про не размеченные области на хдд прочитал??
Как нашёл, как удалил?
Смещение знаешь?

высокоинтеллектуальными сканерами, которые перед установкой программы делают снимок того что она оставила
Запись информации о лицензии происходит вне файловой системы, поэтому ты не можешь отследить эту запись..
Отсюда и три моих вопроса выше..
 
  • Понравилось
Реакции: mak

BeginnerСracker

Зарегистрированный
Сообщения
7
Реакции
0
s
@BeginnerСracker,
Доров!
Про не размеченные области на хдд прочитал??
Как нашёл, как удалил?
Смещение знаешь?
Привет! Да, прочитал, имеется в виду копия о триале записывается и на другие разделы HDD/SSD? так я все эксперименты проводил на виртуальной машине с одним лишь диском "c". Инсталлер я запускал через reinstaller, чтобы он запомнил следы которые оставляет это программа, и чтобы при деинсталяции их удалял, помимо этого, перед установкой программы я через Procmon смотрел что перед выделением лицензии она записывает в реестр и в папки, почти все это я удалял руками ,потому что маленькую часть оставшихся следов reinstaller почему то не удалял. В общем могу точно быть уверенным в том что я большую часть следов убрал и часть следов о триале, которые содержались в виде .cv2 файлов и в виде подстроки из ресстра .(cv2) . В общем.. не знаю, столько мучаюсь с этим.. в принципе, можно клонировать виртуальную машину каждый раз, и таким образом абузить триал, но согласитесь этой уже какое то извращение.
 

mak

Соломенные сандалии
Администратор
Сообщения
497
Реакции
255
Как мне выйти на эту запись ? и как ее можно удалить?
Любопытный метод скрытия информации, Sentinel использует контейнер

LDK 7.0 – Secure Storage concept and ID mismatch

With HASP Legacy-SL (activated using BSS) we get an activation over Provisional HASP Key. If the machine was reinstalled and use the same legacy-provisional package, this gets installed with a different Key ID. Therefore the previous activation V2C will no longer apply to this new Provisional ID, and ISV has to consume a new activation.

In case of LDK and SL-AdminMode licenses this has bit changed, it is no longer a must to have Provisional SL-AdminMode key installed on the system, the activation in fact works against the fingerprint of the machine. So if the OS is reinstalled, the previous generated activation V2C will “probably” work again (fingerprint of machine did not change).

Within LDK 7.0 (and RTE 6.60) a new concept of SL Secure storage ID has been introduced, so now on the target system, behavior would be same as previous in case system has requisite space in the Hard disk slack.

But if target system doesn’t have enough Hard disk slack (which is quite rare) then you may see error of SL secure storage ID mismatch while reinstalling that old activated V2C.
Вопрос как Sentinel читает его и какова структура контейнера?! Прямым чтением через CreateFile/ReadFile или int 13h, читая каждый сектор или что-то ещё. Лицензия устанавливается и читается, что уже факт для изучения, можно сдампить этот контейнер и посмотреть как он читается. Если это скрытый раздел, то его можно увидеть в менеджере дисков, он будет без назначенной ссылки на него (ссылки по которой его открывают), там могут быть файлы лицензий в зашифрованном виде. Можно вычислить все unallocated sectors и затереть нулями.

Removing provisional licence

It’s not possible to remove a provisional license from the secure storage, unless by wiping the hard disk or following a quite long procedure (we follow it only for rare and particular malfunction cases).
But there are workarounds depending on the kind of license you are testing with.

Option 1)

PRO: Allows to “hide/show” the license for testing purposes with no need to use multiple provisional licenses.
CONS: Cannot be done with SL-Legacy licenses from our 5.x suite (Business Studio)
Even if you cannot remove the license from the secure storage, if you have a provisional license from EMS (not from Business Studio) you can “hide it” as if it was not present.

I am referring to SL-Admin Mode licenses and SL-User Mode licenses of our LDK Product.
In order to check if you installed a SL-Admin Mode provisional license please go to: http://localhost:1947/_int_/devices.html

If you see a row with a 19 digit key ID with “HASP SL AdminMode” under “Key Type” column you have a Admin Mode trial license.
If you have a User Mode, you probably already know it (still it won’t be shown in the Admin Control Centre list).


On your machine go to: C:\Program Files (x86)\Common Files\SafeNet Sentinel\Sentinel LDK\installed
You will find a folder with your numeric “Vendor ID”.
Within it you will see a copy of each v2c you applied to your machine.
The files are named with the key ID, the provisional v2c file will look like: <key id>_provisional.v2c

Remove it from the folder (and keep a copy of it), then restart the Sentinel LDK License Manager service (hasplms.exe)
The license will be not seen any more by API, Envelope, Admin control Centre either.
To restore it, just place back the v2c file on the same folder and restart the License Manager.

Option 2)
PRO: Feasible with any kind of HASP/LDK software license
CONS:
- Will disable any time based & activated license on your machine.
- Will not give “HASP NOT FOUND” error 7, but will return that the license is expired or “Time-Tampered”.

You can force the provisional to expire by moving forward the Windows date of more than 24 hours and restarting the Sentinel Local License Manager service (hasplms.exe).

At this point the license will be “Expired”.

Then move back the local time to the correct one and restart the license manager Sentinel LDK License Manager (hasplms.exe).
At this point the license will be “Time Tampered”.
This method is usually not suggested, but with SL-Legacy there is no other “quick way”, other than formatting the HDD.
Всё зависит от техники скрытия, Analysis of hidden data in the NTFS file system - https://www.forensicfocus.com/articles/analysis-of-hidden-data-in-the-ntfs-file-system/, FragFS: An Advanced Data Hiding Technique - Black Hat https://www.blackhat.com/presentations/bh-federal-06/BH-Fed-06-Thompson/BH-Fed-06-Thompson-up.pdf, Data Hiding Tactics for Windows and Unix File Systems - http://www.berghel.net/publications/data_hiding/data_hiding.php

Здесь был анпакми - SafeNet Sentinel LDK UnPackMe (SafeNet Sentinel LDK 7.4), но файл уже удалён.
 

RET

Посетитель
Новичок
Сообщения
17
Реакции
8
Еще можно посмотреть запрашивается ли хардварный серийник винта, примерно как то так (через сплайсинг):
Код:
NTSTATUS WINAPI newNtDeviceIoControlFile(HANDLE FileHandle,HANDLE Event,PIO_APC_ROUTINE ApcRoutine,PVOID ApcContext,PIO_STATUS_BLOCK IoStatusBlock,ULONG dwIoControlCode,IN PVOID  lpInBuffer,ULONG nInBufferSize,PVOID lpOutBuffer,ULONG  nOutBufferSize)
{
    NTSTATUS status = 0;
    int i = 0;
    char szNameDev[MAX_PATH]={0};
    ULONG re;
    //UNICODE_STRING NameQuery;
    struct { UNICODE_STRING Name; wchar_t Buffer[MAX_PATH]; } NameQuery;

    //if(IOCTL_WDMAUD_OPEN_DEVICE == dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_OPEN_DEVICE"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(IOCTL_WDMAUD_CLOSE_DEVICE ==dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_CLOSE_DEVICE"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(IOCTL_WDMAUD_SUBMIT_WAVE_OUT_HDR ==dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_SUBMIT_WAVE_OUT_HDR"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(IOCTL_WDMAUD_WAVE_OUT_STOP ==dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_WAVE_OUT_STOP"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(IOCTL_WDMAUD_WAVE_OUT_START ==dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_WAVE_OUT_START"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(IOCTL_WDMAUD_READ_MIDI_DATA ==dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_READ_MIDI_DATA"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(IOCTL_WDMAUD_GET_CAPABILITIES ==dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_GET_CAPABILITIES"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(IOCTL_WDMAUD_GET_DEVICE_COUNT ==dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_GET_DEVICE_COUNT"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(IOCTL_WDMAUD_SUBMIT_WAVE_OUT_HDR ==dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_GET_DEVICE_COUNT"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(IOCTL_WDMAUD_OPEN_DEVICE ==dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_GET_DEVICE_COUNT"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(IOCTL_WDMAUD_MIDI_MESSAGE ==dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_GET_DEVICE_COUNT"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(IOCTL_WDMAUD_ADD_DEVICE ==dwIoControlCode) return STATUS_ABANDONED;//{/*strcat(a,"::IOCTL_WDMAUD_GET_DEVICE_COUNT"); OutputDebugStringA(a);*/return trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);}
    //if(0x22414C ==dwIoControlCode) return STATUS_ABANDONED;
    if(NT_SUCCESS(NtQueryObject (FileHandle,ObjectNameInformation,&NameQuery,sizeof(NameQuery),NULL)))
    {
        wcstombs(szNameDev,NameQuery.Buffer,MAX_PATH);
        DPRINTA("|--CONTROL_CODE0x%X---DEVICE:[%s]-->",dwIoControlCode,szNameDev);
        if(!stricmp("\\Device\\WMIDataDevice",szNameDev))
        {
            DPRINTA("WMI .. EXIT");
            return STATUS_DATA_ERROR;
        }
        if(!stricmp("\\Device\\KsecDD",szNameDev))
        {
            DPRINTA("KsecDD .. EXIT");
            return STATUS_ABANDONED;
        }
        if(!stricmp("\\Device\\KSENUM#00000001",szNameDev))
        {
            DPRINTA("KSENUM#00000001 .. EXIT");
            return STATUS_ABANDONED;
        }
    }
    else
    {
        DPRINTA("|--CONTROL_CODE0x%X---UNKNOWN-->",dwIoControlCode);
    }
    LPBYTE lPOutBuf = (BYTE*)lpOutBuffer;
    for(i=0;i<=nOutBufferSize;i++)
    {
        BYTE bX = lPOutBuf[i];
        DPRINTA("Outcode:0x%X",bX);
    }
    LPBYTE lPInBuf = (BYTE*)lpInBuffer;
    for(i=0;i<=nInBufferSize;i++)
    {
        BYTE bXX = lPInBuf[i];
        DPRINTA("Incode:0x%X",bXX);
    }
    return    trueNtDeviceIoControlFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,dwIoControlCode,lpInBuffer,nInBufferSize,lpOutBuffer,nOutBufferSize);
}
 

BeginnerСracker

Зарегистрированный
Сообщения
7
Реакции
0
Всем большое спасибо за советы и помощь! но я забросил это дело спустя 20 дней, нервов уже не хватило. Админ, прошу закрыть тему. Спасибо.
 

mak

Соломенные сандалии
Администратор
Сообщения
497
Реакции
255
@BeginnerСracker, уверены?! Sentinel редкая тема, Вы выложили мало информации, если нет возможности выложить софт, то можно было сделать список файлов, каждый файл пропустить через пеанализер и инфо выложить здесь, в конце концов выложить участки кода разобранные или из защиты. Гадать трудно ..

у них стоит защита от этого, в их софт внедрена защита от Sentinel для контроля лицензии, и судя по админке далеко не последняя версия, про защиту скажу вкратце, что там поднимается локальный сервер и при запуске софта к нему посылаются пакеты для получения информации о компьютере (есть триал или лицензия). Сам софт написан на .net basic, я декомпилировал главный exe, и пытался отвязать от него все модули, которые он использует для проверки лицензии, но я также не смог зависимость между exe'шником и dll'ками отвечающие за работу контроллера лицензии.
Если не софт, то сам Sentinel мог бы выложить, можно было посмотреть как контейнер формируется, с участками кода из проги на триал была бы надежда. Был бы идентичный софт как пример из сети, можно было другой посмотреть.

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

Если уже прям так, то можно дать удалённый доступ и найти специалиста здесь -Поиск специалистов.
 
  • Понравилось
Реакции: RET

BeginnerСracker

Зарегистрированный
Сообщения
7
Реакции
0
@mak уверен. Больше не интересно в нем копаться, если кому-то вдруг нужно будет для экспериментов, вот инсталлятор: https://dropmefiles.com/YI0az интересный код содержится в dll'ке Common.dll который находится в корне программы, написан на .net basic без обфускаторов. Самое интересное что практический весь код самой программы полностью открыт, но даже тут не получилось как-то изменить точку входа, чтобы никакая защита не сработала а прога тупа бы запустилась..
 
Верх Низ