Windows Klassen mit anderen Namen neu erstellen

  • VB.NET

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

    Windows Klassen mit anderen Namen neu erstellen

    Hallo,

    gibt es eine Möglichkeit in der folgenden Klasse "String" in einen anderen Namen zu ändern.

    VB.NET-Quellcode

    1. Public Class ABC
    2. Public Sub New(ByVal str As String)
    3. Me.str = str
    4. End Sub
    5. Private _str As String
    6. Public Property str As String
    7. Get
    8. Return _str
    9. End Get
    10. Set(ByVal value As String)
    11. _str = value
    12. End Set
    13. End Property
    14. End Class


    LG
    @DragsTrail Was willst Du erreichen?
    Was ist Dein Plan?
    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!
    Ich würde gerne unteranderem die String-Klasse umbenenne, damit nicht sofort ersichtlich ist das es sich um ein String handelt.

    VB.NET-Quellcode

    1. ' Anstelle von
    2. Dim str As String = ""
    3. ' sollte stehen
    4. Dim str As DSC8398ssL


    als Beispiel.

    Viielleicht ein wenig mehr Infos: Ich habe ein eignes Obfuscation-Programm geschrieben ( nur für meine eigene Anwendung ). DIe ganzen Windows-Klassen sind mir noch ein Balken im Auge.
    @DragsTrail Das wird so nicht funktionieren.
    Der Compiler muss doch wissen, dass Du mit .IndexOf() die Position eines Zeichens in einem String suchst und nicht in der Klasse DSC8398ssL.
    Ansonsten müsstest Du praktisch die komplette Klasse String aus dem Framework abschreiben, um ihre Funktionalität sicher zu stellen.
    Du kannst nur Deine eigenen Klassen und Member verschleiern, nicht aber das Framework.
    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!
    Ich würde auch gerne wissen, was du damit erreichen möchtest?

    Wenn es dir um Obfuscation geht, oder dass niemand deinen Quellcode lesen soll: dafür hast du dir (leider) die falsche Sprache ausgewählt. Man kann dotnet zwar schwer leserlich machen, aber das ist lange kein Schutz gegen Schnüffeln.
    Außerdem ist das absolute Worst-Practice, unnötig Quellcode unleserlich zu machen. Das macht dir das Leben am Ende des Tages nur unnötig schwer.

    EDIT:
    In C++ würde sowas gehen, indem du ein Typ-Alias machst:

    C-Quellcode

    1. using str_t = std::string;
    2. typedef std::string mystr;
    3. #define std::string foostr
    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 :)
    Kann man mit manchen Klassen via Vererbung machen. Aber String geht z.B. nicht weil die klasse versiegelt ist (NotInheritable)

    Du kannst aber einen eigenen Wertetyp(Structure) mit passenden expliziten und impliziten operatoren machen, aber da hast du viel zu tun.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    @RodFromGermany
    Ist klar. Aber der Ansatz ist gut. Also du meinst das man die ganze String-Klasse kopieren soll aus dem Framework und im eigenem Projekt als Klasse mit eigenen Namen hinterlegen soll?

    @siycah
    Ich verschleiere ja den Fertigen Code und nicht den den ich gerade erstelle. Das ist eben Ansichtssache.

    @DTF
    Hast du ein Code-Beispiel wie man so etwas machen könnte?

    DragsTrail schrieb:

    Ich verschleiere ja den Fertigen Code und nicht den den ich gerade erstelle. Das ist eben Ansichtssache.


    Wenn du die String-Klasse umbenennen möchtest, machst du das mit deinem Quellcode.
    Was du möchtest, ist eher sowas hier: preemptive.com/dotfuscator/ce/docs/help/intro_install.html, preemptive.com/dotfuscator/ce/…/getting_started_gui.html

    Das injeziert obfuskierten Code in die Binary, so wird der Code unleserlich, beim Dekompilieren.
    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 :)

    DragsTrail schrieb:

    Also du meinst das man die ganze String-Klasse kopieren soll aus dem Framework und im eigenem Projekt als Klasse mit eigenen Namen hinterlegen soll?
    Das war nicht meine Intention.
    Ich wollte Dir aufzeigen, was Du eigentlich lassen sollst :!:
    Warum muss es denn die String-Klasse sein?
    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:

    Hast du ein Code-Beispiel wie man so etwas machen könnte?


    Ja, kann dir einen Schnipsel aus meiner NativeMethods DLL geben, da hab ich die wichtigsten nativen Typen nachgemacht. Hier nicht ganz komplett, aber zu sehen ist wie das vom prinzip her funktioniert. Wenn ich nun aber daran denk, da fehlen noch weitere. Bei String willste ja auch die Funtionalität haben. Also sowas wie Substring, IndexOf..... da hast du dann sehr viel zu tun. Habs aber nur in C#, kannste aber selbst durch einen Konverter jagen. Das kannste auch mit einer Klasse statt Structure machen, aber ich musste das mit Structs machen, weil das sonst mit den API Calls nicht klappt, wo ich diese Typen ja für gemacht hab.

    C#-Quellcode

    1. public struct DWORD
    2. {
    3. private uint dword;
    4. public static implicit operator DWORD(byte dword) => new DWORD(dword);
    5. public static explicit operator DWORD(short dword) => new DWORD((uint)dword);
    6. public static implicit operator DWORD(ushort dword) => new DWORD(dword);
    7. public static implicit operator DWORD(uint dword) => new DWORD(dword);
    8. public static explicit operator DWORD(int dword) => new DWORD((uint)dword);
    9. public static explicit operator DWORD(long dword) => new DWORD((uint)dword);
    10. public static explicit operator DWORD(ulong dword) => new DWORD((uint)dword);
    11. public static explicit operator byte(DWORD dword) => (byte)dword.dword;
    12. public static explicit operator short(DWORD dword) => (short)dword.dword;
    13. public static explicit operator ushort(DWORD dword) => (ushort)dword.dword;
    14. public static implicit operator uint(DWORD dword) => dword.dword;
    15. public static explicit operator int(DWORD dword) => (int)dword.dword;
    16. public static implicit operator ulong(DWORD dword) => dword.dword;
    17. public static implicit operator long(DWORD dword) => dword.dword;
    18. public DWORD(uint dword)
    19. {
    20. this.dword = dword;
    21. }
    22. }


    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    Ich bezweifele, dass das Umbenennen einen Nutzen hat, der den Kosten nahekommt.
    Die String-Klasse heißt dann ja überall ABCXYZ. Ich denke wer sich die Mühe macht den Quellcode auseinander zu nehmen, wird sich an dieser Substitution nicht weiter stören.
    Es ist sogar wahrscheinlich, dass ChatGPT die Klassennamen ohne weitere Zusatzinformation allein mit genug Code zurück substituieren kann, einfach weil ChatGPT sich vielmehr auf den Kontext fokussiert als auf Namen oder Bezeichnungen. Können wir ja mal mit deinem fertig obfuskierten Code versuchen^^
    @siycah
    @RodFromGermany
    Den hab ich eh mit VS2022 PRO dabei. Ja ok es ist die Community Version nicht die Professional. Das gleiche was er macht mach ich auch. Meine Strings sind nicht in Bytes sondern verschlüsselt. Finde ich besser.

    Mir geht es darum den Klassen ( String, Double, Date und Integer) einen anderen Namen zu geben.

    So schaut ein 0815 Sub nur mit meinen Klassen aus. Und die restlichen 450MB auch. Die Namen von den Steuerelementen sind auch in der Art.

    VB.NET-Quellcode

    1. Private Sub Adx9893mms89000(ByVal _xx_xxxx_xxxx As _XIk809092_TTKLKPS3ssd, ByVal _xx_xxx_xxxxx As Kdsnmo98093_UIJIKJDD, ByVal _xX_xxx_xXxx As List(Of Kdsnmo98093_UIJIKJDD))
    2. If _xX_xxx_xXxx.Count = 0 Then
    3. _xx_xxxx_xxxx._xX_xxx_xXxx.Add(_xx_xxx_xxxxx)
    4. _xx_xxxx_xxxx._moveFrom = _xx_xxx_xxxxx
    5. ElseIf _xX_xxx_xXxx.Count = 1 Then
    6. _xx_xxxx_xxxx._xX_xxx_xXxx.Add(_xx_xxx_xxxxx)
    7. Dim _Xx_xxxX_xxxXx As lkj988DPQWK9999 = New lkj988DPQWK9999(_xX_xxx_xXxx(0), _xX_xxx_xXxx(1))
    8. _Xx_xxxX_xxxXx.LNI_889009098322 = CMT_93ß04ß011139.BL_7391093286680
    9. _Xx_xxxX_xxxXx.LNI_209ß02300144 = CMT_93ß04ß011139.BL_7391093286680
    10. _Xx_xxxX_xxxXx.RM_30713903782 = RT_911184394266.RAC_6730288759092
    11. _Xx_xxxX_xxxXx.R_1297302370943(0.005)
    12. _xx_xxxx_xxxx.MDX_u99i99999www.ET_44111978348784.Add(New MYL_013fgAPQ(_Xx_xxxX_xxxXx), GlobalLayer_Name)
    13. LI_SEA2469h_jukSS.Add(_Xx_xxxX_xxxXx)
    14. _xx_xxxx_xxxx.MDX_u99i99999www.IV_9378479809222()
    15. _xx_xxxx_xxxx.MDX_u99i99999www.TE_400072984944.Clear()
    16. _xx_xxxx_xxxx.MDX_u99i99999www.ET_44111978348784.ClearSelection()
    17. _xx_xxxx_xxxx._xX_xxx_xXxx.Clear()
    18. ElseIf _xX_xxx_xXxx.Count = 2 Then
    19. _xx_xxxx_xxxx._xX_xxx_xXxx.Clear()
    20. _xx_xxxx_xxxx._xX_xxx_xXxx.Add(_xx_xxx_xxxxx)
    21. _xx_xxxx_xxxx._moveFrom = _xx_xxx_xxxxx
    22. End If
    23. End Sub


    @Haudruferzappeltnoch

    Wer sagt das die gleichen Klassen immer den gleichen Namen haben müssen???

    DTF schrieb:

    Habs aber nur in C#

    Macht das Sinn? In c# kannst du ja einfach Alias-Namen global vergeben:

    C#-Quellcode

    1. global using DWORD = uint;
    2. namespace ConsoleApp1;
    3. internal class Program {
    4. static void Main(string[] args) {
    5. DWORD var = 4;
    6. Console.WriteLine($"DWORD is {var}");
    7. }
    8. }


    Aber egal.
    Das funktioniert auch in VB.NET:

    VB.NET-Quellcode

    1. Imports Foo = System.String
    2. Imports Bar = System.Double
    3. Friend Class FrmMain
    4. Private Sub Button1_Paint(sender As Object, e As PaintEventArgs) Handles Button1.Paint
    5. Dim qwe As Foo = String.Empty
    6. Dim Baz As Bar = 1
    7. End Sub
    8. End Class
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    DragsTrail schrieb:

    Mir geht es darum den Klassen ( String, Double, Date und Integer) einen anderen Namen zu geben
    Das geht nicht.
    Man kann einer Klasse keinen anderen Namen geben.

    was du nun scheints versuchst ist, in völliger Selbstüberschätzung neue, andere Klassen und Strukturen zu programmieren, die in deinem Programm dann das machen sollen, wofür man üblicherweise String, Double, Date und Integer nimmt.
    Dabei glaube ich nichtmal, dass dir der Unterschied von Class und Structure überhaupt bekannt ist - oder?
    Oder kannst du zumindest angeben, wieviele Interfaces der Datentyp Double implementiert?
    Oder auch nur die Anzahl der String-Operatoren?

    Also deine Obfuscator-Datentypen werden zwangsläufig so 95% des Leistungs-Umfangs einbüssen.

    Etwa so einen einfachen Code wirst du mit BastelKram nie nie nie hinkriegen:

    VB.NET-Quellcode

    1. Private Sub SimpleSub()
    2. Dim i = 9.55
    3. Dim s = $"i: {i,15:n3}"
    4. Debug.WriteLine(s)
    5. Debug.WriteLine($"i: {123.234567,15:n3}")
    6. End Sub


    Ausgabe:

    Quellcode

    1. i: 9,550
    2. i: 123,235

    (beachte die Bündigkeit der Dezimalstellen).



    @Bluespide: Der durch using (imports bei vb.net) etablierte Alias-Name findet keinen Eingang in den IL-Code. Wie sollte das auch gehen?
    Man kann ja für denselben Datentyp verschiedene Aliasse wählen:

    VB.NET-Quellcode

    1. Imports Foo = System.String
    2. Imports Bar = System.String
    3. Friend Class FrmMain
    4. Private Sub Button1_Paint(sender As Object, e As PaintEventArgs) Handles Button1.Paint
    5. Dim Baz As Bar = Foo.Empty
    6. End Sub
    7. End Class

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

    ErfinderDesRades schrieb:

    @Bluespide: Der durch using (imports bei vb.net) etablierte Alias-Name findet keinen Eingang in den IL-Code. Wie sollte das auch gehen?

    Schon klar. Ging nur um das Beilspiel DWORD von DTF, da hier ein globaler Alias vermutlich reicht und eventuell nicht bekannt war. global usings ist ja noch nicht so lange drin und den Using-Alias in jeder Datei neu angeben zu müssen macht ja kein Sinn. Ist doch viel zu viel Aufwand. Aber mit global ist es dann doch endlich nutzbar. Meiner Meinung nach.

    Bluespide schrieb:

    Aber mit global ist es dann doch endlich nutzbar. Meiner Meinung nach.


    Ich finde das sogar genial. Hab zwar viel umsonst gemacht, aber wenn ich nun eine Funktion einbaue wo ein Typ verwendet wird den ich noch nicht drin hab, ist das dank global using flott erledigt. Sofern ein Typ mit passender Range vorhanden ist.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    DragsTrail schrieb:

    Mir geht es darum den Klassen ( String, Double, Date und Integer) einen anderen Namen zu geben.

    ... die am Ende des Tages nichts anderes machen, als die Klassen, die es bereits gibt. Selbst wenn sie andere Namen hätten, wäre der Codeabruck immer noch gleich und es wüsste sofort jeder, was die machen. Effekt also == null.

    Es will dir hier niemand etwas böses; im Gegenteil. Vielleicht sagst du uns insgesamt, was genau du bezwecken möchtest. Dann können wir dich bestimmt weiter in die richtige Richtung lenken.

    DragsTrail schrieb:

    Ja ok es ist die Community Version nicht die Professional.

    Das ist egal. Die wichtigsten Funktionen sind drin.

    DragsTrail schrieb:

    Das gleiche was er macht mach ich auch. Meine Strings sind nicht in Bytes sondern verschlüsselt. Finde ich besser.

    Nein, Dotfuscator macht noch sehr viel mehr als das, was du vorhast. Der baut dir mitunter sogar Code-Integritätsprüfungen rein.

    Wenn deine Strings wirklich verschlüsselt wären, dann müsstest du die String-Klasse nicht umbenennen. Das Thema Verschlüsselung und Co. hatten wir letztens erst im Forum.
    Selbst dann, sind deine Strings immer noch Bytes (bzw. UTF-16/chars in .net).

    EDIT:

    Haudruferzappeltnoch schrieb:

    Du willst dieselbe Klasse also 100 mal programmieren, damit du immer nen anderen Name verwenden kannst? Viel Spaß​


    Meh. Ich glaube nicht, dass er das vor hat. Es hört sich immer mehr danach an, als würde er am Ende sowas haben wollen, die rohe OP Codes ähneln, damit "niemand" seine Binary auslesen kann (also ein Obfuscator).
    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 :)
    @ErfinderDesRades
    Ja ich schätze trotzdem deine herabwürdigende Art. Deine Fragen sind meiner Meinung nach, leider absolut irrelevant zu dem Thema. Also ich messe keine Leistungsminderung.

    @Haudruferzappeltnoch
    Nicht wirklich :D

    @siycah
    Ich nehme hier nichts persönlich.

    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.

    Zum Thema String-Verschlüsselung. So schauen die Strings bei mir aus.

    VB.NET-Quellcode

    1. ' Anstelle von
    2. Dim str As String = "Hello World"
    3. '' habe ich ( Dim sind bei mir immer etwas mit XxxxXX_XXxxx usm. )
    4. Dim XxxxX_xX_Xxxx As String = "(=kljjksw09ß2olwslmxkmo2090ßikdkyaöö"


    Das "As String" ist mein Problem.