AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Subclassing einer fremden Application, warum funzt das net ?
Thema durchsuchen
Ansicht
Themen-Optionen

Subclassing einer fremden Application, warum funzt das net ?

Ein Thema von stoxx · begonnen am 9. Nov 2003 · letzter Beitrag vom 5. Sep 2008
Antwort Antwort
Seite 6 von 7   « Erste     456 7      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#51

Re: Subclassing einer fremden Application, warum funzt das n

  Alt 13. Nov 2003, 02:07
[OFFTOPIC]
Leider bleibt dadurch Zugang zu deinem Wissen der Masse verwehrt. Obwohl du dir redliche Mühe gibst, es hier im Forum unterzubringen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#52

Re: Subclassing einer fremden Application, warum funzt das n

  Alt 13. Nov 2003, 04:09
@Luckie, dies ist im grunde richtig und in dieser Beziehung bin ich vielleicht ein bischen egoistisch. Es kostet aber wie du selber weist sehr viel Zeit in solchen Foren wie hier ausführliche Antworten zu geben. Nebenbei habe ich noch Geld zu verdienen und das als Freelancer, eine fucking Palm Anwendung mal endlich netzerkfähig zu bekommen, mich demzufolge mit INDY rumzuärgern, mein DEC fertig zu machen, bei der Primzahl Competition in den Borland Newsgroup weiter zu machen usw. usw. und meine Freudin samt zwei Katzen wollen auch noch Zeit.

Back zum Thema: ich hatte jetzt mal meine Datenbank nach meinen Sourcen zum Thema durchsucht. Leider finde ich den Mist nicht. Das heist also wenn ich die Zeit finde versuche ich obigen Draft mal fertig zu machen. Sehr viel fehlt ja nicht mehr, und ich dachte das vielleicht Nico, Luckie oder Assarbad noch ihren Beitrag leisten würden

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#53

Re: Subclassing einer fremden Application, warum funzt das n

  Alt 13. Nov 2003, 04:12
Übrigens, schau mal auf die Uhrzeit der Postings ! das sagt alles.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#54

Re: Subclassing einer fremden Application, warum funzt das n

  Alt 13. Nov 2003, 08:40
[Ganz Offtopic]

Ich habe jetzt einfach mal interessehalber den Thread gelesen, bin am Ende der Seite 3 auch auf die Idee gekommen Hagen zu fragen, ob er darüber mal nicht ein Buch screiben wollte und hab dann seine Antwort auf meinen Zuvorkommer gelesen

Ich muss da wirklich sagen: Schade.

@Hagen: Wo hast Du den ganzen Kram gelernt? Ich meine, ich fühle mich in Datenbankapplikationen wie der Fisch der im Wasser, aber diese tiefsten Assembler-Riffe in den Du rumschwimmst... da hakts bei mir leider komplett aus.

Hast Du uns denn wenigstens Buchtipps?

Grüßle,

Sebastian <-- der gerade merkt das er noch gewaltigen Nachholbedarf hat
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#55

Re: Subclassing einer fremden Application, warum funzt das n

  Alt 13. Nov 2003, 13:25
Zitat von negaH:
@Luckie, dies ist im grunde richtig und in dieser Beziehung bin ich vielleicht ein bischen egoistisch. Es kostet aber wie du selber weist sehr viel Zeit in solchen Foren wie hier ausführliche Antworten zu geben. Nebenbei habe ich noch Geld zu verdienen und das als Freelancer, eine fucking Palm Anwendung mal endlich netzerkfähig zu bekommen, mich demzufolge mit INDY rumzuärgern, mein DEC fertig zu machen, bei der Primzahl Competition in den Borland Newsgroup weiter zu machen usw. usw. und meine Freudin samt zwei Katzen wollen auch noch Zeit.

Back zum Thema: ich hatte jetzt mal meine Datenbank nach meinen Sourcen zum Thema durchsucht. Leider finde ich den Mist nicht. Das heist also wenn ich die Zeit finde versuche ich obigen Draft mal fertig zu machen. Sehr viel fehlt ja nicht mehr, und ich dachte das vielleicht Nico, Luckie oder Assarbad noch ihren Beitrag leisten würden

Gruß Hagen

Hallo Hagen,

Dein Standpunkt ist nachvollziehbar.

Mit dem Satz: " .. und ich dachte das vielleicht Nico, Luckie oder Assarbad noch ihren Beitrag leisten würden "

