24 Februari 2009

Mendapatkan ID Unik Dari Suatu Komputer

Pada suatu waktu si Bos minta aku bikinin fitur proteksi pada program untuk PC yang sedang dibuat. Proteksi itu dibuat supaya ga sembarang orang bisa menjalankan program tersebut. Dia juga minta untuk satu komputer, hanya bisa menjalankan satu copy program yang didasarkan seperti punya Windows terbaru yang ada serial number/activation code. Dengan melihat komponen-komponen komputer yang umum dipakai seperti prosesor, motherboard, harddisk, dll, yang paling memungkinkan adalah MAC (Media Access Control) address dari sebuah NIC (Network Interface Card). MAC address adalah alamat fisik dari sebuah kartu jaringan/ethernet yang kebanyakan ada di komputer sekarang.
Dengan mendapatkan MAC address maka dimungkinkan untuk membuat fitur seperti yang sudah disebutkan sebelumnya. Jadi setelah program dijalankan pada sebuah komputer, program tersebut mendapatkan MAC address komputer, dan dengan sebuah algoritma tertentu meminta user memasukkan activation code supaya program bisa dijalankan dengan sempurna tentunya. Weleh ngerepoti aja si Bos ini, tapi gimana lagi, Bos tu, permintaannya adalah sebuah titah (kayak raja aja…). Ya setelah itu dimulailah sebuah perburuan untuk sebuah cara gimana supaya permintaan si Bos dapat terealisasi. Setelah cari-cari dan coba-coba akhirnya aku dapat cara yang cocok buat aku. Source code ini didapat dari sebuah sumber di internet.
uses Classes, SysUtils;

const
  ERROR_SUCCESS = 0;
  MAX_INTERFACE_NAME_LEN = $100;
  MAXLEN_IFDESCR = $100;
  MAXLEN_PHYSADDR = 8;
  MIB_IF_TYPE_ETHERNET = 6;

type
  MIB_IFROW = record
    wszName: array [0..(MAX_INTERFACE_NAME_LEN * 2 - 1)] of Char;
    dwIndex: LongInt;
    dwType: LongInt;
    dwMtu: LongInt;
    dwSpeed: LongInt;
    dwPhysAddrLen: LongInt;
    bPhysAddr: array [0..(MAXLEN_PHYSADDR - 1)] of Byte;
    dwAdminStatus: LongInt;
    dwOperStatus: LongInt;
    dwLastChange: LongInt;
    dwInOctets: LongInt;
    dwInUcastPkts: LongInt;
    dwInNUcastPkts: LongInt;
    dwInDiscards: LongInt;
    dwInErrors: LongInt;
    dwInUnknownProtos: LongInt;
    dwOutOctets: LongInt;
    dwOutUcastPkts: LongInt;
    dwOutNUcastPkts: LongInt;
    dwOutDiscards: LongInt;
    dwOutErrors: LongInt;
    dwOutQLen: LongInt;
    dwDescrLen: LongInt;
    bDescr: array [0..(MAXLEN_IFDESCR - 1)] of Char;
  end;

function GetIfTable(pIfTable: Pointer; var pdwSize: LongInt; bOrder: LongInt): LongInt; stdcall; external 'IPHLPAPI.DLL';

implementation

function GetEthernetAddresses: TStringList;
const
  MAX_ROWS = 20;
type
  IfTable = record
    nRows: LongInt;
    ifRow: array [1..MAX_ROWS] of MIB_IFROW;
  end;
var
  pIfTable: ^IfTable;
  TableSize: LongInt;
  tmp: string;
  i, j: Integer;
  ErrCode: LongInt;
begin
  pIfTable := nil;
  Result := TStringList.Create;
  try
    TableSize := 0;
    GetIfTable(pIfTable, TableSize, 1);
    if (TableSize <>
    GetMem(pIfTable, TableSize);
    ErrCode := GetIfTable(pIfTable, TableSize, 1);
    if ErrCode <> ERROR_SUCCESS then Exit;
    for i := 1 to pIfTable^.nRows do
    begin
      if pIfTable^.ifRow[i].dwType = MIB_IF_TYPE_ETHERNET then
      begin
        tmp := '';
        for j := 0 to pIfTable^.ifRow[i].dwPhysAddrLen - 1 do
          tmp := tmp + Format('%.2x', [pIfTable^.ifRow[i].bPhysAddr[j]]);
        if tmp <> '' then Result.Add(tmp);
      end;
    end;
  finally
    if Assigned(pIfTable) then FreeMem(pIfTable, TableSize);
  end;
end;
Output yang didapat dari script diatas adalah daftar MAC address dari sebuah komputer yang berupa format hexa. Hasil alamat yang sama didapat jika kita menjalankan perintah ipconfig /all dari command prompt.

Tidak ada komentar:

Posting Komentar