Запущенный .exe удалить стандартными методами невозможно, но можно переименовать. Собственно вопрос - как из программы получить имя своего экзешника в случае его переименования?
С большой долей вероятности, что никак, ибо после загрузки exe-шника лоадером в память считывать из файла в общем случае ничего не нужно.
TermoSINteZ разве я говорил что мне нужно его удалить? n0name а как же своппинг? ведь не измененные страницы не бросаются в своп файл а просто освобождаются и при надобности подгружаются из exe? да и учитывая что даже после переименования файл удалить не возможно, гдето должен быть хэндл, привязаный к новому имени... :-\
Изучал недавно принцип работы GetModuleFileName - вообщем она берет указатель Ldr->InLoadOrderModuleList из PEB нужного процесса, затем получает указатель на текущий модуль - PLDR_DATA_TABLE_ENTRY, в нем есть две UNICODE_STRING - BaseName и FullName. - Собственно через эти строки и получаем путь к текущему модулю.
кмк хэндл тот же остается. изменены только свойства его. засада вся в том что в windows xp этот хэндл в ring-3 недоступен, тогда как в w2k он доступен в ring-3. из-за этого кстати методы самоудаления некоторые работавшие в 2к не работают в хрюше
Я игрался с этим. Переименование залоченного файла происходит на уровне ФС, но как получить новое имя из программы не нашёл.
да, похоже в ядро кстати RootkitUnhooker (http://www.wasm.ru/toollist.php?list=21#392) верно показывает новые имена при переименовании.
Ага =) Это выливается в вызов NtQuerySystemInformation с флагом 5. Самый надежный способ определения имени процесса - чтение секции из драйвера.
EP_X0FF >Ага =) Это выливается в вызов NtQuerySystemInformation с флагом 5. Самый надежный способ определения имени процесса - чтение секции из драйвера. Ну, иногда и без драйвера: 1) запускаем exe, когда не запущено ничего, мониторящего процессы, 2) переименовываем, 3) запускаем, скажем, ProcExp - и видим там переименованное. И кстати о надежности: а как насчет неоднократного переименования за один запуск ?
Не знаю, может поможет Код (Text): ; Функция узнаёт от куда была запущена программа ; pid - индификатор процесса ; lpBuffer - адресс куда будет записан proc GetProcessFileName,pid,lpBuffer push edi ebx mov edi,[lpBuffer] xor eax,eax mov dword[edi],eax invoke OpenProcess,PROCESS_QUERY_INFORMATION+PROCESS_VM_READ,eax,[pid] test eax,eax jz @F mov ebx,eax invoke NtQueryInformationProcess,ebx,ProcessBasicInformation,edi,sizeof.PROCESS_BASIC_INFORMATION,esp,eax pop ecx ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; virtual at edi ;; .bs PROCESS_BASIC_INFORMATION ;; end virtual ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; invoke ReadProcessMemory,ebx,[.bs.PebBaseAddress],edi,10h,esp,eax pop ecx ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; virtual at edi ;; .peb PEB ;; end virtual ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; invoke ReadProcessMemory,ebx,[.peb.Ldr],edi,sizeof.PEB_LDR_DATA,esp,eax pop ecx ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; virtual at edi ;; .pebldr PEB_LDR_DATA ;; end virtual ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; invoke ReadProcessMemory,ebx,[.pebldr.InLoadOrderModuleList],edi,sizeof.LDR_DATA_TABLE_ENTRY,esp,eax pop ecx ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; virtual at edi ;; .module LDR_DATA_TABLE_ENTRY ;; end virtual ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movzx eax,[.module.FullDllName.MaximumLength] invoke ReadProcessMemory,ebx,[.module.FullDllName.Buffer],edi,eax,esp,eax pop ecx invoke CloseHandle,ebx @@:; Erorr pop ebx edi ret endp а и вот структуры ... Код (Text): ;ProcessBasicInformation struct PROCESS_BASIC_INFORMATION ExitStatus dd ? PebBaseAddress dd ? ;PPEB AffinityMask dd ? BasePriority dd ? UniqueProcessId dd ? InheritedFromUniqueProcessId dd ? ends; PROCESS_BASIC_INFORMATION ;================================================================== struct UNICODE_STRING Length dw ? MaximumLength dw ? Buffer dd ? ends struct LIST_ENTRY Flink dd ? Blink dd ? ends struct PEB_LDR_DATA Length dd ? Initialized dd ? SsHandle dd ? InLoadOrderModuleList LIST_ENTRY InMemoryOrderModuleList LIST_ENTRY InInitializationOrderModuleList LIST_ENTRY EntryInProgress dd ? ends struct LDR_DATA_TABLE_ENTRY InLoadOrderModuleList LIST_ENTRY InMemoryOrderModuleList LIST_ENTRY InInitializationOrderModuleList LIST_ENTRY DllBase dd ? EntryPoint dd ? SizeOfImage dd ? FullDllName UNICODE_STRING BaseDllName UNICODE_STRING Flags dd ? LoadCount dw ? TlsIndex dw ? HashLinks LIST_ENTRY TimeDateStamp dd ? ends ; ; Process Environment Block (PEB) ; struct PEB InheritedAddressSpace db ? ;* 00h *; ReadImageFileExecOptions db ? ;* 01h *; BeingDebugged db ? ;* 02h *; SpareBool db ? ;* 03h *; Mutant dd ? ;* 04h *; ImageBaseAddress dd ? ;* 08h *; Ldr dd ? ;* 0Ch *; PEB_LDR_DATA ProcessParameters dd ? ;* 10h *; RTL_USER_PROCESS_PARAMETERS SubSystemData dd ? ;* 14h *; ProcessHeap dd ? ;* 18h *; FastPebLock dd ? ;* 1Ch *; FastPebLockRoutine dd ? ;* 20h *; PEBLOCKROUTINE FastPebUnlockRoutine dd ? ;* 24h *; PEBLOCKROUTINE EnvironmentUpdateCount dd ? ;* 28h *; KernelCallbackTable dd ? ;* 2Ch *; EventLogSection dd ? ;* 30h *; EventLog dd ? ;* 34h *; FreeList dd ? ;* 38h *; PEB_FREE_BLOCK TlsExpansionCounter dd ? ;* 3Ch *; TlsBitmap dd ? ;* 40h *; TlsBitmapBits rd 2 ;* 44h *; ReadOnlySharedMemoryBase dd ? ;* 4Ch *; ReadOnlySharedMemoryHeap dd ? ;* 50h *; ReadOnlyStaticServerData dd ? ;* 54h *; AnsiCodePageData dd ? ;* 58h *; OemCodePageData dd ? ;* 5Ch *; UnicodeCaseTableData dd ? ;* 60h *; NumberOfProcessors dd ? ;* 64h *; NtGlobalFlag dd ? ;* 68h *; CriticalSectionTimeout LARGE_INTEGER ;* 70h *; HeapSegmentReserve dd ? ;* 78h *; HeapSegmentCommit dd ? ;* 7Ch *; HeapDeCommitTotalFreeThreshold dd ? ;* 80h *; HeapDeCommitFreeBlockThreshold dd ? ;* 84h *; NumberOfHeaps dd ? ;* 88h *; MaximumNumberOfHeaps dd ? ;* 8Ch *; ProcessHeaps dd ? ;* 90h *; GdiSharedHandleTable dd ? ;* 94h *; ProcessStarterHelper dd ? ;* 98h *; GdiDCAttributeList dd ? ;* 9Ch *; LoaderLock dd ? ;* A0h *; OSMajorVersion dd ? ;* A4h *; OSMinorVersion dd ? ;* A8h *; OSBuildNumber dw ? ;* ACh *; OSCSDVersion dw ? ;* AEh *; OSPlatformId dd ? ;* B0h *; ImageSubSystem dd ? ;* B4h *; ImageSubSystemMajorVersion dd ? ;* B8h *; ImageSubSystemMinorVersion dd ? ;* BCh *; ImageProcessAffinityMask dd ? ;* C0h *; GdiHandleBuffer rd 22h ;* C4h *; PostProcessInitRoutine dd ? ;* 14Ch *; lsExpansionBitmap dd ? ;* 150h *; RTL_BITMAP TlsExpansionBitmapBits rd 20h ;* 154h *; SessionId dd ? ;* 1D4h *; AppCompatInfo dd ? ;* 1D8h *; CSDVersion UNICODE_STRING ;* 1DCh *; ends ;PROCESSINFOCLASS ProcessBasicInformation equ 0 ProcessQuotaLimits equ 1 ProcessIoCounters equ 2 ProcessVmCounters equ 3 ProcessTimes equ 4 ProcessBasePriority equ 5 ProcessRaisePriority equ 6 ProcessDebugPort equ 7 ProcessExceptionPort equ 8 ProcessAccessToken equ 9 ProcessLdtInformation equ 10 ProcessLdtSize equ 11 ProcessDefaultHardErrorMode equ 12 ProcessIoPortHandlers equ 13 ProcessPooledUsageAndLimits equ 14 ProcessWorkingSetWatch equ 15 ProcessUserModeIOPL equ 16 ProcessEnableAlignmentFaultFixup equ 17 ProcessPriorityClass equ 18 ProcessWx86Information equ 19 ProcessHandleCount equ 20 ProcessAffinityMask equ 21 ProcessPriorityBoost equ 22 ProcessDeviceMap equ 23 ProcessSessionInformation equ 24 ProcessForegroundInformation equ 25 ProcessWow64Information equ 26 ProcessImageFileName equ 27 ProcessLUIDDeviceMapsEnabled equ 28 ProcessBreakOnTermination equ 29 ProcessDebugObjectHandle equ 30 ProcessDebugFlags equ 31 ProcessHandleTracing equ 32 ProcessIoPriority equ 33 ProcessExecuteFlags equ 34 ProcessTlsInformation equ 35 ProcessCookie equ 36 ProcessImageInformation equ 37 ProcessCycleTime equ 38 ProcessPagePriority equ 39 ProcessInstrumentationCallback equ 40 MaxProcessInfoClass equ 41 ;end PROCESSINFOCLASS;