verrätst Du eigentlich ganz deutlich, dass Du Dir bewusst bist, dass der Otto Normal Programmierer mit Deiner Erklärung allein nix anfangen kann. Und ich glaub, Du weißt, dass ich Recht hab

Aber wer hat schon das Wissen eines Nicos oder eines Assarbads ? Ich glaube, wenn man nicht gerade seit seinem 10. Lebensjahr in Assembler programmiert, ist dieser Status sehr schwer zu erreichen.

Ich habs auch mal mit den inject DLL´s programmiert. Das hab ich sogar hinbekommen, da ein Poster ja mal Links dazu gepostet hat. Aber Pustekuchen, funktioniert nicht. Da steht man wie ein Schwein vorm Uhrwerk, weil man nicht mal weiß, was mit dem Quelltext der Inject DLL überhaupt gemacht wird, kann also ergo auch nichts dran ändern.

Bleibt mein letzte Hoffnung bei Assarbad oder Nico.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#56

Re: Subclassing einer fremden Application, warum funzt das n

  Alt 13. Nov 2003, 15:21
Zitat:
@Hagen: Wo hast Du den ganzen Kram gelernt? Ich meine, ich fühle mich in Datenbankapplikationen wie der Fisch der im Wasser, aber diese tiefsten Assembler-Riffe in den Du rumschwimmst... da hakts bei mir leider komplett aus.

Hast Du uns denn wenigstens Buchtipps?
Leider habe ich keine Buchtipps, weil ich eben schon seit Jahren keine Bücher übers OS usw lese.
Vor Jahren fand ich das Buch "Das MS-DOS Programmierhandbuch" von Günter Born im Markt&Technik Verlag wichtig. Ich liebe reine Nachschlagewerke die nur die API's erklären oder Formeln erklären. Ich habe auch noch so'n fetten Wälzer über VGA Karten Peogrammierung. Na und dann noch die vielen Bücher über die Programmierung und dem Selberbauen vom 8080 (im Osten U880) Rechnern. Mit dem Selberbauen und programmieren eines eigenen U880 Rechner habe ich übrigens angefangen (vor ca. 15 Jahren).

Die einzigsten Bücher die ich in letzter Zeit gekauft habe, und auch wirklich benötigte, sind meistens mathematischer Natur. "Arithmetics" von D.Knuth, "A Course in Computational Algebraic Number Theory" von Henri Cohen, "Einführung in die Kryptographie" von Johannes Buchman, "Applied Cryptography" von Menezes, van Oorschot, Vanstone, "Genetische Algortihmen und Evolutionsstrategien" von Schönberg,Heinzman,Feddersen naja usw. usw.
D.h. meistens benötige ich Informationen über Algorithmen oder bestimmten Theorien und Techniken.

Ich habe eigentlich nur Cobol, PL4 und ein bischen PASCAL in der Schule gelernt. Allerdings PASCAL und Assembler habe ich schon vor der Lehre beherrscht. Das meiste und allerwichtigste habe ich in einer Informatik AG gelernt. Zu Ostzeiten gab es "Pionierhäuser" und die GST "Gesellschaft für Sport und Technik". Das waren staatlich finanzierte Häuser in denen ehrenamtliche und interessierte Leute den Kindern was beibringen wollten, zwanglos, alles freiwillig und ohne politische Hintergedanken. Eben Privatinitiativen und kostenlos. Nun, ich war in verschiedenen solcher AG's, Holzschnitzen, kreative Tonarbeiten (Töpfern , Flugmodellbau, Elektonik. Die Elektonik AG entwickelte sich mit der Zeit zu einer Informatik AG. Also sofort nachdem die technischen Möglichkeiten gegeben waren bauten wir unsere ersten Computer selber. Diese wurden natürlich auch selber programmiert, sogar einen eigenen BASIC Interpreter musste man selber entwickeln. Bei solchen Bedingungen mit einem "Lehrer" der selber fit und enormen Spaß an der Sache hat, kann man sich sehr gut vorstellen wie effizient und leicht man lernen kann.

Dies war auch mein Vorteil verglichen zu heutigen Generationen. Damals waren Computer eine einfache Sache und sehr leicht verständlich. Die Jungen von heute haben es da ungleich schwerer. Alleine die bescheuerten, stänig neuen Werbe-Fachbegriffe, müssen bei Anfängern absolute Verwirrung erzeugen.

Zitat:
Ich habs auch mal mit den inject DLL´s programmiert. Das hab ich sogar hinbekommen, da ein Poster ja mal Links dazu gepostet hat. Aber Pustekuchen, funktioniert nicht. Da steht man wie ein Schwein vorm Uhrwerk, weil man nicht mal weiß, was mit dem Quelltext der Inject DLL überhaupt gemacht wird, kann also ergo auch nichts dran ändern.
Egal ob Inject DLL's oder Inject Threads, die logische Vorgehensweise bleibt die gleiche.
Ausgehend vom nötigen Source-Overhead sind Inject DLL's komplizierter. Dafür funktioniert der gleiche Code unter alle OS Versionen.

Wie gesagt, ich hoffe nächste Woche finde ich die Zeit, und kann obigen Draft besser ausarbeiten. Bis zum Sonntag habe ich erstmal einen Geschäftstermin und somit keine Zeit weiter.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#57

Re: Subclassing einer fremden Application, warum funzt das n

  Alt 13. Nov 2003, 16:00
Code:
Allerdings PASCAL und Assembler habe ich schon vor der Lehre beherrscht. Das meiste und allerwichtigste habe ich in einer Informatik AG gelernt. Zu Ostzeiten gab es "Pionierhäuser" und die GST "Gesellschaft für Sport und Technik". Das waren staatlich finanzierte Häuser in denen ehrenamtliche und interessierte Leute den Kindern was beibringen wollten, zwanglos, alles freiwillig und ohne politische Hintergedanken. Eben Privatinitiativen und kostenlos..

Dazu fällt mir eine Fernsehsendung ein, in der Finnland erwähnt wurde, als einer der obersten Plätze in der Pisa Studie.

"Seit den 60-er Jahren bereisten nämlich zahlreiche Kommissionen aus dem Norden die DDR, um deren Schulwesen zu studieren. Überzeugt davon, dass der pädagogischen Ansatz zu guten Ergebnissen führen kann, wurde die finnische Schule u.a. nach DDR-Vorbild aufgebaut."

http://www.mdr.de/umschau/909860.html

Code:
Wie gesagt, ich hoffe nächste Woche finde ich die Zeit, und kann obigen Draft besser ausarbeiten. Bis zum Sonntag habe ich erstmal einen Geschäftstermin und somit keine Zeit weiter.

Danke !





.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#58

Re: Subclassing einer fremden Application, warum funzt das n

  Alt 14. Nov 2003, 05:35
Keine Garantien meinerseits, bei mir funktionierts prächtig.

Gruß Hagen

Delphi-Quellcode:
type
  PHookData = ^THookData;
  THookData = packed record
    WndProc: array[0..255] of Byte;
    ThreadProc: array[0..255] of Byte;
    GetWindowLong: function(Wnd: hWnd; Index: Integer): Pointer; stdcall;
    SetWindowLong: function(Wnd: hWnd; Index: Integer; Value: Pointer): Pointer; stdcall;
    ExitThread: procedure(ExitCode: DWord); stdcall;
    CallWindowProc: function(PrevFunc: Pointer; Wnd: hWnd; Msg,wParam,lParam: Integer): Integer; stdcall;
    VirtualFree: function(Address: Pointer; Size,FreeType: DWord): Bool; stdcall;
    MessageBox: function(Wnd: hWnd; Text,Caption: PChar; Flag: DWord): Integer; stdcall;
    SaveWindowProc: Pointer;
    Wnd: hWnd;
    MsgText,MsgTitle: array[0..127] of Char;
  end;


function GetProcAddr(Module: hModule; Name: PChar): Pointer;
asm
        XOR ECX,ECX // except frame
        PUSH OFFSET @@6
        PUSH DWord Ptr FS:[ECX]
        MOV FS:[ECX],ESP
        PUSH EBP
        PUSH EBX
        MOV EBP,EDX
        AND EAX,not 3
        PUSH EDI
        MOV EDX,[EAX + 03Ch]
        PUSH ESI
        TEST EBP,EBP
        JZ @@5
        CMP Word Ptr [EAX + EDX],'EP'
        MOV EDX,[EAX + EDX + 078h]
        JNZ @@5
        ADD EDX,EAX
        TEST EBP,0FFFF0000h
        MOV EBX,EAX
        JZ @@3 // import by ordinal ??
        MOV EAX,[EDX + 018h]
        MOV ECX,[EDX + 020h]
        NOT EAX
@@1: INC EAX
        MOV ESI,EBP
        JZ @@4
        MOV EDI,[EBX + ECX]
        ADD ECX,4
        ADD EDI,EBX
@@2: CMPSB
        JNE @@1
        CMP Byte Ptr [ESI - 1],0
        JNE @@2
        ADD EAX,[EDX + 018h]
        MOV ECX,[EDX + 024h]
        ADD ECX,EBX
        MOVZX EBP,Word Ptr [ECX + EAX * 2]
        INC EBP
@@3: MOV ECX,[EDX + 01Ch]
        DEC EBP
        ADD ECX,EBX
        MOV EAX,[ECX + EBP * 4]
        ADD EAX,EBX
@@4: POP ESI
        POP EDI
        POP EBX
        POP EBP
        POP DWord Ptr FS:[0]
        POP ECX
        RET
@@5: XOR EAX,EAX
        JMP @@4
@@6: MOV EAX,[ESP + 00Ch] // except handler
        PUSH OFFSET @@5
        POP DWord Ptr [EAX + 0B8h]
        SUB EAX,EAX
end;

function MyWndProc(Memory: PHookData; Wnd: hWnd; Msg,wParam,lParam: Integer): Integer; stdcall; forward;

procedure WndProcDispatcher;
asm
     CALL @@1
@@1: POP EAX
     SUB EAX,5
     POP EDX
     PUSH EAX
     PUSH EDX
     JMP MyWndProc
end;

function MyWndProc(Memory: PHookData; Wnd: hWnd; Msg,wParam,lParam: Integer): Integer; stdcall;
const
  MemorySize = SizeOf(THookData);
begin
  if Msg = wm_Destroy then
  begin
    Result := Memory.CallWindowProc(Memory.SaveWindowProc, Wnd, Msg, wParam, lParam);
    asm
      MOV EAX,Memory

      POP EBX // Delphi push it
      POP EBP // Delphi stackframe
      POP EDX // Return address caller

      POP ECX // 5 paramters Memory,Wnd,Msg,wParam,lParam
      POP ECX
      POP ECX
      POP ECX
      POP ECX

      PUSH EAX // VirtualFree() params
      PUSH MemorySize
      PUSH 0
      PUSH EDX // VirtualFree() returns back to our caller
      JMP [EAX].THookData.VirtualFree
    end;
  end else
    if (Msg = wm_Close) or (Msg = wm_Quit) then
    begin
      Result := 0;
      Memory.MessageBox(0, Memory.MsgText, Memory.MsgTitle, 0);
    end else
      Result := Memory.CallWindowProc(Memory.SaveWindowProc, Wnd, Msg, wParam, lParam);
end;

function ThreadProc(Memory: PHookData): DWord; stdcall;
const
  MemorySize = SizeOf(THookData);
begin
  Memory.SaveWindowProc := Memory.GetWindowLong(Memory.Wnd, gwl_WndProc);
  if Memory.SaveWindowProc <> nil then // hier eventuell Param für ExitThread setzen
    Memory.SetWindowLong(Memory.Wnd, gwl_WndProc, Memory);
  Memory.ExitThread(0);
end;

procedure SubClass(Wnd: hWnd);
var
  CodeSize: Integer;
  Process: THandle;
  ProcessID: DWord;
  Thread: THandle;
  ThreadID: DWord;
  Memory: PHookData;
  DLL: hModule;
  Temp: THookData;
  Bytes: DWord;
