Menambahkan serial number pada paket instalasi (inno setup)

Posted by Kamarudin • 3 minute read • 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 :grin: 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 (ralat 1 public key inno bisa untuk beberapa user name yg berbeda).
  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 :grin:. Kita akan menambahkan beberapa baris kode pada bagian [Files] dan [Code].

[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;

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 :blush:

Comments