AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Prozesse oder Anwendungen ermitteln, die eine Datei benutzen
Thema durchsuchen
Ansicht
Themen-Optionen

Prozesse oder Anwendungen ermitteln, die eine Datei benutzen

Ein Thema von PainInYourBrain · begonnen am 26. Okt 2006 · letzter Beitrag vom 16. Jan 2008
Antwort Antwort
Seite 2 von 4     12 34      
daPimP

Registriert seit: 27. Okt 2006
25 Beiträge
 
#11

Re: Prozesse oder Anwendungen ermitteln, die eine Datei benu

  Alt 30. Okt 2006, 15:40
Habe mir mal die Funktionen von Unlocker
und auch von WhoLockme angeschaut, da beide Programme ähnlich arbeiten. (Links dazu oben)

Habe mal die Funktionen aufgelistet, die beide gemeinsam haben und mir entweder so nichts sagen
oder die speziell mit dem Problem: Welcher Prozess blockt die Datei?, zu tun haben.

Das sind die Parallelen, die BEIDE Programme haben und wohl am Auslesen beteiligt sind.
Delphi-Quellcode:
GetFileAttributes
GetModuleHandle
GetProcAddress
kenn ich nicht - hab ich aber auch noch nicht nachgeschlagen:

Delphi-Quellcode:
DisableThreadLibraryCalls
InterlockedIncrement
InterlockedDecrement
So, hab noch zu tun - aber vielleicht hat ja noch jemand nen Hinweis auf die weitere Bearbeitung des Problems.
watch out ... SySSnapper... coming soon
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#12

Re: Prozesse oder Anwendungen ermitteln, die eine Datei benu

  Alt 26. Mär 2007, 08:16
Hallo,

weis eigentlich jemand genaueres wie dieses Programm funktioniert?
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#13

Re: Prozesse oder Anwendungen ermitteln, die eine Datei benu

  Alt 26. Mär 2007, 10:17
GetProcAddress und GetModuleHandle kannst du rauslassen, da sie nur dazu dienen andere Funktionen zu importieren. Somit müsstest du im Debugger genau nachsehen, welche Funktionen das sind. Es können theoretisch alle APIs sein. GetFileAttributes ist denke ich auch keine der Schlüsselfunktionen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#14

Re: Prozesse oder Anwendungen ermitteln, die eine Datei benu

  Alt 26. Mär 2007, 10:45
Die Interlocked-Funktionen fallen auch raus (das sind im Grunde nur die threadsicheren versionen von Inc und Dec)
und DisableThreadLibraryCalls hat nichts Dateien zu tun.

Bleibt dir also wirklich nur mitzuverfolgen welche Funktionen/Prozeduren von GetProcAddress importiert werden.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
EgoFelix

Registriert seit: 9. Mai 2005
1 Beiträge
 
#15

Re: Prozesse oder Anwendungen ermitteln, die eine Datei benu

  Alt 29. Mär 2007, 21:12
Hab da was gefunden, was euch vielleicht etwas weiterbringen kann.
Vielleicht setz ich mich auch mal dran

http://www.codeguru.com/Cpp/W-P/file...cle.php/c1287/

Jetzt müsstet ihr noch die Funktion raussuchen, welche die Handles eines Programmes anzeigen kann. Dann könntet ihr diese auch Schliessen.

Kleine Anmerkung:
Wenn ihr es macht, dass ihr die Handles bekommt, dann könnt ihr auch direkt über das Handle die Datei auslesen!

MfG

Felix
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Prozesse oder Anwendungen ermitteln, die eine Datei benu

  Alt 29. Mär 2007, 21:49
Moin Felix,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Nur mal interessehalber:
Hast Du den Codeabschnitt auf den Dein Link verweist mal unter Vista ausprobiert?
Da dort die Startadressen der DLLs nicht mehr immer an der gleichen Stelle liegen sollen, dürfte es dort eigentlich nicht mehr funktionieren, da sich dadurch ja die Startadresse der Kernel32.dll, und somit auch die der enthaltenen Funktionen verschieben, womit dann die Adresse von CloseHandle im eigenen Prozess eine andere ist als die im Remote-Prozess.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#17

Re: Prozesse oder Anwendungen ermitteln, die eine Datei benu

  Alt 30. Mär 2007, 01:31
Ich bin sicher sowohl andere Treiber als auch andere Prozesse werden es wirklich schätzen, wenn ihnen der Boden (lies: Handle) unter den Füssen weggezogen wird. Weiter so

Interessanter sind übrigens die Funktionen welche sie nicht gemeinsam haben
  Mit Zitat antworten Zitat
daPimP

Registriert seit: 27. Okt 2006
25 Beiträge
 
#18

Re: Prozesse oder Anwendungen ermitteln, die eine Datei benu

  Alt 11. Apr 2007, 01:28
Zitat:
Interessanter sind übrigens die Funktionen welche sie nicht gemeinsam haben
@OLLI: Verstehe deine Anspielung nicht ganz...

Im übrigen ist der Link doch wirklich hilfreich.
Da ich selbst wenig mit C zu tun habe, bin ich nicht in der Lage ihn 1:1 zu übersetzen.

Ich brauche eigentlich nur eine Liste ALLER Dateien (nicht nur die Module...)
vom Prozess XY, die momentan verwendet werden.




Wie gehts weiter?
Ich hab alle PIDs und TIDs und alle Rechte und mir reicht wenn es auf XP läuft.
watch out ... SySSnapper... coming soon
  Mit Zitat antworten Zitat
daPimP

Registriert seit: 27. Okt 2006
25 Beiträge
 
#19

Re: Prozesse oder Anwendungen ermitteln, die eine Datei benu

  Alt 17. Mai 2007, 03:21
Da mir das Thema nicht aus dem Kopf geht, werde ich in geraumer Zeit einige Fortschritte hier posten,
hoffe das wir der Lsg dann Näher kommen.

Ich halte nochmal fest:

ZIEL: eine X-beliebige Datei (nicht nur dll, exe) soll überprüft werden, von welchem Prozess
sie gerade benutzt wird.



AUFGABE: Ermitteln des HANDLE der Datei (und ich rede hier nicht von den Fensterhandles)

Verwirklicht wurde das schon im Programm Unlocker und im C++ SourceCode codeguru.com

Desweiteren ist das bloße Anzeigen des speziellen Handles definiv ONHE Treiberdatei möglich.
(im Gegensatz zu Unlocker)

Es reicht wenn es unter XP läuft.

FORTSCHRITT:
meine Delphi Übersetzung:

Hier soll ein Prozess per PID überprüft werden, und ALLE seine Handleverknüpfungen angezeigt werden.
Ich bekomme auch eine Zahl, die im Bereich der Handles liegt zurück, kann sie aber nicht zuordnen.

Delphi-Quellcode:
(*
Note: 1. SE_DEBUG privilege must be enabled.                  OK
      2. The function works with every kind of HANDLE
      3. It will bother the remote process :)
      4. The handles will be invalid after you closed          OK
        them remotely
*)


function CloseRemoteHandle(processID: DWORD; lpparameter: pointer ):DWORD;
var
  ht :THANDLE;
  rc : DWORD;
  hProcess: THandle;
  hKernel32: cardinal;
begin
 TRY
 lpparameter:= nil;
   ht:=0;
   rc:=0;
   // open the process
   HPROcESS:= OpenProcess(PROCESS_CREATE_THREAD
                                or PROCESS_VM_OPERATION
                                or PROCESS_VM_WRITE
                                or PROCESS_VM_READ, FALSE, processID);
   if hProcess = 0 then
     showmessage('hprocess ist null'); //tritt nicht ein

   // load kernel32.dll
   hKernel32 := LoadLibrary('kernel32.dll');

   // CreateRemoteThread()
   ht := CreateRemoteThread(
   hProcess,
   0,
   0,
   GetProcAddress(hKernel32, 'CloseHandle'),
   lpparameter, //////was mach ich hiermit?????
   0,
   rc );

    if ht =0 then begin
     rc := GetLastError();
     showmessage('ht ist null'); //tritt nicht ein
   end;

   case WaitForSingleObject(ht, 2000) of
     WAIT_OBJECT_0: begin end; //OK
   else
     rc := GetLastError(); //tritt nicht ein
     showmessage('Fehler WaitForSingle:');
   end;
 FINALLY
  result:= rc;
  showmessage('rc :'+ inttostr(rc)+' ht :'+ inttostr(ht)) //zum Anzeigen der Werte

  CloseHandle(ht);

  //Free up the kernel32.dll
  if hKernel32 <> 0 then
    FreeLibrary(hKernel32);

  CloseHandle(hProcess);
 END;
end;


procedure Tform1.Button1Click(Sender: TObject);
var PID: cardinal;
begin
 PID:= ....;
 CloseRemoteHandle(PID, 0); //die null is auch nicht astrein...
end;
der Original C++ Code

Delphi-Quellcode:
/*
Note: 1. SE_DEBUG privilege must be enabled.
      2. The function works with every kind of HANDLE
      3. It will bother the remote process :)
      4. The handles will be invalid after you closed
         them remotely
*/

//Close a handle in a remote process
DWORD CloseRemoteHandle( DWORD processID, HANDLE handle )
{
HANDLE ht = 0;
DWORD rc = 0;

_tprintf( _T("Closing handle in process #%d ... "),
          processID );

// open the process
HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD
                                | PROCESS_VM_OPERATION
                                | PROCESS_VM_WRITE
                                | PROCESS_VM_READ,
                                FALSE, processID );

if ( hProcess == NULL )
{
  rc = GetLastError();
  _tprintf( _T("OpenProcess() failed\n") );
  return rc;
}


 // load kernel32.dll
 HMODULE hKernel32 = LoadLibrary( _T("kernel32.dll") );

 // CreateRemoteThread()
 ht = CreateRemoteThread(
  hProcess,
  0,
  0,
  (DWORD(__stdcall *)(void*))GetProcAddress(hKernel32,"CloseHandle"),
  handle,
  0,
  &rc );

 if ( ht == NULL )
 {
  //Something is wrong with the privileges,
  //or the process doesn't like us
  rc = GetLastError();
  _tprintf( _T("CreateRemoteThread() failed\n") );
  goto cleanup;
}


 switch ( WaitForSingleObject( ht, 2000 ) )
 {
  case WAIT_OBJECT_0:
  //Well done
  rc = 0;
  _tprintf( _T("Ok\n"), rc );
  break;

  default:
  //Oooops, shouldn't be here
  rc = GetLastError();
  _tprintf( _T("WaitForSingleObject() failed\n") );
  goto cleanup;
  break;
}


 cleanup:
 //Closes the remote thread handle
 CloseHandle( ht );

 //Free up the kernel32.dll
 if ( hKernel32 != NULL)
  FreeLibrary( hKernel32 );

 //Close the process handle
 CloseHandle( hProcess );

 return rc;
}
FRAGE: Ist die Übersetzung soweit in Ordnung? Irgendwelche konstruktiven Anregungen?
watch out ... SySSnapper... coming soon
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: Prozesse oder Anwendungen ermitteln, die eine Datei benu

  Alt 17. Mai 2007, 09:48
Warum hast du den zweiten Parameter von einem Handle zu einem Pointer gemacht?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 00:04 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