![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Вот, есть такая статья: Self-Deleting Executables.
Она рассказывает о нелёгких поисках способа удалить программно .EXE файл изнутри. Т.е. написать такую программу, которая сможет себя удалить, когда вы её запустите. Как известно в DOS такой проблемы не существует и я, в своё время, делал Uninstall'ер для своей программы, который удалял всё, включая и себя самого, ибо после запуска .EXE файл уже был не нужен. В Windows .EXE файл недоступен (занят системой) до тех пор, пока запущенная программа не прекратила работать, в частности удалить его тоже нельзя. Из данной статьи я взял универсальный способ-пример, довольно оригинального решения, файл "selfdel05.c" и попытался переписать его на Delphi (оригинал можно взять по ссылке выше - см. Download source). CODE // // selfdel.c // // Self deleting executable for Win9x/WinNT (all versions) // // J Brown 1/10/2003 // // This source file must be compiled with /GZ turned OFF // (basically, disable run-time stack checks) // // Under debug build this is always on (MSVC6) // // Uses Windows; // #pragma pack(push, 1) // #define Const CODESIZE = $200; // // Structure to inject into remote process. Contains // function pointers and code to execute. // Type PSELFDEL = ^TSELFDEL; TSELFDEL = Packed Record ARG0: PSELFDEL; // pointer to self opCodes: Array[0..CODESIZE-1] Of Byte; // code hParent: THandle; // parent process handle fnWaitForSingleObject: Function(hHandle: THandle; dwMilliseconds: DWORD): DWORD; stdcall; fnCloseHandle: Function(hObject: THandle): BOOL; stdcall; fnDeleteFile: Function(lpFileName: PChar): BOOL; stdcall; fnSleep: Procedure(dwMilliseconds: DWORD); stdcall; fnExitProcess: Procedure(uExitCode: UINT); stdcall; fnRemoveDirectory: Function(lpPathName: PChar): BOOL; stdcall; fnGetLastError: Function: DWORD; stdcall; fRemDir: LongBool; szFileName: Array[0..MAX_PATH-1] Of Char; // file to delete End; //#pragma pack(pop) {$ifdef _DEBUG} //{$define FUNC_ADDR(func) (PVOID)(*(DWORD *)((BYTE *)func + 1) + (DWORD)((BYTE *)func + 5))} {$else} //{$define FUNC_ADDR(func) func} {$endif} // // Routine to execute in remote process. // procedure remote_thread(remote: PSELFDEL); stdcall; Begin // wait for parent process to terminate remote^.fnWaitForSingleObject(remote^.hParent, INFINITE); remote^.fnCloseHandle(remote^.hParent); // try to delete the executable file while (not remote^.fnDeleteFile(remote^.szFileName)) Do Begin // failed - try again in one second's time remote^.fnSleep(1000); End; // finished! exit so that we don't execute garbage code remote^.fnExitProcess(0); End; // // Delete currently running executable and exit // Function SelfDelete(fRemoveDirectory: LongBool): Boolean; Var si: STARTUPINFO; pi: PROCESS_INFORMATION; context: TContext; oldProt: DWORD; local: TSELFDEL; entrypoint: DWORD; szExe: Array[0..MAX_PATH-1] Of Char; remdel: Pointer; dummy: dword; Begin result:=FALSE; szExe:='explorer.exe'#0; // // Create executable suspended // ZeroMemory(@si, SizeOf(si)); si.cb:=SizeOf(si); if CreateProcess(Nil, szExe, Nil, Nil, False, CREATE_SUSPENDED Or IDLE_PRIORITY_CLASS, Nil, Nil, si, pi) Then Begin local.fnWaitForSingleObject := @WaitForSingleObject; local.fnCloseHandle := @CloseHandle; local.fnDeleteFile := @DeleteFile; local.fnSleep := @Sleep; local.fnExitProcess := @ExitProcess; local.fnRemoveDirectory := @RemoveDirectory; local.fnGetLastError := @GetLastError; local.fRemDir := fRemoveDirectory; // Give remote process a copy of our own process handle DuplicateHandle(GetCurrentProcess, GetCurrentProcess, pi.hProcess, @local.hParent, 0, FALSE, 0); GetModuleFileName(0, local.szFileName, MAX_PATH); // copy in binary code remdel:=@remote_thread; move(remdel, local.opCodes, CODESIZE); //move(local.opCodes, @remdel, CODESIZE); {!} // // Allocate some space on process's stack and place // our SELFDEL structure there. Then set the instruction pointer // to this location and let the process resume // context.ContextFlags := CONTEXT_INTEGER Or CONTEXT_CONTROL; GetThreadContext(pi.hThread, context); // Allocate space on stack (aligned to cache-line boundary) entrypoint := (context.Esp - sizeof(TSELFDEL)) And Cardinal(Not $1F); // // Place a pointer to the structure at the bottom-of-stack // this pointer is located in such a way that it becomes // the remote_thread's first argument!! // local.Arg0:=Ptr(entrypoint); // local.Arg0 := TSELFDEL(entrypoint); context.Esp := entrypoint - 4; // create dummy return address context.Eip := entrypoint + 4; // offset of opCodes within structure // copy in our code+data at the exe's entry-point VirtualProtectEx(pi.hProcess, Ptr(entrypoint), sizeof(local), PAGE_EXECUTE_READWRITE, Ptr(oldProt)); WriteProcessMemory(pi.hProcess, Ptr(entrypoint), Pointer(@local), sizeof(local), dummy); FlushInstructionCache(pi.hProcess, Ptr(entrypoint), sizeof(local)); SetThreadContext(pi.hThread, context); // Let the process continue ResumeThread(pi.hThread); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); result:=TRUE; End; End; Begin SelfDelete(False); End. Однако, где-то я чего-то упустил, ибо программа запускается, но ничего не делает. Кто-нибудь может помочь? |
![]() ![]() |
Axsis |
![]()
Сообщение
#2
|
Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 121 Регистрация: 6-February 08 Пользователь №: 374 Спасибо сказали: 149 раз(а) ![]() |
QUOTE Насчёт области кода и области данных... х.з. Есть же трейнеры, которые память патчат, чтобы жизнь вообще не отнималась (*улыбается*). Я не знаю ни одного трейнера который бы патчил код игры, там принцип такой, что каждые несколько милисекунд трейнер восстанавливает значение в памяти на прежнее, то есть жизни отнимаются, но через несколько мс восстанавливаются, для игрока это незаметно просто ![]() Вот ещё отчёт с ВирусТотала для твоего файла: CODE Complete scanning result of "DSelfDel.exe", received in VirusTotal at 07.05.2007, 16:29:41 (CET). Antivirus Version Update Result AhnLab-V3 2007.7.5.0 07.05.2007 no virus found AntiVir 7.4.0.37 07.05.2007 HEUR/Malware <<<<<<<<<<<<<<< Authentium 4.93.8 07.04.2007 no virus found Avast 4.7.997.0 07.04.2007 no virus found AVG 7.5.0.476 07.04.2007 no virus found BitDefender 7.2 07.05.2007 no virus found CAT-QuickHeal 9.00 07.05.2007 no virus found ClamAV devel-20070416 07.05.2007 no virus found DrWeb 4.33 07.05.2007 no virus found eSafe 7.0.15.0 07.05.2007 suspicious Trojan/Worm <<<<<<<<<<<<<<< eTrust-Vet 30.8.3765 07.05.2007 no virus found Ewido 4.0 07.05.2007 no virus found FileAdvisor 1 07.05.2007 no virus found Fortinet 2.91.0.0 07.05.2007 no virus found F-Prot 4.3.2.48 07.04.2007 no virus found F-Secure 6.70.13260.0 07.05.2007 Possibly malicious <<<<<<<<<<<<<<< Ikarus T3.1.1.8 07.05.2007 no virus found Kaspersky 4.0.2.24 07.05.2007 no virus found McAfee 5067 07.04.2007 no virus found Microsoft 1.2701 07.05.2007 no virus found NOD32v2 2379 07.04.2007 no virus found Norman 5.80.02 07.04.2007 no virus found Panda 9.0.0.4 07.05.2007 no virus found Sophos 4.19.0 06.24.2007 no virus found Sunbelt 2.2.907.0 07.04.2007 no virus found Symantec 10 07.05.2007 no virus found TheHacker 6.1.6.142 07.04.2007 no virus found VBA32 3.12.0.2 07.05.2007 no virus found VirusBuster 4.3.23:9 07.05.2007 no virus found Webwasher-Gateway 6.0.1 07.05.2007 Heuristic.Malware <<<<<<<<<<<<<<< Aditional Information File size: 9728 bytes MD5: 20a3c83a74dd2aeb9f64bfe4894998c0 SHA1: 416ef725c4a8837e3a19c5e74bba2b46318dca5d packers: UPX Как видишь, эвристические движки 4 антивирей сочли этот код потенциально опасным. Да, это редкие (очень редкие ![]() Дома ещё с аутпостом проверю, глянем на его реакцию. Ещё бы с KIS проверить, тока нету его у меня ![]() QUOTE Тоже, в принципе, "с боку припёка". (*улыбается*) На самом деле отличие от твоей версии лишь в том что файл заменяет себя сам а не из внедрённого кода, а в остальном... тот же временный файл, та же прозрачность для пользователя, та же реализация в виде 1-го exe... QUOTE Не так - сначала ищется обновление, затем скачивается. И только потом Explorer.exe модифицируется. Нет обновления - нет запуска Explorer.exe и модификации. Ну так всё-таки лучше ![]() |
![]() ![]() |
Упрощённая версия | Сейчас: 30th April 2025 - 21:04 |