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

Rund um die LCL und andere Komponenten

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

Beitragvon mbulm1 » 18. Sep 2019, 10:18 Bestimmte System-Infos eines Windows-PCs abfragen ...

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
mbulm1
 
Beiträge: 9
Registriert: 8. Aug 2019, 11:44

Beitragvon m.fuchs » 18. Sep 2019, 10:25 Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

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
m.fuchs
Lazarusforum e. V.
 
Beiträge: 2119
Registriert: 22. Sep 2006, 19:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (Lazarus 2.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon mbulm1 » 18. Sep 2019, 11:13 Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Ja - es geht um einen Kopierschutz bzw. um Lizenzierung ...
Danke!
BG
mbulm1
mbulm1
 
Beiträge: 9
Registriert: 8. Aug 2019, 11:44

Beitragvon theo » 18. Sep 2019, 12:24 Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

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
theo
 
Beiträge: 8180
Registriert: 11. Sep 2006, 19:01

Beitragvon sstvmaster » 18. Sep 2019, 12:44 Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

Und hier hast du auch was zum lesen: https://www.delphipraxis.net/81144-kopi ... ndung.html
LG Maik
sstvmaster
 
Beiträge: 228
Registriert: 22. Okt 2016, 23:12
Wohnort: Dresden
OS, Lazarus, FPC: Windows 7 32bit (L 2.0.4 FPC 3.0.4) | 
CPU-Target: 32Bit
Nach oben

Beitragvon wp_xyz » 18. Sep 2019, 14:59 Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

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/.
wp_xyz
 
Beiträge: 2970
Registriert: 8. Apr 2011, 09:01

Beitragvon mbulm1 » 18. Sep 2019, 15:05 Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

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: 9
Registriert: 8. Aug 2019, 11:44

Beitragvon mbulm1 » 18. Sep 2019, 16:41 Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

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
mbulm1
 
Beiträge: 9
Registriert: 8. Aug 2019, 11:44

Beitragvon Warf » 18. Sep 2019, 21:28 Re: Bestimmte System-Infos eines Windows-PCs abfragen ...

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.
Warf
 
Beiträge: 1217
Registriert: 23. Sep 2014, 17:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste

porpoises-institution
accuracy-worried