1 (изменено: sanny0112, 2017-02-08 12:17:35)

Тема: AHK: Самоудаление скрипта

На просторах сего форума нашел скрипт на самоудаление скомпилированного AHK скрипта (http://forum.script-coding.com/viewtopi … 716#p95716), но есть одна загвоздка. Вместе со скриптом удаляется и папка, в которой он находится. Как можно изменить скрипт, чтобы тот удалял только сам себя?

2

Re: AHK: Самоудаление скрипта

У меня есть вообще страшный код, через скачивание заранее подготовленного деинсталятора и копии AutoHotKey.exe (если вдруг AHK на компьютере жертвы не установлен). В итоге exe закрывается, его удаляет .ahk файл, что был скачан и этот .ahk самоудаляется. В итоге на компе жертвы остается только  AutoHotKey.exe который я поместил в папку Temp и он скоро сам удалится.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

3

Re: AHK: Самоудаление скрипта

Так с выбором, что удалять:

var := "file"   ; если "file" — будет удалён только файл, если "folder" — папка файла со всеми файлами
Clean := new Uninstall(var)

if (var != "file")  {
   MsgBox, 52, Деинсталляция, Этот код удалит папку`n`n%A_ScriptDir%`n`n`со всеми файлами!`nПродолжить?
   IfMsgBox, No
      ExitApp,, Clean.cancel := 1
}
/*
Здесь код деинсталляции
*/
ExitApp

class Uninstall
{
   __New(var := "file")  {
      if !A_IsCompiled  {
         MsgBox, Скомпилируйте скрипт!
         ExitApp
      }
      
      for k, param in ["ParentPID", "ParentPath"]
         %param% := %k%
      if ParentPath  {
         SetWorkingDir, % A_Temp
         Process, WaitClose, % ParentPID
         if (var = "file")
            ComObjCreate("Scripting.FileSystemObject").DeleteFile(ParentPath, 1)
         else  {
            SplitPath, ParentPath,, Folder
            ComObjCreate("Scripting.FileSystemObject").DeleteFolder(Folder, 1)
         }
         ExitApp,, this.CreateProcess("rundll32", DEBUG_ONLY_THIS_PROCESS := 2)
      }
   }
   
   __Delete()  {
      if this.cancel
         ExitApp
      
      TmpFilePath := A_Temp "\ahk_uninstall_" A_TickCount ".exe"
      FileCopy, % A_ScriptFullPath, % TmpFilePath, 1

      hFile := this.OpenTmpFile(TmpFilePath)
      ChildPID := this.CreateProcess(TmpFilePath " " DllCall("GetCurrentProcessId") " """ A_ScriptFullPath """", 0)
      Process, Wait, % ChildPID
      DllCall("CloseHandle", Ptr, hFile)
   }
   
   OpenTmpFile(FilePath)  {
      static GENERIC_READ := 0x80000000, FILE_SHARE_READ := 1, FILE_SHARE_DELETE := 4
           , OPEN_EXISTING := 3, FILE_FLAG_DELETE_ON_CLOSE := 0x4000000
           , FILE_ATTRIBUTE_TEMPORARY := 0x100
      
      VarSetCapacity(SECURITY_ATTRIBUTES, size := 2*A_PtrSize + 4, 0)
      NumPut(size, SECURITY_ATTRIBUTES), NumPut(bInheritHandle := 1, &SECURITY_ATTRIBUTES + 2*A_PtrSize)
      Return DllCall("CreateFile", Str, FilePath
                                 , Int, GENERIC_READ
                                 , Int, FILE_SHARE_READ|FILE_SHARE_DELETE
                                 , Ptr, &SECURITY_ATTRIBUTES
                                 , Int, OPEN_EXISTING
                                 , Int, FILE_FLAG_DELETE_ON_CLOSE|FILE_ATTRIBUTE_TEMPORARY
                                 , Ptr, 0)
   }
   
   CreateProcess(CommandLine, flag)  {
      VarSetCapacity(STARTUPINFO, size := 4*A_PtrSize + 8*4 + 5*A_PtrSize, 0)
      NumPut(size, STARTUPINFO)
      VarSetCapacity(PROCESS_INFORMATION, 2*A_PtrSize + 8, 0)
      
      DllCall("CreateProcess", Ptr, 0, Str, CommandLine
                             , Ptr, 0, Ptr, 0
                             , Int, bInheritHandles := 1, UInt, flag, Ptr, 0, Ptr, 0
                             , Ptr, &STARTUPINFO, Ptr, &PROCESS_INFORMATION)
                             
      DllCall("CloseHandle", Ptr, hThread := NumGet(PROCESS_INFORMATION))
      DllCall("CloseHandle", Ptr, hProcess := NumGet(&PROCESS_INFORMATION + A_PtrSize))
      Return PID := NumGet(&PROCESS_INFORMATION + 2*A_PtrSize, "UInt")
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder