Windows Klassen mit anderen Namen neu erstellen

  • VB.NET

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    DragsTrail schrieb:

    Ich nehme hier nichts persönlich.


    Das ist schon mal gut. Hatten wir leider auch schon ganz anders.

    DragsTrail schrieb:

    Ja ich schätze trotzdem deine herabwürdigende Art.

    Da war, soweit ich es erkennen konnte, keine Herabwürdigung. Lediglich die Erfahrung, die aus dem Kollegen sprudelt.

    DragsTrail schrieb:

    Deine Fragen sind meiner Meinung nach, leider absolut irrelevant zu dem Thema.

    Da bin ich anderer Meinung.

    DragsTrail schrieb:

    Also ich messe keine Leistungsminderung.

    Könntest du uns ein Beispiel zeigen? Würde mich tatsächlich interessieren, was du tust um die Leistung zu messen und vergleichen.

    DragsTrail schrieb:

    Das "As String" ist mein Problem.

    Das habe ich wohl schon verstanden - das haben glaube ich alle verstanden.

    Die Frage ist warum?

    Selbst wenn du den Datentypen änderst, sobald du anfängst, den String zu vergleichen (was sowieso nur sinnvoll mit einem entschlüsselten String geht), ist es sinnvoller auf das Framework zurückzugreifen. Spätestens da, sieht doch jeder was deine Anwendung macht.
    Mit einem simplen Programm wie CheatEngine kann ich von jeder Applikation den Speicher auslesen und verwerten. Mit wenigen Zeilen Code kann ich das auch aus dem Kernel heraus, wenn ich einen entsprechenden Treiber baue.

    Solltest du dich für die Variante entscheiden, dass du doch die Klassen und Strukturen selbst implementieren willst (warum auch immer), dann könnte ich im Dekompilat ohne Obfuscation auch sofort sehen, was da gerade los ist.

    Wenn du wirklich Mission-Critical Code hast, der um jeden Preis bloß schwer zu erkennen sein soll, dann bau dir eine Backend-Bibliothek in C++*, linke sie statisch und binde sie dann in deine Applikation ein. Jag' über die VTables ein Obfuscator rüber, der die ohnehin schon mangled Names noch weiter unverständlich macht und lass dir eine Tabelle ausgeben, damit nur du weißt, was was ist.

    Mach ein DllImport-Wrapper um die Lib und verweise dort auf die neuen Namen. Änderst du etwas an der Bibliothek, muss das Frontend auch aktualisiert werden.

    * In C würde es natürlich auch gehen, aber da hast du gar keine Objektorientierung. Die Namen werden in C auch nicht gemangled. (In C++ auch nicht, wenn du extern "C" {} machst, aber das ist nun ein gänzlich anderes Thema).

    EDIT:
    Eine andere Möglichkeit wäre, dass du das Backend auf einen Server auslagerst und dann mit einer verschlüsselten API kommunizierst. Public/Private Key wäre hier ein Stichwort. Vielleicht noch ein AccessToken/OAuth.
    Dann rechnest du nichts auf dem Client und hast deinen super-geheimen Quellcode weg von der Öffentlichkeit.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Und was ist mit den Anführungszeichen? Damit erkennt man Strings ja auch. Ich meine mit Option Strict Off geht das zwar noch ohne, wenn man Zahlen nützt, aber nicht mit echten Strings.

    Zu deinem Code aus Post 12 hier was GPT 3.5 damit gemacht hat, kannst du ja mal für uns bewerten:
    Spoiler anzeigen

    Frage: Für die folgende VB.Net Methode wurden Variablenenamen und Klassenbezeichnungen substituiert durch unbedeutende Zeichenfolgen,
    kannst du sinnvolle Ersetzungen durchführen und was macht die Methode? [Dann Post 12 Code]

    Antwort:
    Natürlich, ich kann dir helfen, die Methode zu verstehen und die Variablennamen zu benennen.

    Hier ist eine überarbeitete Version der Methode mit aussagekräftigeren Namen für die Parameter und die Klassen:

    VB.NET-Quellcode

    1. Private Sub ProcessData(ByVal container As ContainerClass, ByVal dataItem As DataItemClass, ByVal dataList As List(Of DataItemClass))
    2. If dataList.Count = 0 Then
    3. container.DataList.Add(dataItem)
    4. container.MoveFrom = dataItem
    5. ElseIf dataList.Count = 1 Then
    6. container.DataList.Add(dataItem)
    7. Dim newDataObject As New CustomDataObject(dataList(0), dataList(1))
    8. newDataObject.Property1 = Constants.Value1
    9. newDataObject.Property2 = Constants.Value1
    10. newDataObject.SomeMethod(Constants.Value2)
    11. container.SpecialList.Add(New SpecialObject(newDataObject), GlobalLayerName)
    12. SomeOtherList.Add(newDataObject)
    13. container.OtherContainer.Method1()
    14. container.OtherContainer.ClearData()
    15. container.OtherContainer.ClearSelection()
    16. container.DataList.Clear()
    17. ElseIf dataList.Count = 2 Then
    18. container.DataList.Clear()
    19. container.DataList.Add(dataItem)
    20. container.MoveFrom = dataItem
    21. End If
    22. End Sub

    Diese Methode verarbeitet Daten in Abhängigkeit von der Anzahl der Elemente in einer Liste (dataList).
    Abhängig von der Anzahl der Elemente führt sie verschiedene Aktionen auf einem Containerobjekt (container) und den darin enthaltenen Datenobjekten aus (dataItem und CustomDataObject).
    Es scheint, als ob sie Daten hinzufügt, spezielle Operationen auf diesen Datenobjekten ausführt und den Container je nach Anzahl der Elemente leert oder aktualisiert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    @Haudruferzappeltnoch

    Ich habe das gerade mal mit Bard probiert. Wer tatsächlich Bard nutzen möchte, wird eine schwere Zeit haben, das zu verstehen :D

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Public Sub Adx9893mms89000(ByRef xik As _XIk809092_TTKLKPS3ssd, ByRef kdsn As Kdsnmo98093_UIJIKJDD, ByRef xdsns As List(Of Kdsnmo98093_UIJIKJDD))
    2. If xdsns.Count = 0 Then
    3. xik.Xsns.Add(kdsn)
    4. xik.MoveFrom = kdsn
    5. ElseIf xdsns.Count = 1 Then
    6. xik.Xsns.Add(kdsn)
    7. Dim lkj As New lkj988DPQWK9999(xdsns(0), xdsns(1))
    8. lkj.LNI_889009098322 = CMT.BL_7391093286680
    9. lkj.LNI_209ß02300144 = CMT.BL_7391093286680
    10. lkj.RM_30713903782 = RT.RAC_6730288759092
    11. lkj.R_1297302370943(0.005)
    12. xik.MXD.ET.Add(New MYL_013fgAPQ(lkj), GlobalLayer_Name)
    13. LI_SEA2469h_jukSS.Add(lkj)
    14. xik.MXD.IV()
    15. xik.MXD.TE.Clear()
    16. xik.MXD.ET.ClearSelection()
    17. xik.Xsns.Clear()
    18. ElseIf xdsns.Count = 2 Then
    19. xik.Xsns.Clear()
    20. xik.Xsns.Add(kdsn)
    21. xik.MoveFrom = kdsn
    22. End If
    23. End Sub
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    @Haudruferzappeltnoch
    Die Ausrufezeichen kann man umgehen. Man könnte den String auch als Integer darstellen. Hab gestern rumprobiert und eine kleine Funktion geschrieben, die einen String in Zahlen als List(Of Integer) erzeugt ( Long sich vielleicht besser eignen ). Sicher die Zahlenlogik ist das einfachste. Kann man aber leicht ausbauen.

    VB.NET-Quellcode

    1. Dim str as String = "Hello World
    2. ' könnte man schreiben
    3. Dim str As New List(Of Integer) From {805012012, 150023015, 1801204} ' Hello World


    Sowohl GTP als auch BART konnten mit dem Code also nichts anfangen. Die allgemein Erklärung von GTP ist soweit nicht falsch. Was jedoch da wirklich passiert ist weiterhin unklar.
    Der Sub fügt ein geometrisches Element in eine Skizze ein. Mehr sag ich dazu nicht. Und der Sub ist absolut 0815.

    @siycah
    Die Frage ist warum?


    Ja wenn sich jemand die Mühe wirklich antun will, die Applikation zu cracken, dann möchte ich ihm das so schwer wie möglich machen.

    Mehrmals habe ich jetzt deinen Post durch gelesen. Es scheint so als ob du ein absoluter Profi in dem Bereich bist. :thumbsup: Ich lass mir das mal alles durch den Kopf durchgehen. :D

    DragsTrail schrieb:

    Ja wenn sich jemand die Mühe wirklich antun will, die Applikation zu cracken,
    Ist es Deine App Wert, gecrackt zu werden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    DragsTrail schrieb:

    Ja wenn sich jemand die Mühe wirklich antun will, die Applikation zu cracken

    Was @RodFromGermany fragt. Bei vielen Applikationen ist es nicht wert und du wirst so oder so nicht die Aufmerksamkeit derer auf dich ziehen, die unendlich viel Zeit reinstecken, etwas zu knacken.

    DragsTrail schrieb:

    Es scheint so als ob du ein absoluter Profi in dem Bereich bist.

    Da ich viel mit Cybersecurity und Embedded-Entwicklung mache, nimmt man gelegentlich wohl mal was mit, ja.
    Ich habe bereits eigene Secure-Boot-Verfahren entwickelt und implementiert. Da nimmt man einiges mit, was Verschlüsselung, Signierung, Patentschutz usw. angeht mit.


    Mir ist über Nacht übrigens noch eine weitere Möglichkeit eingefallen.
    Du kannst den Code in eine Managed-DLL einfügen und verschlüsseln. Mach einen einfachen ECDH Pair, mit deinem privaten Key verschlüsselst du die DLLs und gibst sie mit deinem Programm mit.
    Per REST-Aufruf holst du dir bei jedem Start den Public Key und entschlüsselst damit deine DLL, die du dann aus dem RAM heraus in das Applikationsnamespace laden kannst: learn.microsoft.com/en-us/dotn…assembly-load(system-byte())

    Edit:

    @Haudruferzappeltnoch Ich lasse meistens die Finger von KI-gestützter Programmierung. Das Meiste was dabei rauskommt ist fachlich einfach nur falsch oder an manchen Stellen gerade mal so richtig, dass es compiled aber kleine Nuancen nicht passen.

    Ich habe Bard vorhin gefragt, ob der mir eine einfache Klasse in C# schreiben kann. Dabei kam folgendes raus:

    Ich:
    Please write a C# class which generates an Elliptic Curve Diffie Hellmann public/private key pair and stores it to /home/test/keys/testkey and /home/test/keys/testkey.pub.


    I'm a text-based AI and can't assist with that.


    Edit2:

    Der gleiche Prompt in GPT resultiert mit:

    C#-Quellcode

    1. ​using System;
    2. using System.IO;
    3. using Org.BouncyCastle.Asn1.Sec;
    4. using Org.BouncyCastle.Crypto;
    5. using Org.BouncyCastle.Crypto.Generators;
    6. using Org.BouncyCastle.Crypto.Parameters;
    7. using Org.BouncyCastle.Math;
    8. using Org.BouncyCastle.Security;
    9. public class ECDHKeyGenerator
    10. {
    11. private const string PrivateKeyFilePath = "/home/test/keys/testkey";
    12. private const string PublicKeyFilePath = "/home/test/keys/testkey.pub";
    13. public static void GenerateKeyPair()
    14. {
    15. // Generate ECDH key pair
    16. var keyGenerationParameters = new ECKeyGenerationParameters(SecNamedCurves.GetByName("secp256r1"), new SecureRandom());
    17. var keyPairGenerator = GeneratorUtilities.GetKeyPairGenerator("ECDH");
    18. keyPairGenerator.Init(keyGenerationParameters);
    19. AsymmetricCipherKeyPair keyPair = keyPairGenerator.GenerateKeyPair();
    20. ECDHPrivateKeyParameters privateKey = (ECDHPrivateKeyParameters)keyPair.Private;
    21. ECDHPublicKeyParameters publicKey = (ECDHPublicKeyParameters)keyPair.Public;
    22. // Save private key to file
    23. SavePrivateKey(privateKey);
    24. // Save public key to file
    25. SavePublicKey(publicKey);
    26. }
    27. private static void SavePrivateKey(ECDHPrivateKeyParameters privateKey)
    28. {
    29. using (var privateKeyStream = new FileStream(PrivateKeyFilePath, FileMode.Create, FileAccess.Write))
    30. {
    31. var writer = new StreamWriter(privateKeyStream);
    32. writer.Write(privateKey.D.ToByteArrayUnsigned().ToBase64String());
    33. writer.Flush();
    34. }
    35. Console.WriteLine("Private key saved to: " + PrivateKeyFilePath);
    36. }
    37. private static void SavePublicKey(ECDHPublicKeyParameters publicKey)
    38. {
    39. using (var publicKeyStream = new FileStream(PublicKeyFilePath, FileMode.Create, FileAccess.Write))
    40. {
    41. var writer = new StreamWriter(publicKeyStream);
    42. writer.Write(publicKey.Q.GetEncoded(true).ToBase64String());
    43. writer.Flush();
    44. }
    45. Console.WriteLine("Public key saved to: " + PublicKeyFilePath);
    46. }
    47. }
    48. // Extension method to convert byte array to Base64 string
    49. public static class ByteArrayExtensions
    50. {
    51. public static string ToBase64String(this byte[] bytes)
    52. {
    53. return Convert.ToBase64String(bytes);
    54. }
    55. }
    56. class Program
    57. {
    58. static void Main()
    59. {
    60. ECDHKeyGenerator.GenerateKeyPair();
    61. }
    62. }



    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „siycah“ ()

    Ja nu, CoPilot ist ja nicht umsonst schon an vielen Stellen zu sehen. Das ist mehr oder minder der selbe Stand wie GPT 4, so wie ich das sehe.
    Er wird dir keine komplexen Probleme lösen, aber die einfachen Dinge kann er natürlich schnell erzeugen.

    Und jedenfalls für solche probabilistischen Dinge wie Neuinterpretation vorgegebener Konzepte sehe ich AI ganz weit vorn. Das GPT da geometrische Operationen erkennt, dass ist ne ganz andere Nummer, mit Mathe können die ja nicht um, da nicht probabilistisch. Also selbst wenn der Code unverschleiert daher käme, hätte GPT das wohl nicht gemacht und wer weiß ob das jeder Mensch auch sofort hinkriegen würde.

    @DragsTrail
    Dann hast du doch die Lösung für dein Problem. Wenn du String mit Long ersetzt, dann geht das auch für andere Klassen, und wenn alles nur noch Long ist, dann fällt das der Ambiguität zum Opfer und ist wertlose Information.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    @RodFromGermany
    Meiner Meinung nach ja. Sonnst würde ich den Aufwand nicht machen.

    @siycah
    So ganz komm ich da nicht mit. Meine DLL#s sind als Verweis in meinem Projekt. Also greift mein Projekt auf dieses DLL#s zu. Wenn ich jetzt eine DLL verschlüssele, dann leuchtet VS wie ein Weihnachtsbaum, weil er die ganzen Klassen und Funktionen nicht mehr kennt.
    Könntest mir bitte ein kleines Testprojekt dazu zeigen?

    @Haudruferzappeltnoch
    Ist ein Ansatz. Eine gut getarnte De-Encrypt Function muss man eben erstellen! :D

    DragsTrail schrieb:

    Sonnst würde ich den Aufwand nicht machen.
    Wie soll Dein Programm mit der DeinString-Klasse mit anderen Framework-Klassen kommunizieren, deren Properties vom Type String sind?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    DragsTrail schrieb:

    In meiner Applikation gibt es Klassen und Code-Teile, die auch wenn Sie durch Dotfuscator gelaufen sind, auf anhieb erkennbar ist, was diese machen. Das will ich verhindern.


    Dann schießt du hier am Ziel vorbei.
    Schicke mir bitte gerne mal deine "geschützte" Binary. Gerne mit deinem "streng geheimen super code" selbst die knackt dir jeder mit etwas Reverse Engineering Skills in 10 Minuten locker.
    Das ganze verschleiern bringt dir in der NET Welt nichts.
    Wer etwas verschleiert hat etwas zu verbergen - entweder ( soll keine Unterstellung sein ) um schadhaften Code zu verstecken der nicht erkannt wird von Virenprogrammen/Heuristik oder weil
    der jenige denkt damit wird sein Code geschützt und es ist sicherer.
    Erst letztens gab es hier einen Thread der auch versucht hat Sicherheit durch Obfuskation zu erhalten was total nach hinten los gegangen ist.

    Mein Tipp daher: Lass das ganze sein. Wenn du unbedingt nen Obfuskator drüber laufen lassen willst mach es - wird aber egal wie dein Tool nicht schützen.
    Angebot steht: Schick mir gerne die "verschlüsselte/obfuskierte" Binary und ich zeige dir wie viel das ganze bringt.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    DragsTrail schrieb:

    Meine DLL#s sind als Verweis in meinem Projekt.


    Habe ich mir gedacht, ja. Du musst dafür deinen Code umstrukturieren.
    Sowas muss man von vorn herein mitbedenken und den Code quasi stateless schreiben.
    Denk an Dependency Injection.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Ich schließe mich der Antwort von xChRoNiKx an. Das ganze Thema Obfuskation ist nur eine Scheinsicherheit die nur bei Menschen funktioniert, die sich nicht tiefer mit den Möglichkeiten des Reverse Engineering beschäftigen.
    Mfg -Franky-

    -Franky- schrieb:

    nur eine Scheinsicherheit die nur bei Menschen funktioniert, die sich nicht tiefer mit den Möglichkeiten des Reverse Engineering beschäftigen.


    Absolut korrekt. Wurde hier leider auch schon mehrfachst (auch von mir) erwähnt. Da der TE sich aber von seinem Gedankengang nicht abbringen lässt, kann man nur noch Möglichkeiten bieten, wie das ganze irgendwie funktionieren könnte.

    Nicht umsonst mein Vorschlag mit dem Native Backend :D
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    @siycah
    Bei der Datenmenge ist das jetzt absolut NoGO.

    @xChRoNiKx
    Genau solche Spezialisten wie dich brauch ich. Mein Code schick ich dir natürlich nicht. Aber wie ist es wenn ich dir ein MSI Projekt schicke. Kannst du schön installieren und dir das ganze in Ruhe anschauen?????

    Ziel soll es sein zu sagen was das Programm macht und Optimum ein Reverse Engineering. Ist eine ganz simple App.

    In diesem Sinne, rutscht gut Rein ins neue Jahr!

    DragsTrail schrieb:

    Genau solche Spezialisten wie dich brauch ich. Mein Code schick ich dir natürlich nicht. Aber wie ist es wenn ich dir ein MSI Projekt schicke. Kannst du schön installieren und dir das ganze in Ruhe anschauen?????


    Schick mir eine Privat Nachricht mit dem File. Am liebsten wäre es ohne Setup wenn es geht sondern nur die Standalone Files.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    DragsTrail schrieb:

    Ja ich schätze trotzdem deine herabwürdigende Art. Deine Fragen sind meiner Meinung nach, leider absolut irrelevant zu dem Thema.
    Mit "herabwürdigend" meinst du vermutlich, dass ich bei dir "völlige Sebstüberschätzung" diagnostiziere? wenn du meinst, String, DateTime, Double neu implementieren zu können?
    Ich weiss, das ist starker Tobak, und das hört sicher keiner gerne.
    Aber genau deshalb stelllte ich meine "irrelevanten" Fragen: Könntest du sie richtig beantworten - das würde mich beeindrucken, und ich müsste eingestehen, dass du überhaupt weisst, wovon du redest.
    Und ich müsste das Postulat "völlige Selbstüberschätzung" zurücknehmen.

    Nimms mir übel oder nicht: Ich versuche dir auszureden, etwas zu versuchen, was du aller-aller-aller-höchstwahrscheinlich nicht kannst.
    Und wenn du es könntest, dann würdest du selbst einsehen, dasses so aufwändig ist, dasses der Mühe nicht wert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    DragsTrail schrieb:

    Bei der Datenmenge ist das jetzt absolut NoGO.


    Irgendwo muss man den Strich ziehen. Das, was du erreichen möchtest - was ohnehin schon super schwer ist - wird nicht gehen, wenn du deinen Code nicht entsprechend vorbereitest und schreibst.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    @All Frohes Neues Jahr

    @ErfinderDesRades
    Du brauchst überhaupt nichts zurück nehmen. Aber arbeite doch mal mit. Du weist um was es geht. Nein, das geht nicht ist einfach keine Lösung!

    @'siycah
    '
    ​wird nicht gehen, wenn du deinen Code nicht entsprechend vorbereitest und schreibst.

    OK. Macht sinn. Dann zeig doch bitte anhand eines kleinen Beispiels wie das im Detail funktioniert.
    Erstmal dir auch frohes Neues!

    Ich habe dir eigentlich alle Links gegeben, die du brauchst, damit du das umsetzen kannst.
    Wenn du möchtest, kann ich dir ein Angebot unterbreiten, dass ich das für dich implementiere, aber das ist auch nicht Sinn der Sache.

    Ein weiterer nützlicher Link wäre das hier: learn.microsoft.com/en-us/dotn…&viewFallbackFrom=net-8.0

    Bevor du dein großes Projekt umsetzt, setz vielleicht mal ein kleines Projekt um und probier dich dort aus. Wenn du einen Lösungsansatz hast, helfen wir dir gerne weiter.
    Ich versuche hier im Forum zu helfen, weil ich Spaß an der Freude habe. Es ist eine angenehme Abwechslung zu meinem Arbeitsalltag mit zwei Jobs (Selbstständigkeit und Alltagsjob) - das ist sicherlich bei den meisten erfahrenen Kollegen hier so.

    Wenn ich hier ein ganzes Projekt für dich umbauen soll, mein Stundenlohn ist roundabout 110€ :)
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)