Announcement

Collapse
No announcement yet.

DLL-Funktionsaufruf systemweit abfangen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    <i>*aushol'*...</i><p>
    Da ich schon desöfteren mit selbigen Problemen zu kämpfen hatte hier mal ein paar Hinweise:<p>
    "<i>registry</i>"<br>
    - Funktioniert nur ab Windows 2000 oder höher (daß es im praktischen Einsatz auch unter NT4 funktioniert ist nicht dokumentiert -- also geht es nicht =)<br>
    - Der Rechner muß neu gestartet werden (ist manchmal ein Problem, insbesondere auf production systems -- auch für ein Update der DLL)<p>
    "<i>hooks</i>"<br>
    - Probleme sind oben lange diskutiert worden<p>
    "<i>remote threads / WriteProcessMemory</i>"<br>
    - Feine Sache nur leider fehlt es auf Win95 und WinNT 4.0 an der entsprechenden API (kenne zwar eine Möglichkeit für NT4 aber 95 ist nicht mein Acker, sorry)<p>

    Schlußendlich ist es (IMHO) am besten eine sehr eigenständige DLL zu schreiben, die in dem/den Zielthread(s) arbeitet und falls notwenig mittels Interprozeßkommunikation (IPC) mit einer Kontroll/Steuer-Anwendung eine Verbindung aufzubauen.<br>
    Um möglichst unabhängig von der Windows-Version zu sein, empfiehlt sich die Injektion der DLL per Hook, der in der DLL nur implementiert wird, um in den Zielthread zu gelangen, aber die Nachrichten, etc des Thread nicht beeinflußt (also im Bezug auf den Hook nur weiterleitet).<p>

    Gruß Nico

    PS: Zu dem Buch "Windows-Programmierung für Experten", es bezieht sich auf Windows 98 und Windows 2000, die dort vorgestellten Methoden sind nicht auf allen Windows lauffähig, und dies ist durchaus verständlich, es ist keine Anleitung zum OS-Hacken, sondern stellt vordergründig (und das sehr anschaulich) die Arbeitweise von Windows (Win32-Subsystem) vor... Man _kann_ die Quelltexte (die übrigens unter (C)Copyright stehen, da auf CD) nach Delphi portieren, aber wie gesagt, über den Sinn läßt sich streiten

    Comment


    • #17
      Hallo,<p><i>*nerv*</i><p>danke Nico für die umfangreiche Antwort. Es geht hier nicht drum Windows zu hacken, sondern ich muss ledeglich eine Funktion systemweit austauschen. Leider hab ich - je tiefer ich in das Thema hineinschaue - keinen richtigen Punkt wo ich anpacken kann/soll.<br>
      <I>kenne zwar eine Möglichkeit für NT4</i><br>
      Könntest auf diese Möglichkeit etwas genauer eingehen. Wie bereits Andreas gesagt hat, diese Sachen gehören in den "Giftschrank", also bin ich für eine Hilfe auch auserhalb des Forums (Email) sehr intressiert. Desweiteren interessiert mich der C-Code

      Comment


      • #18
        Die Beispiele in dem Buch auf Windows NT 4.0 umzusetzen scheitert daran, daß man kein Handle auf einen Thread bekommt, wenn man den Prozeß nicht selbst erzeugt hat...

        Du bekommst heute Abend-Mail...

        Gruß Nic

        Comment


        • #19
          Hallo Nico,<p>
          hast Du mich vergessen ([email protected])

          Comment


          • #20
            Hallo,<p><i>"Das Leben könnte so einfach sein, aber...."</i><p>
            Nun sitze ich schon einige Tage vor dem Rechner, aber irgendwie komme ich nicht weiter. Deshalb muss ich nonmals nerven.<p>
            1. Kann mir den keiner das Beispiel aus dem Buch "Windows-Programmierung für Experten" mal zukommen lassen. Es würde mich wirklich sehr interessieren. Ich hab nur keine Lust, das Buch für das eine Mal was ich es brauche, zu kaufen.<br>
            2. Wie kann ich ermitteln ob irgendein x-beliebiges Programm auf eine Routine der DLL zugreift (mir ist nicht bekannt, dass eine Message o. ä. dabei versendet wird)?<br>
            3. Wie bekomme ein Handle auf einen Thread in die eine x-beliebige DLL geladen wurde?<p>
            Fragen über Fragen, wäre über eine Antwort dankbar...

            Comment


            • #21
              ??? Habe ich Dir nicht schon die OpenThrd.htm geschickt (spät aber dennoch rausgegangen) ???

              Gruß´Nic

              Comment


              • #22
                ok dann eben hier nochmal...

                <pre><tt>
                <font color="#000080"><i>// well known types and constants</i></font>
                <p>
                <b>const</b>
                ntdll = <font color="#0000FF">'ntdll.dll'</font>;
                <p>
                <b>type</b>
                NTSTATUS = Integer;
                <p>
                <font color="#000080"><i>{ NtDef.h (Windows 2ooo DDK, BUILD 0001) line 1027 }</i></font>
                <b>type</b>
                PUnicodeString = ^TUnicodeString;
                TUnicodeString = <b>packed record</b>
                Length : Word; <font color="#000080"><i>// USHORT</i></font>
                MaximumLength: Word; <font color="#000080"><i>// USHORT</i></font>
                Buffer : PWideChar; <font color="#000080"><i>// PWSTR </i></font>
                <b>end</b>;
                <p>
                <font color="#000080"><i>{ NtDef.h (Windows 2ooo DDK, BUILD 0001) line 1160 }</i></font>
                <b>const</b>
                OBJ_INHERIT = $00000002;
                OBJ_PERMANENT = $00000010;
                OBJ_EXCLUSIVE = $00000020;
                OBJ_CASE_INSENSITIVE = $00000040;
                OBJ_OPENIF = $00000080;
                OBJ_OPENLINK = $00000100;
                OBJ_KERNEL_HANDLE = $00000200;
                OBJ_VALID_ATTRIBUTES = $000003F2;
                <p>
                <font color="#000080"><i>{ NtDef.h (Windows 2ooo DDK, BUILD 0001) line 1173 }</i></font>
                <b>type</b>
                PObjectAttributes = ^TObjectAttributes;
                TObjectAttributes = <b>record</b>
                Length : Cardinal; <font color="#000080"><i>// ULONG</i></font>
                RootDirectory : THandle;
                ObjectName : PUnicodeString;
                Attributes : Cardinal; <font color="#000080"><i>// ULONG</i></font>
                SecurityDescriptor : PSecurityDescriptor;
                SecurityQualityOfService: PSecurityQualityOfService;
                <b>end</b>;
                <p>
                <font color="#000080"><i>{ NtDDK.h (Windows 2ooo DDK, BUILD 0132) line 4294 }</i></font>
                <b>type</b>
                PClientId = ^TClientId;
                TClientId = <b>record</b>
                UniqueProcess: THandle;
                UniqueThread : THandle;
                <b>end</b>;
                <p>
                <font color="#000080"><i>// just self defined</i></font>
                <p>
                <b>function</b> NtOpenThread(
                <b>out</b> ThreadHandle : THandle;
                DesiredAccess : Cardinal; <font color="#000080"><i>// ACCESS_MASK</i></font>
                <b>const</b> ObjectAttributes: TObjectAttributes;
                <b>const</b> ClientId : TClientId
                ): NTSTATUS; <b>stdcall</b>;
                <b>external</b> ntdll name <font color="#0000FF">'NtOpenThread'</font>;
                <p>
                <b>function</b> RtlNtStatusToDosError(Status: NTSTATUS): DWORD;
                <b>external</b> ntdll name <font color="#0000FF">'RtlNtStatusToDosError'</font>;
                <p>
                <font color="#000080"><i>// valid values for dwDesiredAccess</i></font>
                <p>
                <font color="#000080"><i>{ WinNt.h (Windows 2ooo DDK, BUILD 0087) line 3986 }</i></font>
                <b>const</b>
                THREAD_TERMINATE = $0001;
                THREAD_SUSPEND_RESUME = $0002;
                THREAD_GET_CONTEXT = $0008;
                THREAD_SET_CONTEXT = $0010;
                THREAD_SET_INFORMATION = $0020;
                THREAD_QUERY_INFORMATION = $0040;
                THREAD_SET_THREAD_TOKEN = $0080;
                THREAD_IMPERSONATE = $0100;
                THREAD_DIRECT_IMPERSONATION = $0200;
                THREAD_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED <b>or</b>
                SYNCHRONIZE <b>or</b>
                $03FF;</tt></pre>
                &#10

                Comment


                • #23
                  <pre><tt><p><font color="#000080"><i>// OpenThread is identical to the function in Windows 2ooo</i></font>
                  <p>
                  <font color="#000080"><i>{ for declaration see WinBase.h (Windows 2ooo DDK) line 2082 }</i></font>
                  <b>function</b> OpenThread(dwDesiredAccess: Cardinal; <font color="#000080"><i>// DWORD</i></font>
                  bInheritHandle : LongBool; <font color="#000080"><i>// BOOL</i></font>
                  dwThreadId : Cardinal <font color="#000080"><i>// DWORD</i></font>
                  ): THandle; <b>stdcall</b>;
                  <b>var</b>
                  ObjectAttributes: TObjectAttributes;
                  ClientId : TClientId;
                  Status : NTSTATUS;
                  <b>begin</b>
                  ObjectAttributes.Length := SizeOf(TObjectAttributes);
                  ObjectAttributes.RootDirectory := 0;
                  ObjectAttributes.ObjectName := <b>nil</b>;
                  <b>if</b> bInheritHandle <b>then</b>
                  ObjectAttributes.Attributes := OBJ_INHERIT
                  <b>else</b>
                  ObjectAttributes.Attributes := 0;
                  ObjectAttributes.SecurityDescriptor := <b>nil</b>;
                  ObjectAttributes.SecurityQualityOfService := <b>nil</b>;
                  ClientId.UniqueProcess := 0;
                  ClientId.UniqueThread := dwThreadId;
                  Status := NtOpenThread(Result, dwDesiredAccess, ObjectAttributes, ClientId);
                  <b>if</b> Status &lt; 0 <b>then</b>
                  <b>begin</b>
                  SetLastError(RtlNtStatusToDosError(Status));
                  Result := 0;
                  <b>end</b>;
                  <b>end</b>;
                  <p>
                  <font color="#000080"><i>// sample for calling OpenThread (terminates itself)</i></font>
                  <p>
                  <b>procedure</b> TForm1.Button1Click(Sender: TObject);
                  <b>var</b>
                  dwThreadId: Cardinal;
                  hThread : THandle;
                  <b>begin</b>
                  dwThreadId := GetWindowThreadProcessId(Handle, <b>nil</b>);
                  <b>if</b> dwThreadId &lt;&gt; 0 <b>then</b>
                  <b>begin</b>
                  hThread := OpenThread(THREAD_TERMINATE, False, dwThreadId);
                  <b>if</b> hThread &lt;&gt; 0 <b>then</b>
                  <b>begin</b>
                  TerminateThread(hThread, Cardinal(-1));
                  CloseHandle(hThread);
                  <b>end</b> <b>else</b>
                  ShowMessage(SysErrorMessage(GetLastError));
                  <b>end</b>;
                  <b>end</b>;</tt></pre>

                  Gruß Nico

                  PS: dann haben's auch die andern,..

                  Comment

                  Working...
                  X