majid2230
دوشنبه 07 تیر 1389, 22:14 عصر
حتما تا الان براتون پیش اومده که بخواید یه فایل رو delete,rename,cut کنید ولی سیستم پیغام می ده فایل در حال استفاده است ولی شما نمی دونید چه برنامه ای داره از فایل استفاده می کنه ،من یه کنسول پیدا کردمhandle.exe (خیلی وقت پیش بود نمی دونم از کجا) که یه همچین کاری می کنه (میگه کی ، کی رو لاک کرده ) یه برنامه باهاش نوشتم(unlocker.exe) برای استفاده خودم ، (که زیاد مهم نیست) ولی فایل برنامه کنسول رو هم براتون گذاشتم که اگه خواستید استفاده کنید (باید حتما به عنوان ادمین اجرا بشه ، با nod و AVG و Kaspersky چک شده) .
خود کنسول برای کامندهاش یه help داره .
اگه خواستید unlocker.exe رو امتحان کنید ، باید حتما handle.exe هم کنارش باشه و unlocker.exe رو با دسترسی ادمین اجرا کنید اگه کدش رو خواستید بگید بذارم ولی باید اصلاح بشه چون یه سری از کامپوننت هاش استاندارد دلفی نیست .
اگه کسی برای ارتباط با کنسول از پایپ استفاده کرده لطفا بگه چه جوری ، من خودم نتایج رو به یه فایل txt ارسال کردم و از اون میخونم .
http://www.4shared.com/file/L0aDmrEo/UNLOCKER.html
lord_viper
سه شنبه 08 تیر 1389, 18:05 عصر
این کد برای بدست اوردن لیست هندلهای مورد استفاده برنامه هست 
(کاری که برنامه فوق انجام میده)
program ListAllHandles;
{$APPTYPE CONSOLE}
uses
  PSApi,
  Windows,
  SysUtils;
const
SystemHandleInformation       = $10;
STATUS_SUCCESS               = $00000000;
STATUS_BUFFER_OVERFLOW        = $80000005;
STATUS_INFO_LENGTH_MISMATCH   = $C0000004;
DefaulBUFFERSIZE              = $100000;
type
 OBJECT_INFORMATION_CLASS = (ObjectBasicInformation,ObjectNameInformation,Obje ctTypeInformation,ObjectAllTypesInformation,Object HandleInformation );
 SYSTEM_HANDLE=packed record
 uIdProcess:ULONG;
 ObjectType:UCHAR;
 Flags     :UCHAR;
 Handle    :Word;
 pObject   :Pointer;
 GrantedAccess:ACCESS_MASK;
 end;
 PSYSTEM_HANDLE      = ^SYSTEM_HANDLE;
 SYSTEM_HANDLE_ARRAY = Array[0..0] of SYSTEM_HANDLE;
 PSYSTEM_HANDLE_ARRAY= ^SYSTEM_HANDLE_ARRAY;
  SYSTEM_HANDLE_INFORMATION=packed record
 uCount:ULONG;
 Handles:SYSTEM_HANDLE_ARRAY;
 end;
 PSYSTEM_HANDLE_INFORMATION=^SYSTEM_HANDLE_INFORMAT ION;
 TNtQuerySystemInformation=function (SystemInformationClass:DWORD; SystemInformation:pointer; SystemInformationLength:DWORD;  ReturnLength:PDWORD):THandle; stdcall;
 TNtQueryObject           =function (ObjectHandle:cardinal; ObjectInformationClass:OBJECT_INFORMATION_CLASS; ObjectInformation:pointer; Length:ULONG;ResultLength:PDWORD):THandle;stdcall;
 UNICODE_STRING=packed record
    Length       :Word;
    MaximumLength:Word;
    Buffer       :PWideChar;
 end;
 OBJECT_NAME_INFORMATION=UNICODE_STRING;
 POBJECT_NAME_INFORMATION=^OBJECT_NAME_INFORMATION;
Var
 NTQueryObject           :TNtQueryObject;
 NTQuerySystemInformation:TNTQuerySystemInformation ;
function GetObjectInfo(hObject:cardinal; objInfoClass:OBJECT_INFORMATION_CLASS):LPWSTR;
var
 pObjectInfo:POBJECT_NAME_INFORMATION;
 HDummy     :THandle;
 dwSize     :DWORD;
