Announcement

Collapse
No announcement yet.

Importhooking - PUSH-Anweisung

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

  • Importhooking - PUSH-Anweisung

    Hallo,<p>
    die Frage bezieht sich auf die verlohrengegangene Diskussion "Prüfen ob ein Modul eine Funktion importiert". Am Ende dieser Diskussion hat mir Hagen noch einge Tipps u.a. zur PUSH-Anweisung mit auf den Weg gegeben. Ich hab da noch einige Fragen, die noch nicht beantwortet sind...
    <p>
    <b>@Hagen:</b> Zuersteinmal Danke für die umfrangreichen Informationen zu dem Thema. Hat mich ein Stück weitergebracht und hat mir neue Wege eröffnet. Danke. Trotzdem habe ich mich für den Weg mit der PUSH-Anweisung entschieden. Zwar ist laut Debugger der Quellcode fehlerfrei, trotzdem tut er nicht das, was er machen soll. Ich denke mal, ich hab in den wenige C-Zeilen was übersehen.
    <P>
    Hier nocheinmal der C-Quelltext (bei dem ich hänge):
    <pre>
    const BYTE cPushCode = 0x86;
    PROC pfnCurrent = NULL;
    BOOL fFound = FALSE;
    PROC ppfn = NULL;
    <p>
    ...
    PBYTE pbInFunc = (PBYTE) *ppfn
    if (pbInFunc[0] == cPushCode) {
    ppfn = (PROC*) &pbInFunc[1];
    fFound = (*ppfn == pfnCurrent);
    }
    </pre>
    pfnCurrent und ppfn werden natürlich vorher über GetModuleHandle mit den entsprechenden Werten gefüllt.
    <p>
    Ich hoffe, es kann mir diesen C-Code jemanden nach Delphi übersetzten. (ich vergleich den dann mit meiner Übersetzung und schau wo der Fehler liegt) Wer echt super, wenn mir da jemand weiterhelfen kann (ist wirklich nicht leicht)...

  • #2
    schnell mal hingetippt...

    <pre><p><b>type</b>
    PROC = <b>function</b>(): Integer; <b>stdcall</b>;
    <b>const</b>
    PushCode: Byte = $86;
    <b>var</b>
    Current: PROC;
    Found: Boolean;
    fn: PROC;
    InFunc: PByteArray;
    <b>begin</b>
    Current := <b>nil</b>;
    Found := False;
    fn := <b>nil</b>;
    <i>// [...]</i>
    <p>
    InFunc := PByteArray(fn);
    <b>if</b> (InFunc[0] = PushCode) <b>then</b>
    <b>begin</b>
    fn := PROC(@InFunc[1]);
    Found := (fn = Current);
    <b>end</b>;
    <b>end</b>;<p></pre>

    - nic

    Comment


    • #3
      Hallo Nico,<p>
      funktioniert so nicht.
      1. PROC ist ein POINTER (Rückgabwert von GetProcAddress)
      2. Damit wird ist Zeile <I>fn := PROC(@InFunc[1]);</i> ein Fehler angezeigt.
      <p>
      Ich kann es mir nicht erklären, aber wenn ich von GetProcAddress (pfnCurrent) z.B.: den Zeiger $BFF638S9 erhalte, und für ppfn den Zeiger $BFF63B03 (das ist die gesuchte Funktion - in 2000 und XP wären die Werte gleich) über pImageImport erhalte und das ganze in die PUSH-Anweisung bearbeite erhalte ich als pbInFunc[1]den selben Zeiger wieder der in ppfn gespeichert war? Warum, dann ist ja die PUSH-Anweisung unnötig????

      Comment


      • #4
        Ja, PROC ist ein Funktionszeiger, man kann ihn der Einfacheit halber auch als Pointer deklarieren (erspart das Casting des Todes)<br>
        ...mit Gewalt sieht sähe es dann so aus =)

        Pointer(fn) := @InFunc[1];<br>
        Found := (Pointer(fn) = Pointer(Current));

        Ich habe einfach versucht obige Zeilen zu übersetzen.<br>
        Was Du dort machen willst, habe ich noch nicht drüber nachgedacht =)

        - nico

        ps: bisserl mehr Info wär' nicht schlecht (mail geht auch

        Comment


        • #5
          Hallo Nico,<p>
          eMail ist unterwegs..

          Comment

          Working...
          X