begin
  if not IsWindow(Wnd) then Exit;
  GetWindowThreadProcessID(Wnd, @ProcessID);
  if ProcessID = 0 then Exit;

  Process := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_CREATE_THREAD, False, ProcessID);
  if Process <> 0 then
  begin
    Memory := VirtualAllocEx(Process, nil, SizeOf(THookData), MEM_COMMIT, PAGE_READWRITE);
    if Memory <> nil then
    begin
      CodeSize := PChar(@ThreadProc) - PChar(@WndProcDispatcher);
      Move(WndProcDispatcher, Temp.WndProc, CodeSize);
      CodeSize := PChar(@SubClass) - PChar(@ThreadProc);
      Move(ThreadProc, Temp.ThreadProc, CodeSize);

      DLL := GetModuleHandle('user32.dll');
      Temp.GetWindowLong := GetProcAddr(DLL, 'GetWindowLongA');
      Temp.SetWindowLong := GetProcAddr(DLL, 'SetWindowLongA');
      Temp.CallWindowProc := GetProcAddr(DLL, 'CallWindowProcA');
      Temp.MessageBox := GetProcAddr(DLL, 'MessageBoxA');
      DLL := GetModuleHandle('kernel32.dll');
      Temp.ExitThread := GetProcAddr(DLL, 'ExitThread');
      Temp.VirtualFree := GetProcAddr(DLL, 'VirtualFree');
      Temp.Wnd := Wnd;
      Temp.MsgText := 'Want close';
      Temp.MsgTitle := 'Test';

      if WriteProcessMemory(Process, Memory, @Temp, SizeOf(THookData), Bytes) then
      begin
        Thread := CreateRemoteThread(Process, nil, 0, @Memory.ThreadProc, Memory, 0, ThreadID);
        if Thread <> 0 then
        begin
          WaitForSingleObject(Thread, INFINITE);
     // hier eventuell ExitCode vom Thread auswerten
          MessageBox(Application.Handle, 'Hooked successfull', 'SubClass()', 0);
 
          CloseHandle(Thread);
        end;
      end else
      begin
        VirtualFreeEx(Process, Memory, SizeOf(THookData), 0);
      end;
    end;
    CloseHandle(Process);
  end;
end;

procedure TestSubClass;

  function MyEnum(Wnd: hWnd; Return: PInteger): Bool; stdcall;
  var
    ClassName: String;
    ProcessID: DWord;
  begin
    Result := True;
    SetLength(ClassName, MAX_PATH);
    SetLength(ClassName, GetClassname(Wnd, PChar(ClassName), Length(ClassName)));
    if ClassName = 'TConsoleMainFormthen
    begin
      GetWindowThreadProcessID(Wnd, @ProcessID);
      if GetCurrentProcessID <> ProcessID then
      begin
        Return^ := Wnd;
        Result := False;
      end;
    end;
  end;

var
  Wnd: Integer;
begin
  Wnd := 0;
  EnumWindows(@MyEnum, Integer(@Wnd));
  SubClass(Wnd);
end;
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#59

Re: Subclassing einer fremden Application, warum funzt das n

  Alt 14. Nov 2003, 13:47
wow .. hihi .. Danke !
sieht zumdindest so aus, als hätte ich das nie im Leben selber hinbekommen !
Und funktioniert. Was nun auch immer der Assembercode macht, es wird mir zumindest noch lange verborgen bleiben ...

Ist jetzt Unsubclass genauso kompliziert ?
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#60

Re: Subclassing einer fremden Application, warum funzt das n

  Alt 15. Nov 2003, 16:58
Hallo Hagen,

das mit dem Unsubclass klappt noch nicht so recht.
Da kommt eine heftige Fehlermeldung und das betreffende Programm rauscht gleich ganz ab.
ich hab die Adresse von memory in einer globalen Variablen m_memory gespeichert.
Ist das falsch ?
Kommt man auch ohne diese globale Variable aus ?
Also kann man die Adrese von memory auch nur mit Hilfe von hWnd des Fensters ermitteln ?

Hier mal die Anfänge des Codes .....

Code:
////////////////////////////////////////////////////////////////////////////////

function ThreadProcunsub(Memory: PHookData): DWord; stdcall;
const
  MemorySize = SizeOf(THookData);
begin
  if Memory.SaveWindowProc <> nil then
   Memory.SetWindowLong(memory.wnd, gwl_WndProc,Memory.saveWindowProc);
  Memory.ExitThread(0);
end;

//////////////////////////////////////////////////////////////////////////////////


procedure UnSubClass(Wnd : hWnd);
var
   ProcessID: DWord;
   Process: THandle;
   Thread: THandle;
   ThreadID: DWord;
   Memory: PHookData;
begin
  memory := m_memory;
  if not IsWindow(Wnd) then Exit;
  GetWindowThreadProcessID(Wnd, @ProcessID);
  if ProcessID = 0 then Exit;

  Process := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_CREATE_THREAD, False, ProcessID);

  Thread := CreateRemoteThread(Process, nil, 0, @Memory.ThreadProcunsub, Memory, 0, ThreadID);
        if Thread <> 0 then
        begin
          WaitForSingleObject(Thread, INFINITE);
     // hier eventuell ExitCode vom Thread auswerten
        //  MessageBox(Application.Handle, 'Hooked successfull', 'SubClass()', 0);

          CloseHandle(Thread);
        end;

end; // von Unsubclass
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 7   « Erste     456 7      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz