Bestimmte System-Infos eines Windows-PCs abfragen ...

Rund um die LCL und andere Komponenten
Antworten
mbulm1
Beiträge: 15
Registriert: Do 8. Aug 2019, 11:44

Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von mbulm1 »

Hallo Zusammen,
wie kann ich mit Lazarus bestimmte System-Infos eines Windows-PCs abfragen?
Grund:
Ich suche nach einer Möglichkeit jeden PC mit einem Lazarus-Programm eindeutig zu identifizieren - d.h. die Abfrage sollte für den selben PC immer die gleiche Nummer und für andere PCs jeweils eine andere Nummer liefern!
Danke vorab für Eure Hilfe.
Beste Grüße
mbulm1

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von m.fuchs »

Magst du noch ein bisschen mehr zum Hintergrund sagen?
Soll das eine Art Lizenzierung / Kopierschutz werden?

Geht es wirklich um die physikalische Maschine oder ist es eher wichtig damit eine bestimmt Installation deines Programm identifizierbar ist?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mbulm1
Beiträge: 15
Registriert: Do 8. Aug 2019, 11:44

Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von mbulm1 »

Ja - es geht um einen Kopierschutz bzw. um Lizenzierung ...
Danke!
BG
mbulm1

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von theo »

mbulm1 hat geschrieben:Ja - es geht um einen Kopierschutz bzw. um Lizenzierung ...


Als erstes bastle ich mir einen Kopierschutz? :wink:

Zu dem Thema gibt es allgemeine Informationen. Ist ja nicht Lazarus spezifisch.
https://stackoverflow.com/questions/344 ... identifier

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von sstvmaster »

Und hier hast du auch was zum lesen: https://www.delphipraxis.net/81144-kopi ... ndung.html
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von wp_xyz »

Hab noch nicht damit gearbeitet, aber für einen Kopierschutz gibt es TurboPower OnGuard, als Lazarus-Port unter https://github.com/graemeg/onguard. Dokumentation auf https://sourceforge.net/projects/tpongu ... docs/1.15/.

mbulm1
Beiträge: 15
Registriert: Do 8. Aug 2019, 11:44

Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von mbulm1 »

Hallo liebe Leute,
danke für die vielen Tipps - aber ich bin Anfänger - so komme ich leider nicht weiter und es geht etwas in die falsche Richtung!
Eigentlich würde ich mit Lazarus nur gerne die Computer SID auslesen - event. aus der Registry oder wie kommt man sonst da ran?
Vielen Dank vorab!
BG
mbulm1

mbulm1
Beiträge: 15
Registriert: Do 8. Aug 2019, 11:44

Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von mbulm1 »

Ich habe die Lösung gefunden - hiermit geht es ...
"GetSystemSID" gibt die eindeutige SID des PCs wieder ...
DANKE an alle!
BG
mbulm1



Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Windows, Classes, SysUtils;
 
function GetSystemSID: string;
 
function ConvertSidToStringSid(SID: PSID; var StringSid: LPSTR): Boolean; stdcall;
    external 'advapi32.dll' name 'ConvertSidToStringSidA';
 
implementation
 
 
function GetAccountSid(const Server, User: WideString; var Sid: PSID): DWORD;
var
  dwDomainSize, dwSidSize: DWord;
  R : LongBool;
  wDomain : WideString;
  Use : SID_NAME_USE;
 
begin
  Result := 0;
  SetLastError(0);
  dwSidSize := 0;
  dwDomainSize := 0;
  R := LookupAccountNameW(PWideChar(Server), PWideChar(User), nil, dwSidSize, nil, dwDomainSize, Use);
  if (not R) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
  begin
    SetLength(wDomain, dwDomainSize);
    Sid := GetMemory(dwSidSize);
    R := LookupAccountNameW(PWideChar(Server), PWideChar(User), Sid, dwSidSize, PWideChar(wDomain), dwDomainSize, Use);
    if not R then
    begin
      FreeMemory(Sid);
      Sid := nil;
    end;
  end
  else
    Result := GetLastError;
end;
 
 
 
function GetSystemSID: string;
var
  SID : PSID;
  strSID : PChar;
  CName : Array [0..255] of Char;
  nSize : Cardinal;
begin
     Result:='';
     GetComputerName (CName,nSize);
     if GetAccountSid('',CName, SID)=0 then begin
        ConvertSidToStringSid(SID, strSID);
        Result:=strSid;
     end;
end;
 
End

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von Warf »

Du solltest aber dran denken das sowas extrem einfach zu umgehen ist. Ich würde schätzen, wenn man das wirklich umgehen will kann jemand der ein bisschen ahnung von PC's und programmieren hat, mit ein bisschen googlen das in max 2 stunden umgehen.

Außerdem ist der Code ein bisschem kaputt:
Du alloziierst Sid, gibst den speicher aber nur bei einer Failure wieder Frei. Den speicher den ConvertSidToStringSid alloziiert gibst du überhaupt nicht frei.

PS: Von dem was ich so auf die schnelle gelesen hab ist die SID keine identifizierung deines PC's sondern eines Nutzers. D.H. zum einen gibt es eine reihe an festen SID's : Link wenn du also eine davon authorisierst hast du praktisch jeden windows rechner authorisiert (z.B. der Admin account auf einem Windows hat eine konstante SID). Du willst also wahrscheinlich eher nicht die SID verwenden.

Wenn du meine Meinung wissen willst, es gibt keine (einzelne) konstante die du einfach abfragen kannst die nicht ein 12 jähriger mit zugang zu google verändern kann. Jedes kind kann sich einen SID oder MAC spoofer runterladen und mit 3 klicks die SID oder Mac Addresse auf einen gewünschten wert setzen.
Du kannst versuchen viele verschiedene sachen zusammenzurechnen, damit machst du es zwar etwas schwerer, aber auch nicht so sehr. Vor allem müssen ja die vergleichswerte irgendwo her kommen, was man auch recht einfach angreifen kann. Wenn du die von nem server liest, einfach mit Wireshark sniffen (auf ner VM die sonst keine verbindungen aufbaut), domain in die hosts eintragen und nen eigenen service laufen lassen der den richtigen wert zurückgibt. Wenn du ihn konstant in der Anwendung hast, einfach die anwendung mit nem Hex-Editor öffnen und die konstante anpassen. Der affine PC nutzer würde sich also einfach IDA pro, ghidra, Binary Ninja oder Cheat Engine runterladen, schauen wo der vergleichswert verwendet wird, im debugger nen breakpoint setzen, schauen was für ein wert gegen was verglichen wird, und einen der beiden werte einfach per hand ändern und tada, dein system ist umgangen

Daher mein Tipp, spar dir den aufwand, es bringt nix und kostet dich nur zeit in der entwicklung.

Nur mal als beispiel wie einfach es ist sowas zu umgehen: Ich hab deine Funktion von oben einfach mal in ein Programm geschmissen und hab in der FormCreate folgenden Code stehen:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  if GetSystemSID <> 'ABCD' then
  begin
    ShowMessage('Wrong SID');
    Application.Terminate;
  end;
end;

Habe das alles schön ohne debugsymbole mit O2 kompiliert, und das ganze in Ghidra geladen. Dann hab ich nach "Wrong SID" gesucht, die String Konstante gefunden und dann die funktion die diese konstante verwendet gesucht und mit ghidra dekompiliert

Code: Alles auswählen

void UndefinedFunction_10002add0(void)
 
{
  longlong lVar1;
  undefined8 uStack16;
 
  uStack16 = 0;
  FUN_10002b010(&uStack16);
  lVar1 = FUN_100009f50(uStack16,&DAT_1001c8fb8);
  if (lVar1 != 0) {
    FUN_100133f10("Wrong SID");
    (**(code **)(*DAT_1001a4440 + 0x1f8))(DAT_1001a4440);
  }
  FUN_10002adb0(&stack0xfffffffffffffff8);
  return;
}

Das einzige was ich jetzt machen muss für die instruction:

Code: Alles auswählen

10002adf9   CALL       FUN_100009f50

Welche der aufruf der StringCompare funktion ist (im dekompilierten code die zeile lVar1 = FUN_100009f50(uStack16,&DAT_1001c8fb8);) einfach ändern zu:

Code: Alles auswählen

10002adf9   MOV        RAX, 0

