sábado, 12 de abril de 2008

Clase PCGuard en Ruby

PC Guard es una excelente herramienta para la protección de software y generación de licencias de usuario en Windows. Uno de sus productos es el Activation suite, que permite desarrollar aplicaciones que generen licencias válidas de PC Guard.

La documentación del Activation suite Web sólo proporciona ejemplos de uso en PHP y ASP. La siguiente es una clase hecha en Ruby para manejar la validación y generación de licencias.

require 'win32ole'

class PCGuard
  
  # Propiedades de sólo lectura
  attr_reader :activacion, :remocion, :volumendd, :bios, :cpu, :serialdd, :os, :cd, :red
  # Propiedades de lectura y escritura
  attr_accessor :programid, :sitecode, :mid, :features
  
  # Valores del "ResponseCode" del PCGuard
  STATUS_OK = 0             # Success
  STATUS_BAD_SITE_CODE = 1  # Site code is invalid
  STATUS_BAD_PROGRAM_ID = 3 # ProgramID is invalid
  STATUS_BAD_MID_CODE = 6   # Machine ID is invalid
  STATUS_MID_CODE_ERROR = 7 # Machine ID decryption error
  
  # Excepciones que genera la clase
  class BadSiteCode < StandardError; end  
  class BadProgramID < StandardError; end  
  class BadMID < StandardError; end  
  class MIDCodeError < StandardError; end  
  
  # Valida y genera todos los códigos de la licencia
  def initialize(programid = "", sitecode = "", mid = "", features = 0)
    
    # Inicializar variables con los códigos de PCGuard
    @programid, @sitecode, @mid, @features = programid, sitecode, mid, features
    
    # Inicializar variables de las propiedades
    @activacion, @remocion, @volumendd, @bios, @cpu, @serialdd, @os, @cd, @red = "", "", 0, 0, 0, 0, 0, 0, 0
    
    # Generar códigos, si se han pasado todos los campos necesarios al inicializar el objeto
    self.generar unless @programid.empty? || @sitecode.empty? || @mid.empty?
    
  end
  
  # Genera todos los códigos
  def generar
    
    # Generar un error si no se han cargado todos los códigos de PCGuard necesarios para generar una licencia
    raise ArgumentError if  @programid.empty? || @sitecode.empty? || @mid.empty?
    
    # Crear objeto
    l = WIN32OLE.new("icgweb.icgen")
    
    # Inicializar códigos
    l.ProgramID = @programid

    # Generar códigos de ifentificación de la máquina
    l.SiteCode = @sitecode
    l.MachineID = @mid
    l.V5_CheckMachineID()
    
    # Validar
    if l.ResponseCode != STATUS_OK
      raise BadSiteCode if l.ResponseCode == STATUS_BAD_SITE_CODE
      raise BadMID if l.ResponseCode == STATUS_BAD_MID_CODE
      raise MIDCodeError if l.ResponseCode == STATUS_MID_CODE_ERROR
    end
    
    # Generar código de activación y remosión
    l.SiteCode = @sitecode
    l.MachineID = @mid
    l.Features = @features
    l.V5_CalculateActivationCode()
    
    # Validar
    if l.ResponseCode != STATUS_OK
      raise BadSiteCode if l.ResponseCode == STATUS_BAD_SITE_CODE
      raise BadProgramID if l.ResponseCode == STATUS_BAD_PROGRAM_ID
      raise BadMID if l.ResponseCode == STATUS_BAD_MID_CODE
    end
    
    # Asignar valores a las variables del objeto
    @activacion = l.ActivationCode # Código de activación
    @remocion = l.RemoveCode       # Código de remosión
    @volumendd = l.DriveID.to_i    # Hard drive volume serial ID
    @bios = l.BiosID.to_i          # Motherboard bios ID
    @cpu = l.CPUID.to_i            # CPU ID
    @serialdd = l.HDHWID.to_i      # Hard drive hardware ID
    @os = l.OSID.to_i              # Operating system ID
    @cd = l.CDHWID.to_i            # CD/DVD hardware ID
    @red = l.NETID.to_i            # Network card ID 
    
    # Retornar el código de activación de la licencia
    @activacion
    
  end
  
end

Tiene propiedades de lectura/escritura para los códigos principales de PC Guard: ProgramID (programid), Site Code (sitecode), MID (mid) y Features (features); propiedades de sólo lectura para los resultados de la generación: código de activación (activacion), código de remoción (remocion); propiedades de sólo lectura para los código de identificación del equipo: serial de la partición del disco duro (volumendd), BIOS del equipo (bios), CPU (cpu), serial del disco duro (serialdd), sistema operativo (os), CD/DVD (cd), tarjeta de red (red); y un único método para generar todos los códigos (generar).

Para usarla, puedes hacer algo como:

require 'PCGuard'

licencia = PCGuard.new
licencia.programid = "XXXXXXXXXXXXXXXXXXXXXXXX"
licencia.sitecode = "YYYYYYYY"
licencia.mid = "ZZZZ-ZZZZ-ZZZZ-ZZZZ"
licencia.generar  # => "ABCD1234-ABCD1234-ABCD1234-ABCD1234"

O, de manera más resumida:

licencia = PCGuard.new("XXXXXXXXXXXXXXXXXXXXXXXX", "YYYYYYYY", "ZZZZ-ZZZZ-ZZZZ-ZZZZ")

Por supuesto, proporcionando códigos válidos para ProgramID, Site Code y MID.

También genera las siguientes excepciones:

  • ArgumentError: falta alguno de los códigos necesarios (programid, sitecode o mid)
  • BadProgramID: error en el ProgramID (identificador del proveedor de software)
  • BadSiteCode: error en el Site Code del equipo
  • BadMID: error en el MID del equipo
  • MIDCodeError: error en el Site Code y/o el MID.

2 comentarios:

Anónimo dijo...

Hola amigo soy nuevo en esto como puedo hacerle para generar dichos codigos algo asi como un keygen no se si me pudieras ayudar gracias.

Jesús dijo...

("Anónimo", no me dejaste donde responderte, así que lo hago aquí por si lo lees luego)

No sabría cómo generar esos códigos. Para eso uso la herramienta PCGuard (www.sofpro.com). Revisa su web a ver si te sirve para lo que lo necesites.