[Dúvida] Como fazer o recurso de licenças

36 respostas
C

Estou com uma dúvida, como criar um sistema de licenças para minha aplicação java. Já existe alguma API? Estou precisando vender softwares mas quero por licenças (seriais)…
Abraços

36 Respostas

dyorgio

Desconheço uma solução comercial pronta para isso, pois normalmente é um segredo seu e de seu software.
a dica é trabalhar com licenças baseadas no MAC da placa de rede, que é acessivel no Java.

Nas minhas eu trabalho com data tb, para impedir que o usuario use pra sempre…
ai sempre que fecho o programa guardo a data do PC.
assim consigo saber se ele esta tentando voltar o relogio :slight_smile:
haehahehaheae, era isso.

Mais como falado em 200 topicos aqui do GUJ, sempre é possivel quebrar.
ainda mais se a sua app ficar popular, e cair na mão de um programador java.

M

dyorgio:
Desconheço uma solução comercial pronta para isso, pois normalmente é um segredo seu e de seu software.
a dica é trabalhar com licenças baseadas no MAC da placa de rede, que é acessivel no Java.

Mas para tanto é preciso usar APIs a parte, certo? Ou existe algum método para fazer isso somente com as APIs do JRE?

dyorgio

A JRE tem tudo…:smiley: \o/

assim:

byte[] mac = NetworkInterface.getNetworkInterfaces().nextElement().getHardwareAddress();

claro…ai peguei da primeira, o certo é ir vendo uma a uma, e eliminando a de lookback e as virtuais.
tentando achar a fisica apenas.

M

Interessante… dessa eu não sabia. Da última vez que fui mexer com MAC usei uma API externa (bom, na verdade precisei mesmo pois o programa não se limitava a verificar o MAC da máquina local; ele analisava o que entrava e saia da placa de rede).

lina

Oi,

Realmente interessante… como o método getNetworkInterfaces() retorna um Enumeration, você poderá pegar todos os MACs da maquina utilizando a função hasMoreElements().

Tchauzin!

C

Bom dia, realmente gostei. Porém, como distinguir qual é a física? Tem como nos dizer como fez pra saber qual é o MAC real? Pois em minha máquina eu tenho duas físicas e uma virtual. Agradeço a ajuda, e já estou fazendo criptografia. Tocando no assunto de criptografia, eu soube que há um programa que criptografa nossas aplicações para que programadores java não abram para ver o código usando um decompiler da vida. Alguém sabe sobre isto? Sabe se é válido? Pois tenho clientes que comprar aplicações mas estão nem querendo pagar mais atualizações porque eles já tem o código e podem mexer. u.ú

Agradeço a ajuda…

M

Procure por obfuscador de código Java (tem um muito bom no SF, só não lembro o nome). Lembre-se que essas ferramentas apenas atrapalham a decompilação mas não a impedem.

C

Humm, SF ? O.o
Bom se puder me enviar uma MP com o link seria bom. O problema é esse queria ver se consigo pelo menos obfuscar a maioria do código. Aguardo ^^ e agradeço pela help.

M

SF = SourceForge :slight_smile:

O nome do obfuscador é ProGuard e pode ser encontrado aqui: http://proguard.sourceforge.net/

dyorgio

Desculpe a demora CaioO, estou sem net em casa :(, derrota…

segue o codigo que uso, ele ja esta bem maduro, e tem partes dele que nem lembro porque fiz :slight_smile:
mais sei que esta totalmente funcional :slight_smile:

segue :

/**
	 * Carrega a identificação do computador através do MAC da placa de rede.
	 * 
	 * @return A identificação do computador.
	 * @throws SocketException
	 *             Caso ocorra algum problema relacionado a I/O durante o
	 *             processo.
	 */
	public static byte[] getComputerIdentifier() throws SocketException {
		NetworkInterface bestInterface = null;
		final Enumeration<NetworkInterface> interfaces = NetworkInterface
				.getNetworkInterfaces();

		Field indexField = null;
		try {
			indexField = NetworkInterface.class.getDeclaredField("index");
                        indexField.setAccessible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
		

		while (interfaces.hasMoreElements()) {
			final NetworkInterface atualInterface = interfaces.nextElement();
			if (!atualInterface.isLoopback() && !atualInterface.isVirtual()
					&& !atualInterface.isPointToPoint()
					&& atualInterface.getHardwareAddress() != null) {
				try {
					if (bestInterface == null
							|| (indexField == null || indexField
									.getInt(bestInterface) > indexField
									.getInt(atualInterface))) {
						bestInterface = atualInterface;
						InetAddress address = InetAddress.getLocalHost();
						NetworkInterface.getByInetAddress(address);
						if (indexField == null) {
							break;
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		}

		if (bestInterface != null) {
			return bestInterface.getHardwareAddress();
		} else {
			throw new RuntimeException(
					"Nenhuma interface de rede habilitada para identificação do computador encontrada.");
		}
	}
lina

Oi Dyorgio,

Não entendi algumas coisas do método, poderia me explicar?

Por exemplo, a utilização da variavel Field indexField.

Tchauzin!

dyorgio

Essa variavel é um hack :slight_smile:
estou usando reflexão para obter acesso a uma variavel privada do NetworkInterface,
que é o index da interface no sistema.

assim se eu conseguir obter essa variavel via reflection eu uso ela para dar prioridade as minhas interfaces…

ou seja, pego a com index menor, pois julgo ser a interface fisica primaria do computador.

ela sempre esta la, mais como é private trato a possibilidade da não-existencia dela tb :), HACK, POG, “ajuste fino” haehahehaehahehae

lina

Oi,

Entendi agora… Obrigada

Tchauzin!

sergiotaborda

CaioO:
Estou com uma dúvida, como criar um sistema de licenças para minha aplicação java. Já existe alguma API? Estou precisando vender softwares mas quero por licenças (seriais)…

A licença tem dois objetivos

  1. Permitir que o sistema seja usado em conformidade com o contrato
  2. Validar que o sistema está sendo usado em conformidade com um contrato.

Se o contrato declara uma validade para a licença, isso significa que a licença electronica do sistema expirará no mesmo dia.
Se o sistema não encontrar uma licença válida, ele simplesmente não funciona.

As propriedades que o contrato impoe são variadas e podem ser tão complexas quando o proprio contrato. Portanto é impossivel criar um modelo de licença que atenta a todos.

A forma mais simples de uma licença é a criação de um properties com as propriedades que a licença tem. Data de validade, nome da empresa, numero de usuarios simultaneos, features permitidas, etc…

Depois vc usa um algoritmo de encriptação de chave publica-privada duplo.

O cliente entra no sistema sem licença. O sistema sabe isto e mostra uma tela para entrar dados de licença.
O sistema gera um par de chaves. guarda a privada e envia a publica para si.

Vc gera outro par de chaves. guarda a privada que gerou e a publica que recebeu num sistema de gerenciamento de licenças (sim, vc precisa criar este sistema)
Vc usa as duas chaves para encriptar o arquivo. primeiro a publica vinda do sistema e depois a privada que vc gerou.
Ai vc enviar a publica que vc gerou e o arquivo de licença (se quiser pode inventar um formato de arquivo para mandar as duas coisas num arquivo so).

O sistema verifica que existe um arquivo de licença , a chave privada que ele guardou e a publica que foi enviada. Ele usa os três para abrir o arquivo de properties.

Informações como a ultima data em que o sistema foi usado pode ser guardada no registro usando a Properties API (não a classe Properties).
encriptar isso pode tb ajudar, mas tem que ter cuidado em tratar a ausencia de informações anteriores.

Todo este esquema não evita que alguem faça um hack no seu codigo e modifque as classes que testam as propriedades da licença. Isso é um outro problema. (dica: vc pode codificar as classes com o mesmo algoritmo, e criar um Classloader especial que carregue as classes “autenticas”).

Não vincule a licença a propriedades da máquina porque isso pode mudar (se cara muda a placa de rede ou muda de computador). Vc vai criar trabalho para si mesmo. Mas a escolha é sua…

lina

sergiotaborda:
CaioO:
Estou com uma dúvida, como criar um sistema de licenças para minha aplicação java. Já existe alguma API? Estou precisando vender softwares mas quero por licenças (seriais)…

A licença tem dois objetivos

  1. Permitir que o sistema seja usado em conformidade com o contrato
  2. Validar que o sistema está sendo usado em conformidade com um contrato.

Se o contrato declara uma validade para a licença, isso significa que a licença electronica do sistema expirará no mesmo dia.
Se o sistema não encontrar uma licença válida, ele simplesmente não funciona.

As propriedades que o contrato impoe são variadas e podem ser tão complexas quando o proprio contrato. Portanto é impossivel criar um modelo de licença que atenta a todos.

A forma mais simples de uma licença é a criação de um properties com as propriedades que a licença tem. Data de validade, nome da empresa, numero de usuarios simultaneos, features permitidas, etc…

Depois vc usa um algoritmo de encriptação de chave publica-privada duplo.

O cliente entra no sistema sem licença. O sistema sabe isto e mostra uma tela para entrar dados de licença.
O sistema gera um par de chaves. guarda a privada e envia a publica para si.

Vc gera outro par de chaves. guarda a privada que gerou e a publica que recebeu num sistema de gerenciamento de licenças (sim, vc precisa criar este sistema)
Vc usa as duas chaves para encriptar o arquivo. primeiro a publica vinda do sistema e depois a privada que vc gerou.
Ai vc enviar a publica que vc gerou e o arquivo de licença (se quiser pode inventar um formato de arquivo para mandar as duas coisas num arquivo so).

O sistema verifica que existe um arquivo de licença , a chave privada que ele guardou e a publica que foi enviada. Ele usa os três para abrir o arquivo de properties.

Informações como a ultima data em que o sistema foi usado pode ser guardada no registro usando a Properties API (não a classe Properties).
encriptar isso pode tb ajudar, mas tem que ter cuidado em tratar a ausencia de informações anteriores.

Todo este esquema não evita que alguem faça um hack no seu codigo e modifque as classes que testam as propriedades da licença. Isso é um outro problema. (dica: vc pode codificar as classes com o mesmo algoritmo, e criar um Classloader especial que carregue as classes “autenticas”).

Não vincule a licença a propriedades da máquina porque isso pode mudar (se cara muda a placa de rede ou muda de computador). Vc vai criar trabalho para si mesmo. Mas a escolha é sua…

Oi,

Perfeita a sua colação. A minha aplicação hoje faz esse tipo de licença.
No contrato o Cliente informa a quantidade de Lojas que irá ter o software instalado (Caso tenho uma rede comercial de 5 lojas, deverá ser confirmado no cadastro 5 lojas), a data de validade de contrato, CNPJ etc…

Geramos um código criptografado e enviamos para o Cliente. Caso o cliente (via sistema) tentar alterar os dados de cadastro e o mesmo não bater com o código seguro, automaticamente é mostrado uma mensagem de segurança.

Caso a data de expiração para o uso do sistema acabar, deverá ser entrado em contato com a empresa do Software solicitando um novo código Seguro.

Este controle do MAC é viável para controle interno de uma aplicação. Ex: Se você tem um Servidor onde vários Clients requerem autenticação… Caso não esteja cadastrado o MAC, nada feito.

Tchauzin!

dyorgio

Eu ja acho valido o uso do MAC para controlar licenças…
mais apenas se for feito um gerenciador de licenças como o nosso amigo falou,
no caso ficaria semelhante a PSN (rede do Playstation 3)

onde vc tem um usuario e seus softwares.
e cada software pode ser baixado em 5 maquinas diferentes.

assim vc elimina o problema de troca/perda/queimação da placa de rede.

pois isso ocorrer 5 vezes com o mesmo cliente é praticamente impossivel.

e se o cliente querer compartilhar com mais pessoas as suas licenças:

  1. tera que compartilhar a senha/e-mail dono da licença.

  2. se perder a placa de rede/computador ja era :), escolha dele.

tnaires

Isso depende do tempo que o cliente usar seu software, e do tamanho do cliente também. As probabilidades aumentam com o tempo de uso e a quantidade de máquinas.

Dispositivos de hardware precisam ser trocados periodicamente, e é muito improvável que seja escolha do cliente - principalmente quando ele sabe que isso o prejudica não somente em termos de hardware, mas também em termos de software.

dyorgio

vc esta me dizendo que para a minha licença de 1 ano eu tenho que aceitar que o cliente troque de
maquina 5 vezes? o que tu me diz do windows OEM? que vale apenas pra maquina que foi comprado?

a escolha do cliente do item 2 se refere a ele dar 4 licenças para outras pessoas…
logo foi uma escolha dele, deu uma de malandro e quando precisou não tinha mais.

cara, não estou inventando a roda, é assim que funciona no PS3, e muito bem por sinal.

tnaires

E você espera que o cliente use um software desenvolvido por você apenas por um ano?

Só porque foi desenvolvido para o Playstation 3 não significa que sirva para todos os infinitos casos.

dyorgio

E você espera que o cliente use um software desenvolvido por você apenas por um ano?

Só porque foi desenvolvido para o Playstation 3 não significa que sirva para todos os infinitos casos.

Ai,ai, e dale framer :twisted: :twisted: :twisted: :twisted:

A cara, isso serve pra mim, e o que eu faço com meus clientes é problema meu

e o que é 5? 5 é um numero, pode ser 1000, pode ser 1…o universo é tão grande…
pense nisso…

aqui o dono do topico pediu dicas/ideias

estou dando de bom grado a minha, cade a sua?!?!

voltarei a minha meditação em GridBagLayout roots

M

:shock:

tnaires

:shock: :shock: :shock: :shock:

dyorgio

só loco aqui :slight_smile:

vai dizer?

vcs não gostam? soh assim pra ficar do jeito que quero, sem erro.

M

dyorgio:
só loco aqui :slight_smile:

vai dizer?

vcs não gostam? soh assim pra ficar do jeito que quero, sem erro.


http://www.miglayout.com

dyorgio

se entrar mesmo no Java 7, quem sabe…

eu não tenho dificuldade com o GBL,
ja com o Mig, terei a dificuldade inicial de aprendizagem…
desnecessario…

Mais voltando ao assunto do topico…a questão da licença ser valida por um ano…

não significaria que o usuario não poderia usar mais o programa…
e sim, que ele teria que revalidar a sua licença a custo zero ou pequeno para uma atualização.
todo ano…como a maioria dos softwares fazem…

sergiotaborda

dyorgio:
Eu ja acho valido o uso do MAC para controlar licenças…
mais apenas se for feito um gerenciador de licenças como o nosso amigo falou,
no caso ficaria semelhante a PSN (rede do Playstation 3)

onde vc tem um usuario e seus softwares.
e cada software pode ser baixado em 5 maquinas diferentes.

Cada vez que o cara adiciona uma máquina nova vc gera uma nova licença ?

Vamos pensar que o cara tem uma máquina já com o sistema instalado.
Agora ele está preparando uma maquina num datacenter para vir a ser o seu novo servidor.

como está amarrado no MAC, o cliente precisa pedir uma nova licença para aquele servidor e para fazer a migração ele precisa de duas licenças.
O seu sistema contém agora duas licenças. Uma original que permitia o endereço da primeira máquina
e uma segunda que permite ambos.

Agora o cara terminou de migrar tudo e desabilitou o servidor original. Como vc sabe disso ? como vc invalida essa licença ? Repare que ele só comprou 1 licença, mas vc lhe deu duas. Se vc o obriga a pagar duas ele vai se queixar.

Para que a licença seja atralada ao MAC ele tem que estar no properties que falei, e o sistema tem que testar se é igual.
Vc gerou duas licenças para MAC diferentes. Mas não tem como invalidar a primeira licença , portanto vc deu ao cara duas licenças que ele agora pode
usar para por duas máquinas no datacenter.

Por outro lado, agora quem controla a máquina é o data cenrter. Imagine que eles precisam mudar a placa de rede . Nem vc , nem o cliente sabem disto e o sistema para de funcionar. Ou imagine que duas aplicações de clientes diferentes usam a mesma placa de rede. E agora ?

duas palavras: inferno logistico.

O sistema pode ter outros mecanismo de garantir uma instancia apenas , mesmo em rede. O problema só acontece quando a aplicação é standalone.
E nesse caso vc utiliza um servidor de licença, ou seja, um sistema externo que serve apenas para verificar a licença, o sistema do cliente tem que fazer handshake e validar a licença periodicamente com o seu servidor central. Ai sim, vc pode usar o MAc para verificar que o pedido veio de lugares diferentes, mas o numero do MAc em si é irrelevante.

dyorgio

é mais simples do que tudo isso ai que vc falou cara.

o cara não precisa me pagar…ele tem direito a 5

não preciso desativar a primeira, ela expira depois de um ano.

e a chave pode ser a mescla (md5 por exemplo)
do mac + email/usuario dono da licença…

simples assim :slight_smile:

e no caso de datacenters, esse tipo de cliente não tentaria burlar,
pois a multa é grande se descoberto.

é engraçado, varias pessoas dizem que não da certo…mais da, tentem :), confia…haehhaehahehaehahe

sergiotaborda

dyorgio:
é mais simples do que tudo isso ai que vc falou cara.

o cara não precisa me pagar…ele tem direito a 5

não preciso desativar a primeira, ela expira depois de um ano.

e a chave pode ser a mescla (md5 por exemplo)
do mac + email/usuario dono da licença…

simples assim :slight_smile:

Bom, estamos falando de coisas diferentes. Estou falando de controle de licença, não de chaves de ativação.

dyorgio

entendi, realmente são coisas bem distintas, apesar de no fim fazerem parte da mesma solução…
o meu controle de licença imitado do PS3 da Sony é bem flexivel.

Ao mesmo tempo que se prende a uma maquina especifica ele permite vc trocar de maquina 5 vezes, ou
se quiser compartilhar a licença com amigos, como é feito hoje na PSN :), compartilha em até 5 pessoas.

porem como falei, é uma escolha de quem comprar o software, compartilhar ou guardar pra si as 5 chances que tem de instalar
o mesmo.

o gerenciamento disso tb pode ser automatico, com um servidor e o cliente inteligentes.
se bem feito nem intervenção para que tudo funcione é necessaria.

r.campos

sergiotaborda:
CaioO:
Estou com uma dúvida, como criar um sistema de licenças para minha aplicação java. Já existe alguma API? Estou precisando vender softwares mas quero por licenças (seriais)…

A licença tem dois objetivos

  1. Permitir que o sistema seja usado em conformidade com o contrato
  2. Validar que o sistema está sendo usado em conformidade com um contrato.

Se o contrato declara uma validade para a licença, isso significa que a licença electronica do sistema expirará no mesmo dia.
Se o sistema não encontrar uma licença válida, ele simplesmente não funciona.

As propriedades que o contrato impoe são variadas e podem ser tão complexas quando o proprio contrato. Portanto é impossivel criar um modelo de licença que atenta a todos.

A forma mais simples de uma licença é a criação de um properties com as propriedades que a licença tem. Data de validade, nome da empresa, numero de usuarios simultaneos, features permitidas, etc…

Depois vc usa um algoritmo de encriptação de chave publica-privada duplo.

O cliente entra no sistema sem licença. O sistema sabe isto e mostra uma tela para entrar dados de licença.
O sistema gera um par de chaves. guarda a privada e envia a publica para si.

Vc gera outro par de chaves. guarda a privada que gerou e a publica que recebeu num sistema de gerenciamento de licenças (sim, vc precisa criar este sistema)
Vc usa as duas chaves para encriptar o arquivo. primeiro a publica vinda do sistema e depois a privada que vc gerou.
Ai vc enviar a publica que vc gerou e o arquivo de licença (se quiser pode inventar um formato de arquivo para mandar as duas coisas num arquivo so).

O sistema verifica que existe um arquivo de licença , a chave privada que ele guardou e a publica que foi enviada. Ele usa os três para abrir o arquivo de properties.

Informações como a ultima data em que o sistema foi usado pode ser guardada no registro usando a Properties API (não a classe Properties).
encriptar isso pode tb ajudar, mas tem que ter cuidado em tratar a ausencia de informações anteriores.

Todo este esquema não evita que alguem faça um hack no seu codigo e modifque as classes que testam as propriedades da licença. Isso é um outro problema. (dica: vc pode codificar as classes com o mesmo algoritmo, e criar um Classloader especial que carregue as classes “autenticas”).

Não vincule a licença a propriedades da máquina porque isso pode mudar (se cara muda a placa de rede ou muda de computador). Vc vai criar trabalho para si mesmo. Mas a escolha é sua…

da mais trampo valida chave e criar chave do que fazer o sistema!
okakoakoakoakoakoakoakoako

gostei da explicação, preciso fazer isso… porém sou iniciante em java e ainda nao entendo algumas coisas que tem ai!

[]´s

bruxel
dyorgio:
Desculpe a demora CaioO, estou sem net em casa :(, derrota...

segue o codigo que uso, ele ja esta bem maduro, e tem partes dele que nem lembro porque fiz :)
mais sei que esta totalmente funcional :)

segue :

/**
	 * Carrega a identificação do computador através do MAC da placa de rede.
	 * 
	 * @return A identificação do computador.
	 * @throws SocketException
	 *             Caso ocorra algum problema relacionado a I/O durante o
	 *             processo.
	 */
	public static byte[] getComputerIdentifier() throws SocketException {
		NetworkInterface bestInterface = null;
		final Enumeration<NetworkInterface> interfaces = NetworkInterface
				.getNetworkInterfaces();

		Field indexField = null;
		try {
			indexField = NetworkInterface.class.getDeclaredField("index");
                        indexField.setAccessible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
		

		while (interfaces.hasMoreElements()) {
			final NetworkInterface atualInterface = interfaces.nextElement();
			if (!atualInterface.isLoopback() && !atualInterface.isVirtual()
					&& !atualInterface.isPointToPoint()
					&& atualInterface.getHardwareAddress() != null) {
				try {
					if (bestInterface == null
							|| (indexField == null || indexField
									.getInt(bestInterface) > indexField
									.getInt(atualInterface))) {
						bestInterface = atualInterface;
						InetAddress address = InetAddress.getLocalHost();
						NetworkInterface.getByInetAddress(address);
						if (indexField == null) {
							break;
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		}

		if (bestInterface != null) {
			return bestInterface.getHardwareAddress();
		} else {
			throw new RuntimeException(
					"Nenhuma interface de rede habilitada para identificação do computador encontrada.");
		}
	}

ai galera sera que neste processo tem como desviar ou evitar as redes do Hamachi ?

ta funcionando legal so que o primeiro endereço que ele encontra é a do Hamachi

dyorgio

Fala ai Bruxel…
Cara, o isVirtual() ali deveria estar barrando a placa do Hamachi,
mas pelo visto ele faz tão bem feito o serviço que burla esse tipo de controle :P,
tente colar aquí pra gente o resultado do seu ipconfig.
Para isso abra um CMD(Console,Terminal) e digite ipconfig + ENTER

bruxel

nao sei do que pode adiantar mas ta ai

C:&gt;ipconfig

Configuração de IP do Windows

Adaptador Ethernet Conexão local:

Sufixo DNS específico de conexão. . . . . . :
Endereço IPv4. . . . . . . . . . . . . . . . . . . . : 0.0.0.0
Máscara de Sub-rede. . . . . . . . . . . . . . . : 0.0.0.0
Gateway Padrão . . . . . . . . . . . . . . . . . . : 0.0.0.0

Adaptador Ethernet Hamachi:

Sufixo DNS específico de conexão. . . . . . :
Endereço IPv4. . . . . . . . . . . . . . . . . . . . : 0.0.0.0
Máscara de Sub-rede. . . . . . . . . . . . . . . : 0.0.0.0
Gateway Padrão . . . . . . . . . . . . . . . . . . : 0.0.0.0

dyorgio

Bruxel, vc nos enviou um ipconfig sem rede,

Todos os endereços 0.0.0.0 (desconectado)

Mas assim de cara eu faria uma modifiação no if , assim:

antes:

if (!atualInterface.isLoopback() && !atualInterface.isVirtual()  
                    && !atualInterface.isPointToPoint()  
                    && atualInterface.getHardwareAddress() != null) {

depois

if (!atualInterface.isLoopback() && !atualInterface.isVirtual()  
                    && !atualInterface.isPointToPoint()  
                    && atualInterface.getHardwareAddress() != null
                    && atualInterface.getName().indexOf("Hamachi") == -1 // HACK, POG, GoHorse - Ignora adaptadores Hamachi
) {

Ficou meia boca, mas acho que da conta do recado.

bruxel

não funcionou, os adaptadores q ele teria como a descricao Hamachi, tranquilo ele acabou ignorando, mas veio alguns com a descricao net0
net1, e dai acho q um desses passou e o endereco mac q ele retornou foi o do hamachi

dyorgio

Bruxel, conecte-se em alguma rede e certifique-se
que o seu ipconfig liste esses seus dois adaptadores (net0, e net1)
ai cole aqui para a gente.

Criado 5 de março de 2010
Ultima resposta 21 de jul. de 2011
Respostas 36
Participantes 8