Anda di halaman 1dari 17

Menambahkan serial number pada paket instalasi

(inno setup)
April 5, 2010 Admin Leave a comment Go to comments

Melengkapi koleksi artikel saya tentang pembuatan paket instalasi, kali ini kita akan
menambahkan serial number pada paket instalasi yang kita buat menggunakan Inno Setup.

IKG (Inno Key Generator) adalah Third-Party files yang akan kita gunakan pada artikel ini dan
Inno Setup yang saya gunakan adalah versi 5.0.8.

Silahkan Anda download IKG dari situs resminya atau bisa juga download disini tetapi saya
lebih menyarankan Anda untuk mendownload dari link ke dua saja karena sudah saya seleksi
file-file apa saja yang dibutuhkan.

Jika sudah selesai downloadnya silahkan Anda ekstrak file IKG.rarnya, berikut adalah penjelasan
singkat tentang file-file yang ada di dalam file IKG.rar

1. ISID.dll, file ini dibutuhkan untuk melakukan validasi serial number/unlock


code yang diinputkan pada saat proses instalasi, otomatis harus kita sertakan
pada saat pembuatan paket instalasi.
2. IKG.exe adalah tool untuk mengenerate file Inno Key yang berisi informasi user
+ serial number valid yang sudah terenkripsi, jadi setiap paket instalasi yang
kita buat membutuhkan file inno key yang unik (huhhhh report juga ya)
namanya juga mau aman (walaupun tidak 100%) report sedikitkan engga pa2
kan
3. IKGHelp.pdf, klo yang ini kayaxnya enggak perlu saya jelasin.

Oke langsung saja Anda jalankan file IKG.exe, setelah itu akan tampil form berikut :

Langkah pertama yang harus kita lakukan adalah mengeset password IKG, agar tidak semua
orang bisa menggunakan tool ini.

Klik menu File -> Change Bank Password


Selanjutnya kita tinggal masukkan passwordnya

Untuk menyederhanakan pembahasan, informasi yang akan kita tambahkan pada saat instalasi
kita batasi sebagai berikut :

1. Registered Name
2. Registered Company
3. Registration Code
4. Private Key

Maka konfigurasi yang harus kita set pada tool IKG adalah sebagai berikut :

Kita tinggal menginputkan informasi Registered Name dan Organisation, untuk informasi
Registration Code dan Private Key sudah otomatis terisi.

Jika sudah kita langsung saja simpan file Inno Keynya, file ini berisi informasi Registered Name,
Registered Company, Registration Code dan Private Key (sesuai setting diatas) yang sudah
dienkripsi.
Jadi jika kita akan membuat file setup berikutnya, kita harus mengetik ulang informasi
Registered Name dan Registered Company yang lain (unik) dan menyimpan ulang file Inno Key
(sebaiknya dengan nama yang berbeda).

Sampai disini kita akan memasuki bagian yang paling menyenangkan yaitu coding . Kita akan
menambahkan beberapa baris kode pada bagian [Files] dan [Code].

view source

print?
001 [Files]

002 ;file klien-1.iky dihasilkan oleh tool IKG

003 Source: klien-1.iky; DestDir: {tmp}; Flags: ignoreversion

004 Source: ISID.dll; DestDir: {sys}; Flags: ignoreversion

005

006 [Code]

function ValidateSerialNumber(InnoKeyFile, User, Orgn, ProdCode, HDD, MAC,


007
PrivateKey, Serial: String): Boolean;

008 external 'ValidateSerialNumber@files:ISID.dll stdcall';


009

010 const

011 INNO_KEY = 'klien-1.iky';

012

013 var

014 UserPage : TInputQueryWizardPage;

015 UserValues : TArrayOfString;

016

017 procedure InitializeWizard();

018 begin

019 { create the custom page }

UserPage := CreateInputQueryPage(wpInfoBefore, 'Informasi Registrasi',


020
'Anda memerlukan user yang valid agar bisa melanjutkan proses instalasi',

'Masukkan informasi registrasi (case sensitive), kemudian klik


021
tombol Lanjut >.');

022

023 UserPage.Add('Registered Name:', False);

024 UserPage.Add('Registered Company:', False);

025 UserPage.Add('Registration Code:', False);

026 UserPage.Add('Private Key:', False);

027

028 { Set default values }

029 SetArrayLength(UserValues, 4);

RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion',
030
'RegisteredOwner', UserValues[0]);

RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion',
031
'RegisteredOrganization', UserValues[1]);

032 if (UserValues[0] = '') and (UserValues[1] = '') then begin

033 RegQueryStringValue(HKCU, 'Software\Microsoft\MS Setup (ACME)\User


Info', 'DefName', UserValues[0]);

RegQueryStringValue(HKCU, 'Software\Microsoft\MS Setup (ACME)\User


034
Info', 'DefCompany', UserValues[1]);

035 end;

036

{ Try to find the settings that were stored last time (also see
037
below). }

038 UserPage.Values[0] := GetPreviousData('Name', UserValues[0]);

039 UserPage.Values[1] := GetPreviousData('Company', UserValues[1]);

040 UserPage.Values[2] := GetPreviousData('Unlock', UserValues[2]);

041 UserPage.Values[3] := GetPreviousData('Private', UserValues[3]);

042

043 end;

044

045 procedure RegisterPreviousData(PreviousDataKey: Integer);

046 begin

047 { Store the settings so we can restore them next time }

048 SetPreviousData(PreviousDataKey, 'Name', UserPage.Values[0]);

049 SetPreviousData(PreviousDataKey, 'Company', UserPage.Values[1]);

050 SetPreviousData(PreviousDataKey, 'Unlock', UserPage.Values[2]);

051 SetPreviousData(PreviousDataKey, 'Private', UserPage.Values[3]);

052 end;

053

054 function ScriptDlgPages(CurPage: Integer; BackClicked: Boolean): Boolean;

055 var

056 ExpPath: String;

057

058 begin

059 Result := True;


060

061 if (CurPage = UserPage.ID) then

062 begin

063 ExtractTemporaryFile(INNO_KEY); { the public key file }

064

065 ExpPath := ExpandConstant('{tmp}\' + INNO_KEY);

066

067 Result := False;

068

069 UserValues[0] := UserPage.Values[0];

070 UserValues[1] := UserPage.Values[1];

071 UserValues[2] := UserPage.Values[2];

072 UserValues[3] := UserPage.Values[3];

073

if (UserValues[0] = '') or (UserValues[1] = '') or (UserValues[2]


074
= '') or (UserValues[3] = '') then

075 MsgBox('No fields can be blank !', mbError, MB_OK)

076 else

077 begin

Result := ValidateSerialNumber(ExpPath, UserValues[0],


078
UserValues[1], '', '', '', UserValues[3], UserValues[2]);

079

080 if (not Result) then

081 MsgBox('Invalid Entry !', mbError, MB_OK);

082

083 end

084 end
085 end;

086

087 function NextButtonClick(CurPage: Integer): Boolean;

088 begin

089 Result := ScriptDlgPages(CurPage, False);

090 end;

091

092 function BackButtonClick(CurPage: Integer): Boolean;

093 begin

094 Result := True;//ScriptDlgPages(CurPage, True);

095 end;

096

097 function HasHtmlHelp(): Boolean;

098 begin

099 { HHCTRL.OCX GUID }

Result := RegValueExists(HKCR, 'CLSID\{4662DAB0-D393-11D0-9A56-


100
00C04FB68B66}\InprocServer32', '');

101 end;

102

103 function HasNoHtmlHelp(): Boolean;

104 begin

105 Result := not HasHtmlHelp;

106 end;

Jika sudah selesai silahkan compile (CTRL+F9) skrip inno setup Anda, dan ingat skrip diatas
hanya potongan skrip inno setup. Contoh skrip yang lengkap bisa Anda lihat disini dan sini.
Jika kita mencoba memasukkan informasi registrasi yang salah, maka akan tampil pesan berikut :

Selamat mencoba
[Files]
;file klien-1.iky dihasilkan oleh tool IKG
Source: klien-1.iky; DestDir: {tmp}; Flags: ignoreversion
Source: ISID.dll; DestDir: {sys}; Flags: ignoreversion

[Code]
function ValidateSerialNumber(InnoKeyFile, User, Orgn, ProdCode, HDD, MAC,
PrivateKey, Serial: String): Boolean;
external 'ValidateSerialNumber@files:ISID.dll stdcall';

const
INNO_KEY = 'klien-1.iky';

var
UserPage : TInputQueryWizardPage;
UserValues : TArrayOfString;

procedure InitializeWizard();
begin
{ create the custom page }
UserPage := CreateInputQueryPage(wpInfoBefore, 'Informasi Registrasi',
'Anda memerlukan user yang valid agar bisa melanjutkan proses instalasi',
'Masukkan informasi registrasi (case sensitive), kemudian klik
tombol Lanjut >.');

UserPage.Add('Registered Name:', False);


UserPage.Add('Registered Company:', False);
UserPage.Add('Registration Code:', False);
UserPage.Add('Private Key:', False);

{ Set default values }


SetArrayLength(UserValues, 4);
RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion',
'RegisteredOwner', UserValues[0]);
RegQueryStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion',
'RegisteredOrganization', UserValues[1]);
if (UserValues[0] = '') and (UserValues[1] = '') then begin
RegQueryStringValue(HKCU, 'Software\Microsoft\MS Setup (ACME)\User
Info', 'DefName', UserValues[0]);
RegQueryStringValue(HKCU, 'Software\Microsoft\MS Setup (ACME)\User
Info', 'DefCompany', UserValues[1]);
end;

{ Try to find the settings that were stored last time (also see
below). }
UserPage.Values[0] := GetPreviousData('Name', UserValues[0]);
UserPage.Values[1] := GetPreviousData('Company', UserValues[1]);
UserPage.Values[2] := GetPreviousData('Unlock', UserValues[2]);
UserPage.Values[3] := GetPreviousData('Private', UserValues[3]);

end;

procedure RegisterPreviousData(PreviousDataKey: Integer);


begin
{ Store the settings so we can restore them next time }
SetPreviousData(PreviousDataKey, 'Name', UserPage.Values[0]);
SetPreviousData(PreviousDataKey, 'Company', UserPage.Values[1]);
SetPreviousData(PreviousDataKey, 'Unlock', UserPage.Values[2]);
SetPreviousData(PreviousDataKey, 'Private', UserPage.Values[3]);
end;

function ScriptDlgPages(CurPage: Integer; BackClicked: Boolean): Boolean;


var
ExpPath: String;

begin
Result := True;

if (CurPage = UserPage.ID) then


begin
ExtractTemporaryFile(INNO_KEY); { the public key file }

ExpPath := ExpandConstant('{tmp}\' + INNO_KEY);

Result := False;

UserValues[0] := UserPage.Values[0];
UserValues[1] := UserPage.Values[1];
UserValues[2] := UserPage.Values[2];
UserValues[3] := UserPage.Values[3];

if (UserValues[0] = '') or (UserValues[1] = '') or


(UserValues[2] = '') or (UserValues[3] = '') then
MsgBox('No fields can be blank !', mbError, MB_OK)
else
begin
Result := ValidateSerialNumber(ExpPath, UserValues[0],
UserValues[1], '', '', '', UserValues[3], UserValues[2]);

if (not Result) then


MsgBox('Invalid Entry !', mbError, MB_OK);

end
end
end;

function NextButtonClick(CurPage: Integer): Boolean;


begin
Result := ScriptDlgPages(CurPage, False);
end;

function BackButtonClick(CurPage: Integer): Boolean;


begin
Result := True;//ScriptDlgPages(CurPage, True);
end;

function HasHtmlHelp(): Boolean;


begin
{ HHCTRL.OCX GUID }
Result := RegValueExists(HKCR, 'CLSID\{4662DAB0-D393-11D0-9A56-
00C04FB68B66}\InprocServer32', '');
end;

function HasNoHtmlHelp(): Boolean;


begin
Result := not HasHtmlHelp;
end;
Memanfaatkan library IKG untuk membuat
aktivasi + keygen
May 31, 2010 Admin Leave a comment Go to comments

Sebelumnya saya ucapkan terima kasih kepada salah seorang pengunjung blog saya yang sudah
memberikan koreksi pada salah satu artikel saya yang berjudul Menambahkan serial number
pada paket instalasi (inno setup).

Karena adanya koreksi itu saya jadi punya ide untuk menulis artikel ini

Oke kita langsung saja, file library yang akan kita gunakan disini adalah IKGCG.DLL (untuk
generate serial number) dan ISID.DLL (untuk melakukan validasi serial number)

Langkah awal sebelum kita masuk ke bagian kode program adalah membuat file Inno Key yang
berfungsi sebagai public key yang akan kita distribusikan bersama aplikasi.

Bagaimana cara membuat file Inno Key ini, Anda bisa merujuk ke artikel saya yang berjudul
Menambahkan serial number pada paket instalasi (inno setup).

1. Membuat Form Keygen


Buat project baru kemudian desain tampilan seperti gambar berikut :

download file IKGCG.rar, ekstrak dan copykan ke folder project. Berikut adalah source code
lengkapnya :

view source
print?
01 Option Explicit
02
Private Declare Function GenerateSerialNumber Lib "IKGCG.DLL" (ByVal
innoKeyFile As String, ByVal User As String, ByVal Orgn As String, ByVal
03
ProdCode As String, ByVal HDD As String, ByVal MAC As String, ByVal
privateKey As String, ByVal UnlockCode As String) As Boolean
04
05 Private Function getSerialNumber(ByVal registeredName As String, ByVal
organisation As String) As String
06 Dim innoKeyFile As String

07 Dim privateKey As String


08 Dim serialNumber As String * 12
09 Dim ret As Boolean
10

11 innoKeyFile = App.Path & "\key.iky"


privateKey = "3D07966E-9AB4-4EBE-BF41-91C2D6611AC0" 'nilai ini didapat
12
pada saat pembuatan file inno key
13
ret = GenerateSerialNumber(innoKeyFile, registeredName, organisation,
14
"", "", "", privateKey, serialNumber)
15 getSerialNumber = serialNumber
16 End Function

17
18 Private Sub cmdGenerate_Click()
txtSerialNumber.Text = getSerialNumber(txtRegisteredName.Text,
19
txtOrganisation.Text)
20 End Sub

Hal penting yang perlu diperhatikan pada source code diatas adalah nilai variabel privateKey,
nilai ini harus sama dengan nilai PRIVATE KEY pada saat membuat file Inno Key

2. Membuat Form Aktivasi


Setelah kita selesai mendesain tampilan seperti gambar diatas download file ISID.rar, ekstrak
dan copykan ke folder project. Berikut kode lengkapnya :

view source
print?
01 Option Explicit
02
Private Declare Function ValidateSerialNumber Lib "ISID.DLL" (ByVal
innoKeyFile As String, ByVal User As String, ByVal Orgn As String, ByVal
03
ProdCode As String, ByVal HDD As String, ByVal MAC As String, ByVal
privateKey As String, ByVal Serial As String) As Boolean
04
Public Function isValidSerialNumber(ByVal registeredName As String, ByVal
05
organisation As String, ByVal serialNumber As String) As Boolean
06 Dim innoKeyFile As String

07 Dim privateKey As String


08 Dim ret As Boolean
09
10 innoKeyFile = App.Path & "\key.iky"
privateKey = "3D07966E-9AB4-4EBE-BF41-91C2D6611AC0" 'nilai ini didapat
11
pada saat pembuatan file inno key
12
isValidSerialNumber = ValidateSerialNumber(innoKeyFile, registeredName,
13
organisation, "", "", "", privateKey, serialNumber)
14 End Function

15
16 Public Sub Main()
17 Dim registeredName As String
18 Dim organisation As String
19 Dim serialNumber As String
20
21 registeredName = GetSetting("MyApp", "Aktivasi", "RegisteredName", "")
22 organisation = GetSetting("MyApp", "Aktivasi", "Organisation", "")
23 serialNumber = GetSetting("MyApp", "Aktivasi", "SerialNumber", "")
24
25 If isValidSerialNumber(registeredName, organisation, serialNumber) Then
26 'TODO : tampilkan form utama

27 Else
28 frmAktivasi.Show
29 End If
30 End Sub

Selanjutnya tinggal pangil di form aktivasi seperti berikut :

view source
print?
01 Option Explicit
02

03 Private Sub cmdOk_Click()


If isValidSerialNumber(txtRegisteredName.Text, txtOrganisation.Text,
04
txtSerialNumber.Text) Then
Call SaveSetting("MyApp", "Aktivasi", "RegisteredName",
05
txtRegisteredName.Text)
Call SaveSetting("MyApp", "Aktivasi", "Organisation",
06
txtOrganisation.Text)
Call SaveSetting("MyApp", "Aktivasi", "SerialNumber",
07
txtSerialNumber.Text)
08
09 MsgBox "Aktivasi berhasil", vbInformation, "Informasi"
10
11 'TODO : tampilkan form utama
12

13 Else
14 MsgBox "Aktivasi gagal", vbExclamation, "Peringatan"
15 End If
16 End Sub

17
18 Private Sub Command1_Click()
19 Unload Me
20 End Sub

Selamat MENCOBA
Option Explicit

Private Declare Function GenerateSerialNumber Lib "IKGCG.DLL" (ByVal


innoKeyFile As String, ByVal User As String, ByVal Orgn As String, ByVal
ProdCode As String, ByVal HDD As String, ByVal MAC As String, ByVal
privateKey As String, ByVal UnlockCode As String) As Boolean

Private Function getSerialNumber(ByVal registeredName As String, ByVal


organisation As String) As String
Dim innoKeyFile As String
Dim privateKey As String
Dim serialNumber As String * 12
Dim ret As Boolean

innoKeyFile = App.Path & "\key.iky"


privateKey = "3D07966E-9AB4-4EBE-BF41-91C2D6611AC0" 'nilai ini didapat
pada saat pembuatan file inno key

ret = GenerateSerialNumber(innoKeyFile, registeredName, organisation, "",


"", "", privateKey, serialNumber)
getSerialNumber = serialNumber
End Function

Private Sub cmdGenerate_Click()


txtSerialNumber.Text = getSerialNumber(txtRegisteredName.Text,
txtOrganisation.Text)
End Sub

--------------------------------------------------------------------

Option Explicit

Private Declare Function ValidateSerialNumber Lib "ISID.DLL" (ByVal


innoKeyFile As String, ByVal User As String, ByVal Orgn As String, ByVal
ProdCode As String, ByVal HDD As String, ByVal MAC As String, ByVal
privateKey As String, ByVal Serial As String) As Boolean

Public Function isValidSerialNumber(ByVal registeredName As String, ByVal


organisation As String, ByVal serialNumber As String) As Boolean
Dim innoKeyFile As String
Dim privateKey As String
Dim ret As Boolean

innoKeyFile = App.Path & "\key.iky"


privateKey = "3D07966E-9AB4-4EBE-BF41-91C2D6611AC0" 'nilai ini didapat
pada saat pembuatan file inno key

isValidSerialNumber = ValidateSerialNumber(innoKeyFile, registeredName,


organisation, "", "", "", privateKey, serialNumber)
End Function

Public Sub Main()


Dim registeredName As String
Dim organisation As String
Dim serialNumber As String

registeredName = GetSetting("MyApp", "Aktivasi", "RegisteredName", "")


organisation = GetSetting("MyApp", "Aktivasi", "Organisation", "")
serialNumber = GetSetting("MyApp", "Aktivasi", "SerialNumber", "")

If isValidSerialNumber(registeredName, organisation, serialNumber) Then


'TODO : tampilkan form utama
Else
frmAktivasi.Show
End If
End Sub

----------------------------------------------------------------------

Option Explicit

Private Sub cmdOk_Click()


If isValidSerialNumber(txtRegisteredName.Text, txtOrganisation.Text,
txtSerialNumber.Text) Then
Call SaveSetting("MyApp", "Aktivasi", "RegisteredName",
txtRegisteredName.Text)
Call SaveSetting("MyApp", "Aktivasi", "Organisation",
txtOrganisation.Text)
Call SaveSetting("MyApp", "Aktivasi", "SerialNumber",
txtSerialNumber.Text)

MsgBox "Aktivasi berhasil", vbInformation, "Informasi"

'TODO : tampilkan form utama

Else
MsgBox "Aktivasi gagal", vbExclamation, "Peringatan"
End If
End Sub

Private Sub Command1_Click()


Unload Me
End Sub

Anda mungkin juga menyukai