powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вопрос по API ф-циям AsProtect если кто сталкивался или умеет использовать "сложные" API.
7 сообщений из 7, страница 1 из 1
Вопрос по API ф-циям AsProtect если кто сталкивался или умеет использовать "сложные" API.
    #38314860
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно в описании в разделе
Notes for developers on Visual Basic
сказано буквально следующее:
As Visual Basic compiler has some specifics, using of API functions with VB will differ from work with other compilers (such as Delphi, Visual C++). VB API currently consists of only 4 functions.

Their calls are described as follows:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Declare Function apiGetRegistrationBuffer Lib "asprotect.dll" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Declare Function apiGetHardwareID Lib "asprotect.dll" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Declare Function apiGetTrialDays Lib "asprotect.dll" () As Long

Declare Function apiGetTrialExecs Lib "asprotect.dll" () As Long


Эти 4 (ну крайнюю не пробовал - мне она не интересна) работают как заявлено.

При этом API (описанных в разделе API description) как таковых там несколько сильно больше. Замечено
1) Названия тех же API для C++/Dephi отличаются
Например вместо apiGetTrialDays описана GetTrialDays
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
GetTrialDays  

Description:

GetTrialDays – obains the trial period parameters, i.e. total and remaining days.

Declaration:

For Delphi: 

procedure GetTrialDays(Total, Left : DWORD);stdcall;

For C++: 

void __declspec(dllexport) __stdcall GetTrialDays(int Total, int Left)

Sample:

For Delphi: 

const

  TrialDaysTotal : Integer = -1;

  TrialDaysLeft   : Integer = -1;

procedure GetTrialDays(Total, Left : DWORD);stdcall;

begin

  TrialDaysTotal := Total;

  TrialDaysLeft  := Left;

end;

exports GetTrialDays;

begin

   Label2.Caption := 'Unregistered trial version'#13#10#13#10'You have '+IntToStr(TrialDaysLeft)+' day(s) left';

end;

For C++: 

int TrialDaysTotal = -1,
 TrialDaysLeft = -1;

void __declspec(dllexport) __stdcall GetTrialDays(int Total, int Left){
 TrialDaysTotal = Total;
 TrialDaysLeft  = Left;
}

...

{
 char buf[100];
 wsprintf(buf, "You have %d day(s) left", TrialDaysLeft);
 MessageBox(0,buf, "Unregistered version",MB_ICONSTOP);
}



2) Ну и есть другие, нек. из которых прямо скажем интересны
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
GetKeyExpirationDate  

Description: 

GetKeyExpirationDate – receives the expiration date for registration key. 

Declaration: 

For Delphi: 

procedure GetKeyExpirationDate(Day, Month, Year : WORD);stdcall;
exports GetRegistrationInformation;

Sample: 

For Delphi:< /p> 

procedure GetKeyExpirationDate(Day, Month, Year : WORD);stdcall;
begin
  kDay    := Day;
  kMonth := Month;
  kYear   := Year;
end;
exports GetKeyExpirationDate;



Так вот, вопрос.
Глядя на все это - имеется в виду примеры C-шных и Delphi кодов - нет ли способа таки задействовать эти не-VB-шные API?
На основании здравой мысли, что если API есть, то она должна как-то вызываться из любого языка.
Наплевав на фразу "VB API currently consists of only 4 functions"???

У меня не получилось.

Вкратце о конкретной проблеме. Имеющиеся 4 VB-шные API ф-ции
1)дают ответ на вопрос есть ли лицензия
2) не отвечают на вопрос ИСТЕК ЛИ СРОК ЕЕ ДЕЙСТВИЯ
Т.е. если KeyExpirationDate=1 Августа, то и 31июля, и 3 августа VB скажет что лицензия есть, но не скажет что срок истек.
А временные лицензии иногда люди выпрашивают.

Можно конечно использовать стандартную защиту.
Т.е. когда триал закончился или Expiration Date наступил, при запуске выводится стандартный Msgbox и на этом работа заканчивается.
Но это
1) некрасиво
2) программа вообще не запустится, а у меня заготовлено так что ключ вводится через основной exe-шник. (В предыдущей проге были раздельные модули).
...
Рейтинг: 0 / 0
Вопрос по API ф-циям AsProtect если кто сталкивался или умеет использовать "сложные" API.
    #38315101
Дмитрий77,

по идее API должны быть написаны так, чтобы их можно было вызвать из программы на любом языке (и с использованием любой run-time library), поддерживающем данные соглашения вызова. Но, возможно, специфика ASProtect такова, что при вызове своей API она должна определять, какой компилятор/RTL был использован для создания защищаемого модуля. "Не получилось" что/как именно?

P.S. Вика говорит, что "в настоящий момент защита программ, защищённых ASProtect, обходится".
...
Рейтинг: 0 / 0
Вопрос по API ф-циям AsProtect если кто сталкивался или умеет использовать "сложные" API.
    #38315212
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13-й квартал,

Не получилось вместо
Код: vbnet
1.
Declare Function apiGetTrialDays Lib "asprotect.dll" () As Long

(как у них в документации по VB6)

написать и как-то это использовать, т.е. получить результат
Код: vbnet
1.
Declare Function GetTrialDays Lib "asprotect.dll" (ByVal Total as Long, ByVal Left as Long) As Long

(как "следует" из документации по C++)

И думаю не получится. Я думаю это абсолютно разные API с абсолютно другими механизмами.

Я накатал тестовый примитивный Win32 Console exe в C++ и он полностью рабочий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
// LicenceC.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

char*	LocalHardwareID		= NULL;
char*	UserName			= NULL;

int		TrialDaysTotal		= -1,
		TrialDaysLeft		= -1;

int		TrialExpireDay		= -1,
		TrialExpireMonth		= -1,
		TrialExpireYear		= -1;

int		KeyExpireDay		= -1,
		KeyExpireMonth		= -1,
		KeyExpireYear		= -1;

//---------------------------------------------------------------------
//  This procedure will be called by ASProtect for
//  setting of hardware key
//---------------------------------------------------------------------
void __declspec(dllexport) __stdcall GetHardwareID(char*	HardwareID){
	
    LocalHardwareID = HardwareID;
}
//---------------------------------------------------------------------
//----------------------------------------------------------------------
// Try to get a registration information.
// ASProtect will set this information after a checking of a registraion 
// key
//----------------------------------------------------------------------
void __declspec(dllexport) __stdcall GetRegistrationInformation(char* NewUserName){

	UserName = NewUserName;
}
//----------------------------------------------------------------------
// ASProtect will set a trial information after a checking of a registraion 
// key
//----------------------------------------------------------------------
void __declspec(dllexport) __stdcall GetTrialDays(int Total, int Left){
	
	TrialDaysTotal = Total;
	TrialDaysLeft  = Left;
}
//---------------------------------------------------------------------
void __declspec(dllexport) __stdcall GetExpirationDate(int Day, int Month, int Year){
	
	TrialExpireDay = Day;
	TrialExpireMonth  = Month;
	TrialExpireYear  = Year;
}
void __declspec(dllexport) __stdcall GetKeyExpirationDate(int Day, int Month, int Year){
	
	KeyExpireDay = Day;
	KeyExpireMonth  = Month;
	KeyExpireYear  = Year;
}

int _tmain(int argc, _TCHAR* argv[])
{
	printf("HardwareID= %s\n", LocalHardwareID);
	printf("UserName= %s\n", UserName);
	printf("TrialDaysTotal= %d, TrialDaysLeft= %d\n",TrialDaysTotal, TrialDaysLeft);
	printf("TrialExpire= %d.%d.%d\n", TrialExpireDay,TrialExpireMonth,TrialExpireYear);
	printf("KeyExpire= %d.%d.%d\n", KeyExpireDay,KeyExpireMonth,KeyExpireYear);
	return 0;
}


Т.е. идея такая: при запуске защищенного exe, Asprotect сам вызывает свои "API" c нужными аргументами и при исполнении (см. код) эти аргументы сохраняются в независимых переменных в программе, и программа знает UserName,KeyExpireDay и т.п. И сдается мне, в VB6 такой механизм просто не работает.

А что касается VB-шных 4-рех API, они вызываются из программы пользовательским кодом.
Код: vbnet
1.
2.
3.
Sub Form_Load()
   TrialDaysLeft=apiGetTrialDays() 'вызов API
End Sub

в режиме вопрос-ответ.

В VB-шных API проблема с пониманием лицензии с "Expiration Date"
Т.е. если
Expiration Date = "1 августа", а лицензия на имя "Vasja"
то C-шный (см. выделенные строчки) код 30 июля будет выдавать:
Код: plaintext
1.
2.
UserName="Vasja" //есть лицензия для Васи
KeyExpire = 01.08.2013 //1 августа она истекает


а 2 августа выдаст
Код: plaintext
1.
2.
UserName="" //нет лицензии (если и есть, то недействительна) Имя пустое!!!
KeyExpire = 01.08.2013 //1 августа временная лицензия истекла


Т.е. по сути у меня аж 2 ф-ции (GetKeyExpirationDate -могу сравнить с тек. датой и GetRegistrationInformation -пустое имя означает что лицензии нет или она истекла) чтоб понять что лицензия истекла

А в VB6 у меня единственная ф-ция
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Declare Function apiGetRegistrationBuffer Lib "asprotect.dll" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Function GetRegName() As String
Dim RegName As String
    ' Receive a Registration Info from API's apiGetRegInfo function
     RegName = String$(255, 0)
     GetRegName = Left(RegName, apiGetRegistrationBuffer(RegName, InStr(RegName, Chr(0)) - 1))
End Function



И мало того что я не знаю KeyExpire = 01.08.2013, так эта ф-ция еще и не работает правильно, т.е.
VB6 30 июля будет выдавать
Код: vbnet
1.
UserName="Vasja"


и 2 августа будет выдавать
Код: vbnet
1.
UserName="Vasja"


Невозможно различить ВРЕМЕННАЯ ЛИЦЕНЗИЯ ЕЩЕ ДЕЙСТВИТЕЛЬНА и СРОК ВРЕМЕННОЙ ЛИЦЕНЗИИ ИСТЕК.
Т.е. временный ключ воспринимается как постоянный.

По идее я могу запускать C-шный exe шник и возвращать недостающую информацию в VB6
Либо через return (ExitCode=число содержащее результат)
Либо через return (ExitCode=Ptr на ячейку памяти где хранится структура с результатом)

Вопрос: как из C(++) реализовать запись структуры в область памяти с указателем Ptr чтоб не стерлось при выходе из программы?

Либо надо преобразовать C++.exe в C++.dll, наделить эту dll API-ф-цией GetLicence(...) и вызывать тупо из VB6.
Но здесь потенциальная проблема: надо чтоб при вызове GetLicence(...) из dll автоматически исполнялись ф-ции защиты, которые сбрасывают нужные значения в UserName, KeyExpire и т.д. в переменные внутри dll (как это делает exe-шник код которого выше) чтоб моя API смогла их вернуть.
Вопрос: как сделать такую dll? Содержащую API кот. можно вызвать из VB6? Простенький пример?

Но. Есть проблема. То о чем я пишу, НЕ ЗАЩИЩЕНО.
Т.е. exe или dll тупо подменяется "ломаным вариантом", кот. возвращает через return или через API желаемый результат вместо настоящего(содержащего статус лицензии).

Вопрос: как проверить, что exe-шник кот. я запускаю или dll из кот. я вызываю API именно МОИ РОДНЫЕ а не ХАКЕР ПРОДАКШН?
...
Рейтинг: 0 / 0
Вопрос по API ф-циям AsProtect если кто сталкивался или умеет использовать "сложные" API.
    #38315314
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну DLL-ку я сделал, долго мучился пока с .def файлом не разобрался:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
char*	UserName			= NULL;
int		KeyExpireDay		= -1,
		KeyExpireMonth		= -1,
		KeyExpireYear		= -1;

void __declspec(dllexport) __stdcall GetRegistrationInformation(char* NewUserName){

	UserName = NewUserName;
}
void __declspec(dllexport) __stdcall GetKeyExpirationDate(int Day, int Month, int Year){
	
	KeyExpireDay = Day;
	KeyExpireMonth  = Month;
	KeyExpireYear  = Year;
}

extern "C" {

char * __stdcall CPP_Get_Registration_Information()
{ 
  return UserName;
}

int __stdcall CPP_Get_Key_Expiration_Date(int * Day, int * Month, int * Year)
{ 
  * Day = KeyExpireDay;
  * Month = KeyExpireMonth;
  * Year = KeyExpireYear;
  return 0;
}

}; // extern "C"



Т.е. "недостающие" API вызываются в С++, а C++ отдает инфу в VB6 для чего я написал свои API ("обычные").

Из VB я вызываю свои API:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Private Declare Function CPP_Get_Registration_Information Lib "LicenseDll.dll" () As Long
Private Declare Function CPP_Get_Key_Expiration_Date Lib "LicenseDll.dll" _
 (ByRef Day As Long, ByRef Month As Long, ByRef Year As Long) As Long

Private Sub CommandGetRegistrationInformation_Click()
  MsgBox PtrToString(CPP_Get_Registration_Information)
End Sub

Private Sub CommandGetKeyExpirationDate_Click()
  Dim Day As Long
  Dim Month As Long
  Dim Year As Long
  
  CPP_Get_Key_Expiration_Date Day, Month, Year
  'MsgBox Day & "." & Month & "." & Year
  If (Day <> 0) And (Month <> 0) And (Year <> 0) Then
    MsgBox "Expiration date=" & DateSerial(Year, Month, Day)
    If DateValue(Now) > DateSerial(Year, Month, Day) Then
      MsgBox "License Expired"
    End If
  Else
    MsgBox "No Expiration date"
  End If
End Sub

Function PtrToString(Ptr As Long) As String
    Dim Data As Byte
    Dim str As String
    Dim i As Long
    str = ""
    If Ptr <> 0 Then
        For i = 0 To 10000 '255
            CopyMemory Data, ByVal Ptr + i, 1
            If Data = 0 Then Exit For
            str = str & Chr(Data)
        Next i
    End If
    PtrToString = str
End Function



Но открытым тогда остается вопрос защиты этого обмена:
Вопрос: как проверить, что exe-шник кот. я запускаю или dll из кот. я вызываю API именно МОИ РОДНЫЕ а не ХАКЕР ПРОДАКШН?

Т.е. dll -только подстраховка - уточнение информации (на случай временной лицензии чтоб отсекать ее Expiration Date). И exe, и dll защищены.
Но теоретически остается возможность подменить dll на "с такими же ф-циями и таким же именем" и влить в exe-шник неправильный Expiration Date.

Моя идея - из exe-шника проверить файл dll на валидность, и если что не так, то вызовы к ней не производить, лицензию считать отсутствующей и функционал не запускать.

Как сделать?
На языке вертится MD5.
Могу подписать Dll Microsoft-овской подписью (реальной).
Тогда вопрос: как проверить что dll суть подписанный правильной подписью файл?

С другой стороны, все ключи привязаны к железу. Временных ключей единицы.
Предположить что кто-то выпросит временный ключ и потом будет ломать дату его окончания "чисто для себя"....
Чет в это слабо верится.
...
Рейтинг: 0 / 0
Вопрос по API ф-циям AsProtect если кто сталкивался или умеет использовать "сложные" API.
    #38315323
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пример с вычислением md5 файла нашел.

Достаточно ли перед вызовом API проверить md5 вызываемой dll-ки и как и какой момент это лучше сделать?
Т.е. чтоб не получилось, что моя лежит в папке с прогой, я проверяю md5 файла App.path\mydll.dll
И прога тут же запускает левую dll лежащую где-то в System32.
...
Рейтинг: 0 / 0
Вопрос по API ф-циям AsProtect если кто сталкивался или умеет использовать "сложные" API.
    #38315760
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77написать и как-то это использовать, т.е. получить результат
Код: vbnet
1.
Declare Function GetTrialDays Lib "asprotect.dll" (ByVal Total as Long, ByVal Left as Long) As Long


(как "следует" из документации по C++)

И думаю не получится. Я думаю это абсолютно разные API с абсолютно другими механизмами.

Так объявлять пробовал ?
Код: vbnet
1.
Declare Sub GetTrialDays Lib "asprotect.dll" (Total as Long, Left as Long)
...
Рейтинг: 0 / 0
Вопрос по API ф-циям AsProtect если кто сталкивался или умеет использовать "сложные" API.
    #38316084
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища,

пробовал, я кстати часть "своих" так на void переделал.

Но это не поможет.
Там эти API "неправильные" хитрые. Обрати внимание на документацию и на приведенный мной C-шный код.
AsProtect-API не вызываются. Их надо вставить в код как void __declspec(dllexport) __stdcall . Т.е. как бы ты сам дописываешь что они делают.
А фишка в том, что при запуске exe или dll Asprotect их сам вызывает с параметрами которые надо узнать. Они не возвращают то что надо узнать, они засовывают это в код.
А я в отличии от AsProtect ответа не знаю и в лучшем случае запущу их их VB6 с нулями.

На VB6 API делать можно? Насколько знаю нельзя.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вопрос по API ф-циям AsProtect если кто сталкивался или умеет использовать "сложные" API.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]