DLL "startet" auf anderen Computer nicht



  • Hey. Ich habe eine DLL in Visual Studio 2013 gemacht. In ihr eine WinForms. Es geht hier also um CLI.

    MainForm.cpp:

    #include "MainForm.h"
    using namespace Test;
        [STAThreadAttribute]
        int Main()
        {
            Application::EnableVisualStyles();
            Application::SetCompatibleTextRenderingDefault(false);
            Application::Run(gcnew MainForm());
        return 0;
        }
    

    main.cpp:

    #include "linker.h"
    #include <windows.h>
    BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){
        switch(fdwReason)
        {
            case DLL_PROCESS_ATTACH:
                DisableThreadLibraryCalls(hinstDLL);
                CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Main, NULL, 0, NULL);
    
                break;
        }
        return true;
    }
    

    MainForm.h ist dann die WinForm.
    Bei mir geht alles. Ich öffne einen Injector, injecte in Notepad z.b. und die Form öffnet sich. Auf anderen PC´s öffnet sich aber einfach garnichts.. Weder Fehler noch sonst irgendwas. Statisch linken kann ich CLI Dlls ja nicht.
    Was muss der Endverbraucher also installiert haben, oder im Ordner der DLL liegen haben um das ganze starten zu können? VS 2013 wohl nicht..
    Danke vielmals 🙂 Hab so lange dran gearbeitet und jetzt rausgefunden, dass andere es garnicht öffnen können 😞

    Danke 🙂
    Mfg. TGSlp

    EDIT:
    Habe mal Messageboxen eingefügt. Bei mir kommen sie, bei dem TestPC wird anscheinend DLLMain garnicht beachtet..:

    #include "linker.h"
    #include <windows.h>
    
    BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){
    
    	switch (fdwReason)
    	{
    	case DLL_PROCESS_ATTACH:
    		MessageBox(0, "Attached", "DLL Message", MB_OK | MB_ICONINFORMATION);
    		DisableThreadLibraryCalls(hinstDLL);
    		MessageBox(0, "Disabled ThreadLibraryCalls", "DLL Message", MB_OK | MB_ICONINFORMATION);
    		CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Main, NULL, 0, NULL);
    		MessageBox(0, "Created Main", "DLL Message", MB_OK | MB_ICONINFORMATION);
    		break;
    	}
    	return true;
    }
    


  • Wenn Deine Anwendung mit WinForms erstellt wurde, also auf dem CLR (Common Langauge Runtime) basiert, muss auf dem anderen Rechner natürlich das Microsoft .NET Framework (und zwar in der zu Deiner Anwendung passenden Version) installiert sein. Außerdem müssen, davon unabhängig, natürlich auch die Visual C++ Laufzeit-Bibliotheken (in der passenden Version) installiert sein.



  • DeathCubeUK schrieb:

    Wenn Deine Anwendung mit WinForms erstellt wurde, also auf dem CLR (Common Langauge Runtime) basiert, muss auf dem anderen Rechner natürlich das Microsoft .NET Framework (und zwar in der zu Deiner Anwendung passenden Version) installiert sein. Außerdem müssen, davon unabhängig, natürlich auch die Visual C++ Laufzeit-Bibliotheken (in der passenden Version) installiert sein.

    Hier, zum Beispiel, die benötigten Redistributables für Visual C++ 2013 und das .NET Framework 4.5:
    * http://www.microsoft.com/de-de/download/details.aspx?id=30653
    * http://www.microsoft.com/de-de/download/details.aspx?id=40784



  • Hey, danke schonmal 🙂
    Genau das habe ich auf dem Test PC schon installiert, ohne Erfolg.. Es öffnet sich nicht 😕



  • TGSlp schrieb:

    Hey, danke schonmal 🙂
    Genau das habe ich auf dem Test PC schon installiert, ohne Erfolg.. Es öffnet sich nicht 😕

    Was soll denn "es öffnet sich nicht" heißen?

    Startet das Programm erst gar nicht, weil irgendwelche Abhängigkeiten fehlen (sollte eine entsprechende Fehlermeldung produzieren) oder stürzt das Programm ab?

    In ersterem Fall, kann eventuell der Dependency Walker weiterhelfen. Im zweiten Fall wird es wohl Zeit den Debugger zu verwenden...



  • Also nochmal.. 😃

    Ich habe Visual Studio 2013. Habe eine CLI DLL mit WinForms. Wenn ich diese DLL z.b. in den Notepad injecte, sehe ich mein Fenster.

    Schicke ich die DLL jemanden ohne VS 2013, und er injectet das in Notepad, öffnet sich bei ihm garnichts trotz den installierten Sachen wie Net Framework etc. Die Messageboxen in DLL main zeigen sich einfach nicht, also wird auch das Formular nicht erstellt.



  • TGSlp schrieb:

    Also nochmal.. 😃

    Ich habe Visual Studio 2013. Habe eine CLI DLL mit WinForms. Wenn ich diese DLL z.b. in den Notepad injecte, sehe ich mein Fenster.

    Schicke ich die DLL jemanden ohne VS 2013, und er injectet das in Notepad, öffnet sich bei ihm garnichts trotz den installierten Sachen wie Net Framework etc. Die Messageboxen in DLL main zeigen sich einfach nicht, also wird auch das Formular nicht erstellt.

    Was genau meinst Du mit "Injecten" 😕

    Um aus einem Programm heraus Funktionen aus einer DLL aufzurufen, muss das Programm entweder per Import-Library gegen die DLL gelinkt worden sein oder das Programm lädt die DLL zur Laufzeit via** LoadLibrary() **Funktion.

    Wenn Du mit "Notepad" das normale Windows Notepad meinst, wie genau soll da Deine DLL geladen werden? Notepad ist sehr einfach gestrickt und besetzt, soweit ich weiß, keine Plugin-Schnittstelle um Deine DLL einzubinden...



  • DLL injection

    Hier ein Framework von MS:
    MS Detours



  • Aha... 💡

    DLL injection is a technique used for running code within the address space of another process by forcing it to load a dynamic-link library. DLL injection is often used by external programs to influence the behavior of another program in a way its authors did not anticipate or intend.

    Vllt erklärt TGSlp erst mal, was er damit überhaupt bezwecken möchte?

    So oder so, würde ich als aller ersten mal überprüfen, ob meine DLL überhaupt auf dem anderen System läuft, bevor ich mich an "DLL injection" versuchen würde.

    Schreib Dir doch ein einfaches Test-Programm, das nichts anderes tut, als Deine DLL auf normalem Wege zu laden und eine geeignete Funktion aufzurufen.

    Wenn das schon nicht funktioniert, weißt Du, dass da irgendetwas grundsätzlich nicht läuft. Und dann sollte es mit dem Test-Programm auch sehr viel einfacher zu Debuggen sein.

    Falls jedoch das Test-Programm einwandfrei läuft, dann weißt Du, dass da irgendwas bei der "DLL Injection" nicht so tut, wie Du es angedacht hast...


Anmelden zum Antworten