machen, das ergebnis speichern und tada, ich hab den check umgangen (Also einfach 0 in das ergebnis schreiben, was raus kommen würde wenn die SID korrekt wäre). Das hat keine 10 minuten gedauert, und ich bin absolut nicht gut in dem kram.
Genauso kann ich ganz einfach sehen das der wert gegen den die SID gecheckt wird in DAT_1001c8fb8 (also adresse 0x1001c8fb8) steht, ich kann also auch einfach da rein schauen, und sehe den benötigten wert. Ich könnte also genauso einfach mir einen SID changer unterladen und meine SID auf den korrekten wert setzen.

mbulm1
Beiträge: 15
Registriert: Do 8. Aug 2019, 11:44

Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von mbulm1 »

Hallo Warf,
ich war lange nicht hier - danke für Deine Hinweise!
Du bist wahrscheinlich ein Genie und ich ein "kleines Licht"!
Kannst Du mir bitte noch sagen - wie ich bei meinem Beispiel oben - den Speicher wieder richtig freigebe?
Danke vorab.
BG
mbulm1

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von Warf »

mbulm1 hat geschrieben:Du bist wahrscheinlich ein Genie und ich ein "kleines Licht"!

Nö, ich hab mich nur schonmal mit dem Thema befasst. Es gibt grundsätzlich keinen weg Software auf einen Computer zu restriktieren, der sicher ist. Ist einfach so. Du kannst es dumm machen über einen Mac-Addressen Check, den kann jeder der will in 1-2 Stunden umgehen, hat aber immerhin eine Signalwirkung, und hält den "einfachen" nutzer ab. Du kannst versuchen es schlau zu machen, durch Obfuscation, etc. Damit wird aus den 1-2 Stunden vielleicht ein paar Tage bis ne Woche, somit hältst du die ab die nicht unbedingt rein wollen.
Aber es gibt immernoch 2 probleme. 1. nur einer muss es knacken und kann den Crack an beliebig viele Leute verteilen, 2. Ist das mit einem Computer immernoch recht leicht zu umgehen, da du wie gesagt einfach alle Kennzahlen die du checken könntest spoofen (fälschen) kannst (was effektiv heißt, solang sich einer die Software registriert und seine Kennzahlen weiter schickt, kann jeder sich einfach für den ausgeben).

Spieleentwickler haben das auf die Harte tour gelernt, du kannst die leute nicht vom Cracken abhalten, und alles was du an energie darein stecktst ist vergeudete arbeitszeit.

Es gibt aber zumindest eine Theoretische Möglichkeit das ganze zumindest Account gebunden zu machen. Wenn du einen Teil der Funktionalität auf den Server auslagerst, der die Berechnungen nur für registrierte accounts durchführt, und diese Funktionalität essenziell zur benutzung der Software ist, kann man ohne einen Account diese software nicht benutzen.
Aber für Maschinenspezifische benutzung hast du sehr schlechte karten irgendwas hinzubekommen was stand hält. (Naja gibt da auch eine theoretische möglichkeiten, z.B. über hardware benchmarks, z.B. kannst du die grafikkarten response zeit messen und hashen, die ist von gerät zu gerät leicht uneterschiedlich, das aber vernünftig zu machen ist nur auf Kernel ebene überhaupt möglich, und kann sich sowohl überzeit, als auch mit einer neuen Grafikkarte leicht ändern).

Ich empfehle dir einfach mal, schreib deinen Sicherheitscheck in eine test software und lade sie in Ghidra rein, und mach die schritte die ich oben gesagt habe (suche nach der Nachricht die kommt wenn der Test fehlschlägt, suche deren call site und analysiere den code da). Ich hab sowas vorher auch nie gemacht (also im ernst, das war wirklich das allererste mal das ich sowas versucht hab, vorher kannte ich nur die Theorie), und hab keine 30 minuten gebraucht um einen simplen SID check zu umgehen!

mbulm1 hat geschrieben:Kannst Du mir bitte noch sagen - wie ich bei meinem Beispiel oben - den Speicher wieder richtig freigebe?

Nach dem ConvertSidToStringSid(SID, strSID) ein FreeMemory(SID) aufrufen sollte es tun

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Beitrag von MacWomble »

Meine Meinung zum Thema:
1. Kopierschutz verhindert nicht die Verbreitung einer Software.
2. Für gute Software finden sich Anwender, die gerne auch etwas springen lassen.
3. Freiwillige Zahlungen werden eher getätigt als Pflichtzahlungen
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten