.DLL eine MsgBox anzeigen lassen

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von zn-gong.

    .DLL eine MsgBox anzeigen lassen

    Hallo Zusammen,
    Ich suche schon seid 2 Tagen nach einer Lösung und zwar:

    Ich möchte gerne dass falls, meine .DLL "injected" wird (z.B in notepad.exe) dass sie dann mir eine MsgBox anzeigen soll.
    Ich glaube er meint wenn die.dll mit notepad geöffnet wird, das wäre so das was ich mir vorstellen könnte das er meint.

    Wenn du das meinst:

    Geht nicht. Eine .dll ist kein executeable (ein arbeitendes Programm) sondern nur eine Datei die Funktionen etc bereitstellt. Sie selbst kann also nicht prüfen ob sie genutzt wird bevor man sie durch ein executeable laufen lässt. Da Textverarbeitungsprogramme nicht dazu programmiert sind auf Funktionen deiner .dll zuzugreifen (warum sollten sie auch, schließlich bist du ein fremder) wird diese schlichtweg gar nicht benutzt wofür sie genutzt werden soll.

    Meine Antwort geht wie gesagt nur von der obigen Vermutung aus!

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

    Natürlich ist es möglich, eine DLL in einen laufenden Prozess zu injecten, jedoch lassen sich Codes dafür als Teile von Malware nutzen, was hier eigebtlich nicht erwünscht ist.
    Klar geht das, aber nur nativ. Einfach im DllMain auf DLL_THREAD_ATTACH bzw. DLL_THREAD_ATTACH reagieren. Das wird also beim normalen laden einer Dll aufgeführt, weil dass aber ne riesige Sicherheitslücke sein kann, würgt jede .Net Anwendung soetwas sofort mit einer Exception ab.
    Gonger96

    Meinst du mit Case? Wenn ja, dann muss ich dich enttäuschen, es geht leider nicht.

    Wenn sich jemand fragt wofür ich das Brauch ? Dann kann ich ihm/ihr auch jetz sagen, dass ich es nur zur lernerischen zwecken benutzen möchte.
    Also: Man kann .NET-DLLs in .NET-Prozesse injecten und man kann native DLLs ind native Prozesse injecten. Dass das über Kreuz geht, ist mir nicht bekannt. Es ist also nicht möglich, .NET-Code in dein Notepad zu injecten.

    XinSho schrieb:

    msdn.microsoft.com/en-us/libra…ion.msgbox(v=vs.110).aspx

    Hat timonator aber recht. Ist kein .NET-konformes Zeugs, siehe Namespace ​Microsoft.VisualBasic, den Du schleunigst entfernen solltest, da der das aus VB6 kommende Zeugs zur Verfügung stellt, was in .NET nichts mehr zu suchen hat, da es sich anders verhält.

    Markus Jacobs schrieb:

    Diese ist umfangreicher und besser.

    Jein, das ist genau das selbe, nur dass die MsgBox die ​MessageBox.Show-Funktion ziemlich schlampig wrappt, weil es u. a. jeden Scheiß castet. Am Ende ruft sie eh die MessageBox.Show-Methode auf, das heißt die ​MsgBox-Funktion aus VB6 delegiert nur zur modernen .NET-Variante in VB.NET. Allein dies zeigt schon, dass es Käse ist jene zu verwenden, dann kann man es gleich komplett .NET-konform machen, was eben durchaus ordentlicher ist und auch imo besseren Codingstil im Bereich der .NET-Programmierung zeigt.

    Wen's interessiert:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. <MethodImpl(MethodImplOptions.NoInlining), HostProtection(SecurityAction.LinkDemand, Resources:=HostProtectionResource.UI)> _
    2. Public Shared Function MsgBox(ByVal Prompt As Object, ByVal Optional Buttons As MsgBoxStyle = 0, ByVal Optional Title As Object = new Object()) As MsgBoxResult
    3. Dim owner As IWin32Window = Nothing
    4. Dim text As String = Nothing
    5. Dim titleFromAssembly As String
    6. Dim vBHost As IVbHost = HostServices.VBHost
    7. If (Not vBHost Is Nothing) Then
    8. owner = vBHost.GetParentWindow
    9. End If
    10. If ((((Buttons And 15) > MsgBoxStyle.RetryCancel) OrElse ((Buttons And 240) > MsgBoxStyle.Information)) OrElse ((Buttons And &HF00) > MsgBoxStyle.DefaultButton3)) Then
    11. Buttons = MsgBoxStyle.OkOnly
    12. End If
    13. Try
    14. If (Not Prompt Is Nothing) Then
    15. [text] = CStr(Conversions.ChangeType(Prompt, GetType(String)))
    16. End If
    17. Catch exception As StackOverflowException
    18. Throw exception
    19. Catch exception2 As OutOfMemoryException
    20. Throw exception2
    21. Catch exception3 As ThreadAbortException
    22. Throw exception3
    23. Catch exception9 As Exception
    24. Throw New ArgumentException(Utils.GetResourceString("Argument_InvalidValueType2", New String() { "Prompt", "String" }))
    25. End Try
    26. Try
    27. If (Title Is Nothing) Then
    28. If (vBHost Is Nothing) Then
    29. titleFromAssembly = Interaction.GetTitleFromAssembly(Assembly.GetCallingAssembly)
    30. Else
    31. titleFromAssembly = vBHost.GetWindowTitle
    32. End If
    33. Else
    34. titleFromAssembly = Conversions.ToString(Title)
    35. End If
    36. Catch exception4 As StackOverflowException
    37. Throw exception4
    38. Catch exception5 As OutOfMemoryException
    39. Throw exception5
    40. Catch exception6 As ThreadAbortException
    41. Throw exception6
    42. Catch exception13 As Exception
    43. Throw New ArgumentException(Utils.GetResourceString("Argument_InvalidValueType2", New String() { "Title", "String" }))
    44. End Try
    45. Return DirectCast(MessageBox.Show(owner, [text], titleFromAssembly, (DirectCast(Buttons, MessageBoxButtons) And DirectCast(15, MessageBoxButtons)), (DirectCast(Buttons, MessageBoxIcon) And DirectCast(240, MessageBoxIcon)), (DirectCast(Buttons, MessageBoxDefaultButton) And DirectCast(&HF00, MessageBoxDefaultButton)), (DirectCast(Buttons, MessageBoxOptions) And DirectCast(-4096, MessageBoxOptions))), MsgBoxResult)
    46. End Function​

    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Es ist also nicht möglich, .NET-Code in dein Notepad zu injecten.
    Doch, das ist möglich. Habe ich selber schon gemacht. Mit .NET alleine kommst du damit nur nicht hin. Du brauchst mindestens noch eine "native" DLL.

    Du musst da wie folgt vorgehen:
    1. Native DLL injecten
    2. In der nativen im vom Gonger erwähnten DllMain bei der Nachricht DLL_THREAD_ATTACH eine neue .NET-CLR erstellen. (CorBindToRuntimeEx)
    3. Diese Runtime starten. Als Parameter kannst du da den Pfad zur managed-Assemlby nehmen (ExecuteInDefaultAppDomain)
    4. In Schritt 3 wird auch die Methode aufgerufen, die du dort angegeben hast. von da aus kannst du dann weiter gehen.
    5. .NET-Referenzen werden automatisch geladen.
    6. System.Windows.Forms kann auch benutzt werden
    7. Damit du aber im UI-Thread des Hostprozesses arbeiten kannst, musst du bei der Hostanwendung irgendwo einen Hook im UI-Thread platzieren, sodass dein Code aufgerufen wird.
    8. Den Hook kannst du mit C++ implementieren, du musst diesen aber aus .NET anstoßen, weil du sonst nicht an die Funktionsadresse der .NET-Methode kommst (z. B. via p/invoke).
    9. Zugriff auf den unverwalteten Speicher der kompletten Anwendung hast du in C#/VB über die Pointerarithmetik bzw. die Marshal-Klasse.
    10. Das sollte's sein.

    Ab Punkt 7 bin ich mir nicht mehr sicher, ob man das wirklich so machen muss. Chrisber und ich haben es jedenfalls so gemacht.
    Wie du das mit der .NET-CLR machst, findest du bestimmt einfach, indem du nach den beiden funktionsmanen googlest, die ich dort markiert habe.

    Man kann damit übrigens auch DirectX hooken und sich via SlimDX/SharpDX ein DX-Device erstellen (handle dafür muss man irgendwie bekommen) und dann fröhlich auf der DX-Oberfläche der Anwendung malen. Nützlich für z. B. ingame-Overlays.

    Wass passiert, wenn in der Host-Anwendung schon eine .NET-CLR läuft, weiß ich nicht. Vielleicht beissen die sich. Keine Ahnung.
    Von meinem iPhone gesendet
    1. Was ist injecten ?
    2. Und kann mir ijmd eine Erklärung geben, warum man in Try-Catches eine Exception fängt um sie danach zu werfen ?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    Und kann mir ijmd eine Erklärung geben, warum man in Try-Catches eine Exception fängt um sie danach zu werfen ?

    Rethrowing. Kann man nutzen, um bspw. Exceptions zu präzisieren in speziellen Anwendungsfällen.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: