Starten einer Anwendung abfangen in VB6???

Diskutiere Starten einer Anwendung abfangen in VB6??? im Developer Network Forum im Bereich Hardware & Software Forum; Hi Das ganze fing so an. Nun bin ich dabei mir einen Programm zu schreiben. Stoße da wohl aber an die Grenzen von VB6. Wie ich Prozesse...
  • Starten einer Anwendung abfangen in VB6??? Beitrag #1
N

Neptuns

Bekanntes Mitglied
Dabei seit
16.09.2003
Beiträge
999
Reaktionspunkte
0
Ort
Beteigeuze Fünf
Hi
Das ganze fing so an. Nun bin ich dabei mir einen Programm zu schreiben. Stoße da wohl aber an die Grenzen von VB6.
Wie ich Prozesse aufliste und erkenne weiß ich. Das Problem an der ganzen Sache ist das ich das Starten einer Anwendung mit meinem Programm abfangen will BEVOR es überhaupt gestartet wird. (Na das hört sich ma geil an ;)
Beispiel : User klickt im Explorer auf z.b Notepad.exe
Nun erscheint ein Fenster ob der User das Starten der Notepad.exe erlauben will. Klickt er "JA" wird die Anwendung geöffnet. Klickt er auf "NEIN" wird die Anwendung gar nicht erst gestartet.
Nun such ich ne Funktion die den Start einer Anwendung mitbekommt/abfängt. D.h Sie muß also zwischen dem Klick auf eine .exe und dem Starten der Anwendung liegen.

a) Ist sowas mit VB6 möglich? Wenn ja bin ich für jede Hilfe dankbar.
b) Komm ich mit VB.NET weiter? (Dann müßt ich mir wirklich mal überlegen umzusteigen) oder ist das eher was für C oder C++
c) Kennt jemand eine Komponente oder Source?

Danke im Vorraus
 
  • Starten einer Anwendung abfangen in VB6??? Beitrag #2
peterfido

peterfido

Bekanntes Mitglied
Dabei seit
16.02.2000
Beiträge
1.785
Reaktionspunkte
0
Ort
Berlin
Wenn das nur für Dich ist, dann nenne doch die Notepad.exe um in Proggie.exe und Programmiere ein Tool, welches dann nach Deinen Kriterien Notepad.exe (also Proggie.exe) startet. Ich wüßte sonst nicht, wie man das starten einer Anwendung sonst noch verhindern kann. evtl noch die Rechte des Benutzers für das Notepad.exe sperren, und es unter runas starten...
 
  • Starten einer Anwendung abfangen in VB6??? Beitrag #3
Chrisu

Chrisu

Bekanntes Mitglied
Dabei seit
30.11.1999
Beiträge
1.364
Reaktionspunkte
0
Ort
EnterpriZe Elite
naja ich denk auch dass es nur möglich ist, den Start einer Anwendung festzustellen, wenn der entsprechende Prozess schon in der Liste der laufenden Prozesse sichtbar ist - spätestens dann kann man eine Anwendung unterbinden, vorher weiß ich nit ...
 
  • Starten einer Anwendung abfangen in VB6??? Beitrag #4
N

Neptuns

Bekanntes Mitglied
Dabei seit
16.09.2003
Beiträge
999
Reaktionspunkte
0
Ort
Beteigeuze Fünf
Dank euch beiden.

naja ich denk auch dass es nur möglich ist, den Start einer Anwendung festzustellen, wenn der entsprechende Prozess schon in der Liste der laufenden Prozesse sichtbar ist - spätestens dann kann man eine Anwendung unterbinden, vorher weiß ich nit ...
... hehe so geht´s mir auch

Es muß aber gehen, wenn man sich z.b die neue Kerio firewall anschaut. Dort ist genau diese Funktion beinhaltet. Aber ich denke das sitzt sehr tief im OS. Und da mit VB6 dranzukommen wird glaub ich schwer bis unmöglich??? Aber vielleicht weiß ja jemand noch was drüber, wäre dankbar.

Edit : Wenn ich die Rechte auf z.b Notepad.exe temporär verändere und den start nicht erlaube, muß das OS doch wissen das sie das Programm nicht starten soll. Genau dort kann man event. auch eingreifen. aber hab keine Vorstellung ob sowas funktionieren könnte.
 
  • Starten einer Anwendung abfangen in VB6??? Beitrag #5
noeppel

noeppel

Bekanntes Mitglied
Dabei seit
23.11.2001
Beiträge
257
Reaktionspunkte
0
Ort
xlatb repnz cmpsd
Hallo!

Die anzuwendende Technik nennt sich API-Hooking. Das abfangen von anderen Prozessen ist somit extrem aufwändig und es sind auf jedenfall tiefe Assemblerkenntnisse notwendig (es sei denn du klaust aus anderen Quelltexten für das hooken). Funktionieren tut das auf API ebene, indem du jeden einzelnen Prozess infiltrierst und deinen Fremdcode in dem Prozess zur Ausführung bringst. Dadurch kannst du die Sprungaddressen für Methodenaufrufe umbiegen und Parameter durchschleifen. Diese musst du dann an einen anderen Prozess schicken und auf das Ergebnis von dem warten. Das heißt im Klartext du musst verdammt viel Ahnung haben und mit VB kannst du allerhöchstens die host Anwendung schreiben, nicht aber die zu injizierenden Code-Fragmente. Übrigens musst du wenn du das durchziehen willst für alle Betriebssysteme unterschiedliche Codepfade einbauen weil die Technik auf der Ebene nicht universell ist. Eine weitere Möglichkeit ist, dass du (meines Wissens nach nur in NT Systemen) als Gerätetreiber Zugriff auf Betriebssystemfunktionen hast, die dich benachrichtigen wenn ein neuer Prozess gestartet wird. Aber das wirklich frühzeitige und 313373 abfangen eines Versuchs etwas auszuführen oder sonst irgendwie auch nur irgendwas zu machen ist der API-Hook. API-Hooking "engines" gibt es in unterschiedlichen Varianten schon zum runterladen.

In der c't war mal ein Beispiel zu dem Thema (nennt sich Sandbox). Die haben dann eine Oberfläche in Delphi geschrieben und eine frei verfügbare Api-hook-dll mit der du im Quelltext auf einfache und generische Art und Weise die zu hookenden Funktionen angeben kannst benutzt. Das wäre mir aber zu langweilig irgendetwas von jemand anderem zu übernehmen. Der hook kann nämlich an verschiedenen Stellen ansetzen z.B. dem nicht thread-sicheren umändern des Codes in anderen Prozessen oder sogar des Mappings des Kernels. Weitere Techniken sind z.B. die Modifikation des Import Address Table (dafür musst du dich auf jedenfall gut mit dem PE-Format auskennen), oder wenn du einen Prozess von anfang an suspended infiltrierst kannst du auch die export RVA's überschreiben.

P.S.: Mir fällt gerade auf, dass dann eine Firewall oder ein Virenscanner absolut gegen das Urheberrecht verstößt, weil du dann ja auf deinem Rechner den Programmcode eines u.U. geschützten Programms während der Ausführung abänderst um so Viren oder sonstiges gefährliches Zeug von deinem Rechner fernzuhalten. In einem anderen Thread habe ich gerade gelesen, dass nocd-cracks deswegen verboten sind.
 
  • Starten einer Anwendung abfangen in VB6??? Beitrag #6
S

Svenche

Bekanntes Mitglied
Dabei seit
30.04.1999
Beiträge
471
Reaktionspunkte
0
Ort
Erfurt, Deutschland
Vielleicht stelle ich mir das jetzt zu einfach vor. Aber ich kann doch in jedem Programm auf die Windows-Botschafts-Schlange zugreifen? Und kann mir dabei jede Botschaft ansehen, oder?

Wenn der Explorer eine .exe starten will, muß der doch an die Shell eine Botschaft schicken. Kann man diese Botschaft nicht mitlesen und abfangen, in dem man die Botschaft selber "behandelt", sprich killt?

Eine rein theoretische Überlegung, wollte ich nochmal erwähnen.
 
  • Starten einer Anwendung abfangen in VB6??? Beitrag #7
N

Neptuns

Bekanntes Mitglied
Dabei seit
16.09.2003
Beiträge
999
Reaktionspunkte
0
Ort
Beteigeuze Fünf
@ Noeppel : Vielen Dank für deine Tips bzw. Erklärung. Bin auch schon auf die Api Hooks gestoßen. Hab mir auch schon gedacht das das mit reinem VB6 nichts wird. Tja dann werd ich mich wohl mal damit beschäftigen. (Das kann dauern ;) )

Werd mich dann nochmal melden, wenn ich was fertig hab.
Vielleicht kennt jemand Links zu Source?

Edit Hat jemand vielleicht die c`t 7/97 und könnte mir den Artikel "Delphi: Fremde Prorgamme starten und überwachen" zukommen lassen. Das wäre echt super. :got:
 
Zuletzt bearbeitet:
  • Starten einer Anwendung abfangen in VB6??? Beitrag #8
noeppel

noeppel

Bekanntes Mitglied
Dabei seit
23.11.2001
Beiträge
257
Reaktionspunkte
0
Ort
xlatb repnz cmpsd
Original geschrieben von Svenche
Wenn der Explorer eine .exe starten will, muß der doch an die Shell eine Botschaft schicken.
Ja, du kannst auf die Botschaften zugreifen. Das reicht aber nicht um ein Ausführen eines Programmes zu verhindern weil das nicht über Messages an die Shell funktioniert. Um das zu überwachen musst du glaube ich gleich 6 api hooks installieren. z.B. WinExec CreateProcessA und W und weitere Derivate ... LoadModule sowie shell_execute und da war noch was. Wenn z.B. ein Virus gar kein Windows Fenster erstellt, dann empfängt er auch keine Messages, er kann direkt über CreateProcess einen Prozess starten. Deswegen musst du die RVA von dieser Funktion auf eine Funktion schreiben die du im fremden Prozessraum hinterlegt hast und erst nach Prüfung zur korrekten Adresse springen.

Ach ja: normalerweise ist explorer.exe die shell selber.

P.S.: In der Assembler-Szene gibt es einige Leute die sich damit beschäftigt haben. Den sourcecode für die c't sandbox müsste ich noch irgendwo haben. Such mal nach yoda und ELiCZ.
 
  • Starten einer Anwendung abfangen in VB6??? Beitrag #9
N

NixRealFromm

Bekanntes Mitglied
Dabei seit
24.10.2001
Beiträge
424
Reaktionspunkte
0
Ort
hmpf!!! Nordpol
hi,
was ist, wenn das programm einfach den prozess terminiert, sobald er in der prozessliste auftaucht. wenn das programm schnell genug ist, wird erst gar nicht ganz gestartet.
das problem ist halt, das wahrscheinlich schon etwas vom programm gestartet wurde.
jetzt fragst du, ob er das programm starten soll. wenn ja, öffne das programm nochmal.
das wäre vielleicht ne low budget-lösung :D

:gluck:
 
  • Starten einer Anwendung abfangen in VB6??? Beitrag #10
noeppel

noeppel

Bekanntes Mitglied
Dabei seit
23.11.2001
Beiträge
257
Reaktionspunkte
0
Ort
xlatb repnz cmpsd
Das würde auch gehen, diese Lösung wäre für meine Ansprüche jedoch unbefriedigend (aber darum gehts ja jetzt nicht). Ein Programm das mit einem Timer guckt ob sich etwas jetzt geändert hat finde ich dämlich und außerdem wird dadurch mehr Prozesszeit an sich gerissen (ist zwar nicht so viel aber immerhin). Als Spielerei und für den privaten Einsatz reicht es jedoch höchstwahrscheinlich. Ich würde außerdem nicht jedes Programm gewaltsam beenden, nachdem es schon ein paar Millisekunden lief und eventuell gerade Dateioperationen oder Registrymodifikationen tätigt. Das was du machen kannst ist über deinen (ich nehme an toolhelp-Snapshot) die Threads von dem Prozess einfrieren (die Anwendung schläft dann quasi) und du dann fragst und bei Quittierung mit nein den Prozess terminierst. Du kannst nur nicht wirklich sicher gehen, dass du wirklich alle Threads anhältst (mit API: SuspendThread) oder alle wieder problemlos aufweckst (mit API: ResumeThread). Außerdem sollte man einen Prozess nur in extremen Ausnahmen gewaltsam beenden da geladene DLLs nicht benachrichtigt werden. Hierzu ein Zitat von Microsoft:
The TerminateProcess function is used to unconditionally cause a process to exit. Use it only in extreme circumstances. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess. TerminateProcess causes all threads within a process to terminate, and causes a process to exit, but DLLs attached to the process are not notified that the process is terminating.
Ich würde mir das Sandbox Beispiel aus der c't mal angucken, die apihook dll kannst du höchstwahrscheinlich einbinden. Ansonsten guck dich in der Assembler-Szene um. Solche Api-Hooks schreiben viele Leute nebenbei zum Training (ebenso ich, meinen kriegst du aber nicht :p).
 
  • Starten einer Anwendung abfangen in VB6??? Beitrag #11
N

NixRealFromm

Bekanntes Mitglied
Dabei seit
24.10.2001
Beiträge
424
Reaktionspunkte
0
Ort
hmpf!!! Nordpol
ich hab ja auch gesagt, dass es eine "low budget" lösung ist :st:
 
Thema:

Starten einer Anwendung abfangen in VB6???

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.181
Beiträge
1.579.175
Mitglieder
55.880
Neuestes Mitglied
Hahn
Oben