![]() |
Programm in einer dll
hallo,
ich hatte in den letzten Tagen einige Probleme mit einem Browser-Hijacker der eine dll auf mein System geschleust hat und hier (unabhängig von einem geöffneten Browser) immer mal wieder Werbung eingeblendet hat. Nach allem was ich von diesem Programm weiß wurde es über regsvr32 in meinem Windows registriert und lief seitdem 'unerkannt' im Hintergrund. Da ich derart ausführbare dll's ganze gerne einmal mit Delphi nachvollziehen möchte würde mich dazu einmal folgendes interessieren. Dll's selbst enthalten ja normalerweise nur Code der von einem Prozess/Thread geladen und ausgeführt wird. Wenn ich eine eigene Dll nun über 'regsvr32 /i /s programm.dll' im System registriere wird diese doch nicht automatisch ausführbar sondern stellt nur eine Bibliotek mit Methoden zur Verfügung. Hat Jemand vielleicht eine Idee wie man diese Dll als 'Anwendung' laufen läßt? |
Re: Programm in einer dll
Dazu kannst Du deine DLL so registrieren, das es auch als "Plugin" für den Windows Explorer läuft (wie andere Programm auch machen um z.B. Menüpunkte in das Kontextmenu des Windows Explorer zu bekommen). Und da der Windows Explorer immer läuft (Desktop ist ja auch 'ne Windows Explorer Instanz) läuft deine DLL immer mit.
Oder (bei neuen Windows-Versionen) eine COM+Anwendung erstellen und so konfigurieren das mindestens eine Instanz läuft. |
Re: Programm in einer dll
Zitat:
abwärtskompatibilität im vergleich zur COM anwendung erreicht. hast du dazu vielleicht ein beispiel oder ein stichwort wonach man suchen könnte? |
Re: Programm in einer dll
Einfach im Delphi-Demo-Verzeichnis ActiveX\ShellExt nachschauen.
|
Re: Programm in einer dll
oh danke für die hilfe,
meine suche mit google war bisher wenig erfolgreich, leider sind die demos von delphi dazu sehr umfangreich und schlecht kommentiert, ich hab gehofft ich finde irgendwo eine kleine "hello world" demo einer dll die man manuell auf den explorer registriert :( davon mal abgesehn scheint keine der demos zu funktionieren unter delphi 7 + winxp |
Re: Programm in einer dll
Zitat:
trotz allem hab ich den aufbau der dll nicht so ganz verstanden, ist es überhaupt möglich mit hilfe einer solchen dll einen timer mit windows zu starten der dann nach einer zeit x z.b. eine messagebox ausgibt? |
Re: Programm in einer dll
naja, eine variante wäre auch noch die dll über rundll32.exe zu starten. In deiner Dll kannst du dann einen Hook starten und danach kann sich die Hookinjezierende Dll die mit rundll32 ausgeführt wurde ja wieder beenden und der hook läuft weiter im hintergrund.
|
Re: Programm in einer dll
über die variante mit rundll32 hab ich auch schon nachgedacht,
allerdings denke ich das die dll als explorer plugin evtl die bessere lösung wäre, nur bin ich durch die beispiele aus den demos leicht verwirrt, da es hier vornehmlich darum geht ein kontextmenü hinzuzufügen das dann auf eingaben mit der entsprechenden methode reagiert grundsätzlich also genau das was eine programm bibliotek tun soll, darum kann ich auch nicht nachvollziehn ob die dll ein eigenleben, z.b. über einen timer ohne vorherige eingabe haben kann |
Re: Programm in einer dll
ich hab mich nun ne ganze weile durchs web gewühlt
und leider noch immer nichts brauchbares gefunden, hat niemand eine brauchbare idee? |
Re: Programm in einer dll
Die einfachste Methode ist eine DLL in den Shell- oder 'Kernel'-Prozeß zu injezieren.
Such mal im Forum nach CreateRemoteThread. |
Re: Programm in einer dll
hi, danke für den tip :)
hab dazu ein paar nette beispiele gefunden, mit denen ich sicher noch rumexperimentieren werden, das problem bei dieser methode ist aber das man dafür einen loader(.exe) braucht, als explorer plugin würde die dll automatisch bei jedem windowsstart geladen werden. nur weiß ich leider nicht wie ich der dll einen timer verpasse :( |
Re: Programm in einer dll
hier mal ein beispiel aus den delphi demos das ich noch
nicht so ganz nachvollziehen kann. als erstes würde mich einmal interessieren wie sich folgender wert berechnet Zitat:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\Shell Extensions\Approved ein eintrag angelegt, wozu genau bleibt mir ein rätsel woher weiß windows nun für welche anwendung die dll geschrieben wurde? woher bezieht die methode TCopyHook.CopyCallBack die Konstanten/Flags FO_COPY, F0_DELETE usw. und wie finde ich z.b. nun über die shell herraus ob sich ein internet explorer fenster geöffnet hat. ich hab zu all dem wirklich stundenlang im web gewühlt, aber informationen dazu sind kaum zu finden und ms bietet leider keinen delphi support :)
Delphi-Quellcode:
unit CopyHk;
interface uses Windows, ActiveX, ComObj, ShlObj; type TCopyHook = class(TComObject, ICopyHook) public function CopyCallback(Wnd: HWND; wFunc, wFlags: UINT; pszSrcFile: PAnsiChar; dwSrcAttribs: DWORD; pszDestFile: PAnsiChar; dwDestAttribs: DWORD): UINT; stdcall; end; const Class_CopyHook: TGUID = '{29F97553-FBD6-11D1-AFC1-00A024D1875C}'; implementation uses ComServ, ShellAPI, SysUtils, Registry; function TCopyHook.CopyCallBack(Wnd: HWND; wFunc, wFlags: UINT; pszSrcFile: PAnsiChar; dwSrcAttribs: DWORD; pszDestFile: PAnsiChar; dwDestAttribs: DWORD): UINT; // This is the method which is called by the shell for folder operations const ConfirmMessage = 'Are you sure you want to %s ''%s''?'; var Operation: string; begin case wFunc of FO_COPY: Operation := 'copy'; FO_DELETE: Operation := 'delete'; FO_MOVE: Operation := 'move'; FO_RENAME: Operation := 'rename'; else Operation := 'continue this operation on' end; // confirm operation Result := MessageBox(Wnd, PChar(Format(ConfirmMessage, [Operation, pszSrcFile])), 'Delphi CopyHook Shell Extension...' , MB_YESNOCANCEL); end; type TCopyHookFactory = class(TComObjectFactory) public procedure UpdateRegistry(Register: Boolean); override; end; procedure TCopyHookFactory.UpdateRegistry(Register: Boolean); var ClassID: string; begin if Register then begin inherited UpdateRegistry(Register); ClassID := GUIDToString(Class_CopyHook); CreateRegKey('Directory\shellex\CopyHookHandlers\DelphiCopyHook', '', ClassID); if (Win32Platform = VER_PLATFORM_WIN32_NT) then with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions', True); OpenKey('Approved', True); WriteString(ClassID, 'Delphi CopyHook Shell Extension Example'); finally Free; end; end else begin DeleteRegKey('Directory\shellex\CopyHookHandlers\DelphiCopyHook'); inherited UpdateRegistry(Register); end; end; initialization TCopyHookFactory.Create(ComServer, TCopyHook, Class_CopyHook, '', 'Delphi CopyHook Shell Extension Example', ciMultiInstance, tmApartment); end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz