WMI gebruiken voor uniek machine id

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
Hi,

ik probeer een uniek hardware id te maken van een computer tegen piracy.
dit doe ik in processing wat gebaseerd is op java ( https://processing.org/ ) .

het was me gelukt om een String te genereren waar me moederbord serie nummer in stond.
dit werkte perfect om met behulp van encryptie een serial nummer aan te maken.
echter twijfel ik hoe uniek die serie nummer is, ook heb ik ontdekt dat op diverse pc's de String returns "to be filled in by O.E.M".

dus ik wil een model maken van meerdere hardware.
ik heb uitgezocht dat dit via WMI kan
en heb daar een mooie bron voor gevonden.
https://msdn.microsoft.com/en-us/library/aa394587.aspx

nu wil ik dus diverse invoegen in java, maar me gebrekkige kennis hierin laat me dat niet toe.

Dus het moederbord serie nummer werkt indien serie nummer aanwezig is.
Windows Product code werkt ook.
nu wil ik dus ook dingetjes vanuit de bovenstaande bron (WMI) toevoegen https://msdn.microsoft.com/en-us/library/aa394587.aspx.

de "getSMBIOS()" die ik aangemaakt heb werkt niet en returns alleen "\n".
dit zal waarschijnlijk in het vb script zitten wat totaal nieuw voor me is.

zie onderstaande code.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.File;
import java.io.BufferedReader;

public static String getMotherboardSerial() {
      String result = "";
        try {
          File file = File.createTempFile("GetMBSerial",".vbs");
          file.deleteOnExit();
          FileWriter fw = new FileWriter(file);

          String vbs =
             "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
            + "Set colItems = objWMIService.ExecQuery _ \n"
            + "   (\"Select * from Win32_ComputerSystemProduct\") \n"
            + "For Each objItem in colItems \n"
            + "    Wscript.Echo objItem.IdentifyingNumber \n"
            + "Next \n";

          fw.write(vbs);
          fw.close();
          Process gWMI = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
          BufferedReader input = new BufferedReader(new InputStreamReader(gWMI.getInputStream()));
          String line;
          while ((line = input.readLine()) != null) {
             result += line;
             //System.out.println(line);
          }
          input.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        result = result.trim();
        return result;
      }
public static String productID() {
      String result = "";
        try {
          Process p = Runtime.getRuntime().exec("reg query \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\" /v ProductId");
          BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
          String line;
          while ((line = input.readLine()) != null) {
            if(validChar(line)){
             result += line;}
             //System.out.println(line);
          }
          input.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        result = result.trim();
        return result;
      }       
public static String getSMBIOS() {
      String result = "";
        try {
          File file = File.createTempFile("SMBIOS",".vbs");
          file.deleteOnExit();
          FileWriter fw = new FileWriter(file);

          String vbs =
          "strComputer = (\".\")"
            + "Set objWMIService = GetObject(\"winmgmts:\") & (\"{impersonationLevel=impersonate}!\\\") & strComputer & (\"\\root\\cimv2\")\n"
            + "Set colSMBIOS = objWMIService.ExecQuery _ \n"
            + "   (\"Select * from Win32_SystemEnclosure\") \n"
            + "For Each objSMBIOS in colSMBIOS \n"
            + "Wscript.Echo  objSMBIOS.SerialNumber \n"
            + " Wscript.Echo  objSMBIOS.PartNumber"
            + "Next \n";

          fw.write(vbs);
          fw.close();
          Process gWMI = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
          BufferedReader input = new BufferedReader(new InputStreamReader(gWMI.getInputStream()));
          String line;
          while ((line = input.readLine()) != null) {
             result += line;
             //System.out.println(line);
          }
          input.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        result = result.trim();
        return result;
      }      
     
      


kan iemand mij op weg helpen? :)

Ben niet slim, maar wel dom


Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Ik vind Java gebruiken om VBS te genereren om met WMI te babbelen een beetje.. omslachtig :X
Er is ook gewoon een WMI-library (en waarschijnlijk nog wel andere opties om met WMI te babbelen) met Java - https://github.com/profesorfalken/WMI4Java.

Waarom gebruik je dat niet?

Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
Radiant schreef op vrijdag 23 juni 2017 @ 11:41:
Ik vind Java gebruiken om VBS te genereren om met WMI te babbelen een beetje.. omslachtig :X
Er is ook gewoon een WMI-library (en waarschijnlijk nog wel andere opties om met WMI te babbelen) met Java - https://github.com/profesorfalken/WMI4Java.

Waarom gebruik je dat niet?
Omdat ik niet van het bestaan af weet ;) , ziet er uitdagend uit om dat in Processing aan de gang te krijgen.
maar VBS moet ook gewoon kunnen werken toch ?,


edit: // uiteindelijk zie ik dat die library ook van VBS gebruik maakt.

[ Voor 6% gewijzigd door itcouldbeanyone op 23-06-2017 11:55 ]

Ben niet slim, maar wel dom


Acties:
  • 0 Henk 'm!

Verwijderd

Als je nou het script eens in een command prompt draait, dan kun je keurig zien wat de output echt is, en zo waarschijnlijk achterhalen waar het misgaat.

edit: misschien de ontbrekende \n na PartNumber...

[ Voor 15% gewijzigd door Verwijderd op 23-06-2017 11:56 ]


Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
Verwijderd schreef op vrijdag 23 juni 2017 @ 11:55:
Als je nou het script eens in een command prompt draait, dan kun je keurig zien wat de output echt is, en zo waarschijnlijk achterhalen waar het misgaat.

edit: misschien de ontbrekende \n na PartNumber...
geprobeerd die \n was mij niet opgevallen, maar helaas geen verschil.

zelf heb ik zon vermoede dat het ergen met de tekens \\ en "" te maken heeft.

ik zal nog ff met de prompt proberen op andere pc, deze heeft geen mobo serie nummer |:( ,

Ben niet slim, maar wel dom


Acties:
  • 0 Henk 'm!

Verwijderd

De 2e regel klopt niet - de parameters moeten allemaal binnen de () van GetObject staan, en niet aan het object vastgeplakt worden. Even googlen naar "Set objWMIService = GetObject" voor voorbeelden...

edit - dit dus:
VBScript:
1
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

[ Voor 26% gewijzigd door Verwijderd op 23-06-2017 12:18 ]


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dit is een behoorlijk broze oplossing. WMI kan uitgeschakeld zijn, het runnen van VBS kan uitgeschakeld zijn danwel waarschuwingen geven / virusscanners triggeren etc. En daarbij heb je, zoals je zelf al merkt, kans dat bepaalde waardes niet aanwezig zijn. En dan heb je 't nog niet gehad over (cloned) VM's of (cloned) machines.

Ik zou me eerst eens afvragen of de kosten/baten verhouding wel juist is en dan eens gaan kijken of er geen bestaande oplossingen zijn i.p.v. een vierkant wiel gaan (proberen) uitvinden.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Is dit iets wat je daadwerkelijk 'in productie' wil gaan gebruiken? Want je gaat nogal enorm voorbij dat Java .class files trivial te decompilen zijn en is het dus enorm simpel deze code eruit te slopen. Zelfs als je het obfuscate.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
Hydra schreef op vrijdag 23 juni 2017 @ 13:03:
Is dit iets wat je daadwerkelijk 'in productie' wil gaan gebruiken? Want je gaat nogal enorm voorbij dat Java .class files trivial te decompilen zijn en is het dus enorm simpel deze code eruit te slopen. Zelfs als je het obfuscate.
het programma waar dit voor bedoelt is, is alleen om instellingen in een custom PCB in te laden.
de mensen die dit doen zijn gemiddeld niet handig met computers.
het enige wat ze wel eens zouden proberen, is de klok verzetten, of proberen de applicatie te clonen door simpelweg kopiëren en plakken.


wat dat betreft hoeft het niet allemaal potdicht te zijn. er is maar een handje vol mensen die baat hebben bij dit programma

Ben niet slim, maar wel dom


Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
Verwijderd schreef op vrijdag 23 juni 2017 @ 12:14:
De 2e regel klopt niet - de parameters moeten allemaal binnen de () van GetObject staan, en niet aan het object vastgeplakt worden. Even googlen naar "Set objWMIService = GetObject" voor voorbeelden...

edit - dit dus:
VBScript:
1
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
als ik dat wijzig, dan zie je dat bepaalde gebieden zwart worden,
en krijg ik een error in mn console : expected SEMI, found 'vbs'
regel 65

zie hier
processing

edit
VBScript:
1
 "Set objWMIService = GetObject(\"winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv\")\n"


als ik het na dit wijzig, heb ik een output, rare is is dat dit nu, "To Be Filled By O.E.M.null" is.

zelfde output als dat ik met het moederbord serial soms krijg

[ Voor 16% gewijzigd door itcouldbeanyone op 23-06-2017 13:33 ]

Ben niet slim, maar wel dom


Acties:
  • 0 Henk 'm!

Verwijderd

Kijk even goed, dan - ik heb de VBS-code gegeven, en die moet je nog even omzetten naar gebruik binnen een string, dus met \" in plaats van "...

Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
Verwijderd schreef op vrijdag 23 juni 2017 @ 13:33:
Kijk even goed, dan - ik heb de VBS-code gegeven, en die moet je nog even omzetten naar gebruik binnen een string, dus met \" in plaats van "...
klopt, lijkt erop dat het nu werkt, thankzz,!
ik zal ff andere hardware proberen om te kijken of dit andere output geeft


edit,

nu CPU ook geprobeerd en die geeft een mooie output : 178BFBFF00800F113200
dat is een Ryzen 1600 :)

maar nou ben ik wel benieuwd, hoe doen andere dit ?
want activatie via internet, kan niet anders had mijn installer wel er iets moois voor.
de gebruiker heeft in 90% van alle gevallen geen internet wanneer ze het programma gebruiken.

[ Voor 32% gewijzigd door itcouldbeanyone op 23-06-2017 13:48 ]

Ben niet slim, maar wel dom


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
itcouldbeanyone schreef op vrijdag 23 juni 2017 @ 13:35:
maar nou ben ik wel benieuwd, hoe doen andere dit ?
Dit al eens geprobeerd? Ik zie hier (3e hit bij mij) namelijk wel een zinnig antwoord (en in essentie wat we hier ook al verteld hebben).

[ Voor 26% gewijzigd door RobIII op 23-06-2017 14:03 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Bigs
  • Registratie: Mei 2000
  • Niet online
itcouldbeanyone schreef op vrijdag 23 juni 2017 @ 13:35:
[...]

maar nou ben ik wel benieuwd, hoe doen andere dit ?
want activatie via internet, kan niet anders had mijn installer wel er iets moois voor.
de gebruiker heeft in 90% van alle gevallen geen internet wanneer ze het programma gebruiken.
Als je het hardware ID nou opmaakt als een nette string dan kun je gebruikers vragen die aan je op te sturen en ze in ruil daarvoor een licentiesleutel geven die gekoppeld is aan dat hardware ID. Die licentiesleutel kan een RSA signature zijn van het hardware ID dat je met de publieke sleutel die in de applicatie is opgeslagen valideert. Je checkt dus: komt het hardware id in de licentiesleutel overeen met de hardware waar ik nu op draai en is het voorzien van een geldige handtekening. Natuurlijk is ook dit weer op tal van manieren te kraken, dus je zult de verantwoordelijke code en de opgeslagen public key wel extra moeten beveiligen. Pas op dat er niet meer tijd in gaat zitten dan in de rest van je applicatie ;)

Acties:
  • 0 Henk 'm!

  • itcouldbeanyone
  • Registratie: Augustus 2014
  • Laatst online: 12-09 21:49
Bigs schreef op dinsdag 27 juni 2017 @ 09:14:
[...]


Als je het hardware ID nou opmaakt als een nette string dan kun je gebruikers vragen die aan je op te sturen en ze in ruil daarvoor een licentiesleutel geven die gekoppeld is aan dat hardware ID. Die licentiesleutel kan een RSA signature zijn van het hardware ID dat je met de publieke sleutel die in de applicatie is opgeslagen valideert. Je checkt dus: komt het hardware id in de licentiesleutel overeen met de hardware waar ik nu op draai en is het voorzien van een geldige handtekening. Natuurlijk is ook dit weer op tal van manieren te kraken, dus je zult de verantwoordelijke code en de opgeslagen public key wel extra moeten beveiligen. Pas op dat er niet meer tijd in gaat zitten dan in de rest van je applicatie ;)
Ik heb nu een string kunnen maken die is opgebouwd uit informatie van verschillende hardware. Zodat waneer er geen informatie te verkijgen is van een specefiek soort hardware er verder gekeken word naar andere hardware.
Dit word samengevoegd met een key die mee geleverd word met de software.
En dit werkt nu perfect, kan zelfs zien waneer er onder vmware gedraait word.

Ben niet slim, maar wel dom

Pagina: 1