AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Einen prozess in anderen Desktop befördern ohne switch!
Thema durchsuchen
Ansicht
Themen-Optionen

Einen prozess in anderen Desktop befördern ohne switch!

Ein Thema von Neotracer64 · begonnen am 16. Jan 2006 · letzter Beitrag vom 13. Jun 2006
Antwort Antwort
Seite 1 von 3  1 23      
Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#1

Einen prozess in anderen Desktop befördern ohne switch!

  Alt 16. Jan 2006, 21:33
Ich möchte eine andere Anwendung starten, aber in einem anderen Desktop ohne selbst dahinzuswitchen!
Alle Beispiele, die ich gefunden habe, können nur das eigene Programm auf einen neuen Desktop befördern.

Also habe ich versucht Code in diesen Prozess zu injezieren und darin habe ich folgendes getan:

Delphi-Quellcode:
Desktop:= CreateDesktop('Neu', nil, nil, DF_ALLOWOTHERACCOUNTHOOK, GENERIC_ALL, nil);
SetThreadDesktop(Desktop);
Jedoch startet sich das Programm normal im Standard-Desktop. (Ja die injektion war erfolgreich, getestet mit einer Messagebox)

Dann habe ich etwas anderes versucht. Ich habe mir überlegt, dass ein Programm, dass schon im anderen Desktop läuft und selbst ein anderen Prozess startet, dass dieser dann auch auf dem neuen Desktop startet.... Fehlanzeige

Mir gehen so langsam die Ideen aus. Habt ihr ne Idee? Oder ist es zwingend notwendig das programm zu patchen?
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Einen prozess in anderen Desktop befördern ohne switch!

  Alt 17. Jan 2006, 07:35
schau dir mal in der Delphi-hilfe TScreen und vor allem TScreen.Monitors an.
Könnte sein, dass dies dir weiterhilft.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#3

Re: Einen prozess in anderen Desktop befördern ohne switch!

  Alt 17. Jan 2006, 09:50
Ein Thread kann den Desktop mittels SetThreadDesktop nur wechseln, wenn er keine Referenzen auf seinen aktuellen Desktop hält (üblicherweise Fenster-Handle).
Insofern dürfte es schwierig werden Anwendungen auf einen anderen Desktop zu 'verschieben'.

Zitat von MSDN:
The SetThreadDesktop function will fail if the calling thread has any windows or hooks on its current desktop (unless the hDesktop parameter is a handle to the current desktop).
  Mit Zitat antworten Zitat
Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#4

Re: Einen prozess in anderen Desktop befördern ohne switch!

  Alt 17. Jan 2006, 15:03
thx 4 answer.

Ergo heisst das, ich muss den SetThreadDesktop-Aufruf in die Executable patchen, bevor die ganzen Referenzen entstehen, nicht wahr?
Ich glaube ich hänge einfach eine Sektion ran, jumpe am Anfang hin,,tätige dort die notwendigen Api-Aufrufe und springe dann wieder zurück.
Ich werde verlauten lassen ob es funktioniert hat.
  Mit Zitat antworten Zitat
Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#5

Re: Einen prozess in anderen Desktop befördern ohne switch!

  Alt 17. Jan 2006, 17:30
Patchen hat geklappt.
Ich hab jetzt nicht extra eine Section rangehängt, da noch genug platz in der code-Section war.

Hier der ASM-Code den ich direkt mit Ollydbg reingeschrieben habe.
Am OEP der Executable hab ich einen Jump auf 0140B8D0 gemacht. Und dort erstmal die Register gesichert.
Der Code von 0140B919 bis 0140B91C ist das, was ich am OEP überschrieben habe.
Ich gebe zu, dass ich etwas umstänlich war und 2x GetModuleHandle aufgreufen habe, aber ich habe es halt on-the-fly implementiert.

Wenn ihr es bei einem programm nachmachen wollt, müsst ihr natürlich die Adressen fixen
Delphi-Quellcode:
0140B8D0 > \60 PUSHAD
0140B8D1 . 9C PUSHFD
0140B8D2 . 68 25B94001 PUSH _patch.0140B925 ; /pModule = "user32.dll"
0140B8D7 . FF15 18C04001 CALL DWORD PTR DS:[<&KERNEL32.GetModuleHandleA>] ; \GetModuleHandleA
0140B8DD . 68 30B94001 PUSH _patch.0140B930 ; /ProcNameOrOrdinal = "CreateDesktopA"
0140B8E2 . 50 PUSH EAX ; |hModule
0140B8E3 . FF15 48C04001 CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; \GetProcAddress
0140B8E9 . 6A 00 PUSH 0
0140B8EB . 68 00000010 PUSH 10000000
0140B8F0 . 6A 01 PUSH 1
0140B8F2 . 6A 00 PUSH 0
0140B8F4 . 6A 00 PUSH 0
0140B8F6 . 68 F03F5103 PUSH _patch.03513FF0
0140B8FB . FFD0 CALL EAX
0140B8FD . 50 PUSH EAX
0140B8FE . 68 25B94001 PUSH _patch.0140B925 ; /pModule = "user32.dll"
0140B903 . FF15 18C04001 CALL DWORD PTR DS:[<&KERNEL32.GetModuleHandleA>] ; \GetModuleHandleA
0140B909 . 68 3FB94001 PUSH _patch.0140B93F ; /ProcNameOrOrdinal = "SetThreadDesktop"
0140B90E . 50 PUSH EAX ; |hModule
0140B90F . FF15 48C04001 CALL DWORD PTR DS:[<&KERNEL32.GetProcAddress>] ; \GetProcAddress
0140B915 . FFD0 CALL EAX
0140B917 . 9D POPFD
0140B918 . 61 POPAD
0140B919 . 55 PUSH EBP
0140B91A . 8BEC MOV EBP,ESP
0140B91C . 6A FF PUSH -1
0140B91E .^ E9 F37EFFFF JMP _patch.01403816
0140B923 00 DB 00
0140B924 00 DB 00
0140B925 . 75 73 65 72 33 32>ASCII "user32.dll",0 ; user32.dll
0140B930 . 43 72 65 61 74 65>ASCII "CreateDesktopA",0 ; CreateDesktopA
0140B93F . 53 65 74 54 68 72>ASCII "SetThreadDesktop"
0140B94F . 00 ASCII 0
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Einen prozess in anderen Desktop befördern ohne switch!

  Alt 17. Jan 2006, 18:59
Und wozu ist das jetzt gut? Wozu braucht man so was?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#7

Re: Einen prozess in anderen Desktop befördern ohne switch!

  Alt 17. Jan 2006, 19:05
Ich frage mich ohnehin, warum er den Zieldesktop nicht 'einfach' in die TStartupInfo bei CreateProcess schreibt...
(bzw GetStartupInfo() verwendet um die Struktur zu initialisieren)
  Mit Zitat antworten Zitat
Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#8

Re: Einen prozess in anderen Desktop befördern ohne switch!

  Alt 17. Jan 2006, 19:17
Was ist wenn die Ziel-Executable GetStartUpInfo nicht callt?
Ich hab keinen Einfluss (also closed-source) auf die Programme, die ich auf dem anderen Desktop starten will und deswegen dachte ich jetz Patchen sei die einzige Möglichkeit.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#9

Re: Einen prozess in anderen Desktop befördern ohne switch!

  Alt 17. Jan 2006, 20:09
Zitat von Neotracer64:
Ich hab keinen Einfluss (also closed-source) auf die Programme, die ich auf dem anderen Desktop starten will und deswegen dachte ich jetz Patchen sei die einzige Möglichkeit.
Ich dachte du startest die Programme immer selbst... dann kannst du bei CreateProcess auch angeben, in welchem Desktop das Programm ausgeführt werden soll.
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

Re: Einen prozess in anderen Desktop befördern ohne switch!

  Alt 17. Jan 2006, 20:48
Wobei ich aber beim patchen von fremder Software vorsichtig wäre... Wenn dus nur für dich nutzt, dann wirds da vermutlich nich viel Probs geben. Aber letztendlich könnte es vom rein rechtlichen Standpunkt her sicher problematisch sein, oder täusch ich mich da (nur mal der Neugierde halber. )?

mfg, mh166
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 18:13 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