begin
  Result:=nil;
  dwSize      := sizeof(OBJECT_NAME_INFORMATION);
  pObjectInfo := AllocMem(dwSize);
  HDummy      := NTQueryObject(hObject, objInfoClass, pObjectInfo,dwSize, @dwSize);
  if((HDummy = STATUS_BUFFER_OVERFLOW) or (HDummy = STATUS_INFO_LENGTH_MISMATCH)) then
    begin
   FreeMem(pObjectInfo);
   pObjectInfo := AllocMem(dwSize);
   HDummy      := NTQueryObject(hObject, objInfoClass, pObjectInfo,dwSize, @dwSize);
  end;
  if((HDummy >= STATUS_SUCCESS) and (pObjectInfo.Buffer <> nil)) then
  begin
   Result := AllocMem(pObjectInfo.Length + sizeof(WCHAR));
   CopyMemory(result, pObjectInfo.Buffer, pObjectInfo.Length);
  end;
  FreeMem(pObjectInfo);
end;
Procedure EnumerateOpenFiles();
var
 sDummy      : string;
 hProcess    : THandle;
 hObject     : THandle;
 ResultLength: DWORD;
 aBufferSize : DWORD;
 aIndex      : Integer;
 pHandleInfo : PSYSTEM_HANDLE_INFORMATION;
 HDummy      : THandle;
 lpwsName    : PWideChar;
 lpwsType    : PWideChar;
 lpszProcess : PAnsiChar;
begin
    AbufferSize      := DefaulBUFFERSIZE;
  pHandleInfo      := AllocMem(AbufferSize);
  HDummy           := NTQuerySystemInformation(DWORD(SystemHandleInforma tion), pHandleInfo,AbufferSize, @ResultLength);  //Get the list of handles
  if(HDummy = STATUS_SUCCESS) then  //If no error continue
    begin
      for aIndex:=0 to pHandleInfo^.uCount-1 do   //iterate the list
      begin
    hProcess := OpenProcess(PROCESS_DUP_HANDLE or PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, pHandleInfo.Handles[aIndex].uIdProcess);  //open the process to get aditional info
    if(hProcess <> INVALID_HANDLE_VALUE) then  //Check valid handle
        begin
     hObject := 0;
     if DuplicateHandle(hProcess, pHandleInfo.Handles[aIndex].Handle,GetCurrentProcess(), @hObject, STANDARD_RIGHTS_REQUIRED,FALSE, 0) then  //Get  a copy of the original handle
          begin
      lpwsName := GetObjectInfo(hObject, ObjectNameInformation); //Get the filename linked to the handle
      if (lpwsName <> nil)  then
            begin
       lpwsType    := GetObjectInfo(hObject, ObjectTypeInformation);
       lpszProcess := AllocMem(MAX_PATH);
       if GetModuleFileNameEx(hProcess, 0,lpszProcess, MAX_PATH)<>0 then  //get the name of the process
               sDummy:=ExtractFileName(lpszProcess)
              else
               sDummy:= 'System Process';
              Writeln('PID      ',pHandleInfo.Handles[aIndex].uIdProcess);
              Writeln('Handle   ',pHandleInfo.Handles[aIndex].Handle);
              Writeln('Process  ',sDummy);
              Writeln('FileName ',string(lpwsName));
              Writeln;
              FreeMem(lpwsName);
              FreeMem(lpwsType);
              FreeMem(lpszProcess);
      end;
      CloseHandle(hObject);
     end;
     CloseHandle(hProcess);
    end;
   end;
  end;
  FreeMem(pHandleInfo);
end;
begin
  try
    NTQueryObject            := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'NtQueryObject');
    NTQuerySystemInformation := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'NtQuerySystemInformation');
   if (@NTQuerySystemInformation<>nil) and (@NTQuerySystemInformation<>nil) then
    EnumerateOpenFiles();
    Readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
منبع:StackOverFlow
hojjatcroos
چهارشنبه 09 تیر 1389, 23:06 عصر
به هوک کردن میتونید هم این کارها را انجام دهید.
lord_viper
پنج شنبه 10 تیر 1389, 19:27 عصر
به هوک کردن میتونید هم این کارها را انجام دهید.
شما باهوک فقط میتونین متوجه بشین که یه فایل که در حال Deleteهست به علت در حال استفاده بودن نمی توان اونو حذف کرد
(مثل UnlockerAssistant که با هوک این حالت رو تشخیص میده)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.