mirror of
https://github.com/nmap/nmap.git
synced 2025-12-06 04:31:29 +00:00
718 lines
23 KiB
NSIS
718 lines
23 KiB
NSIS
;Nmap Installer
|
|
;Started by Bo Jiang @ 08/26/2005 06:07PM
|
|
;;
|
|
;; Recognizes the options (case sensitive):
|
|
;; /S silent install
|
|
;; /NMAP=NO don't install Nmap
|
|
;; /REGISTERPATH=NO don't add the installation directory to PATH
|
|
;; /NPCAP=NO don't install Npcap
|
|
;; /REGISTRYMODS=NO don't install performance-related registry mods
|
|
;; /ZENMAP=NO don't install Zenmap (non-OEM only)
|
|
;; /NCAT=NO don't install Ncat
|
|
;; /NDIFF=NO don't install Ndiff (non-OEM only)
|
|
;; /NPING=NO don't install Nping
|
|
;; /D=C:\dir\... install to C:\dir\... (overrides InstallDir)
|
|
;;
|
|
;;/D is a built-in NSIS option and has these restrictions:
|
|
;;(http://nsis.sourceforge.net/Docs/Chapter3.html)
|
|
;; It must be the last parameter used in the command line and must not
|
|
;; contain any quotes, even if the path contains spaces. Only absolute
|
|
;; paths are supported.
|
|
|
|
; Ensure large strings build is used
|
|
!if ${NSIS_MAX_STRLEN} < 8192
|
|
!error "Need to use large strings build of NSIS."
|
|
!endif
|
|
|
|
!define STAGE_DIR ..\nmap-${VERSION}
|
|
|
|
!ifdef NMAP_OEM
|
|
!include "..\..\..\nmap-build\nmap-oem.nsh"
|
|
!define STAGE_DIR_OEM ${STAGE_DIR}-oem
|
|
!else
|
|
!define STAGE_DIR_OEM ${STAGE_DIR}
|
|
!endif
|
|
|
|
!define REG_UNINSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall"
|
|
!define NMAP_UNINSTALL_KEY "${REG_UNINSTALL_KEY}\${NMAP_NAME}"
|
|
|
|
;--------------------------------
|
|
;Include Modern UI
|
|
|
|
!include "MUI.nsh"
|
|
!include "AddToPath.nsh"
|
|
!include "FileFunc.nsh"
|
|
!include "nmap-common.nsh"
|
|
|
|
;--------------------------------
|
|
;General
|
|
;Name and file
|
|
Name "${NMAP_NAME}"
|
|
Unicode true
|
|
|
|
!ifdef INNER
|
|
# Write an uninstaller only
|
|
!insertmacro MUI_UNPAGE_CONFIRM
|
|
!insertmacro MUI_UNPAGE_INSTFILES
|
|
!echo "Inner invocation" ; just to see what's going on
|
|
OutFile "${STAGE_DIR_OEM}\tempinstaller.exe" ; Ensure we don't confuse these
|
|
SetCompress off ; for speed
|
|
RequestExecutionLevel user
|
|
Section "dummy"
|
|
SectionEnd
|
|
!else
|
|
!echo "Outer invocation"
|
|
|
|
!include "WordFunc.nsh"
|
|
!include "Sections.nsh"
|
|
|
|
; Good. Now we can carry on writing the real installer.
|
|
|
|
OutFile ${STAGE_DIR_OEM}-setup.exe
|
|
SetCompressor /SOLID /FINAL lzma
|
|
!ifdef NMAP_OEM
|
|
; OEM installer is less than 32MB uncompressed, so extra dict is wasted
|
|
SetCompressorDictSize 32
|
|
!else
|
|
SetCompressorDictSize 64
|
|
!endif
|
|
|
|
;Required for removing shortcuts
|
|
RequestExecutionLevel admin
|
|
!endif
|
|
|
|
VIProductVersion ${NUM_VERSION}
|
|
VIAddVersionKey /LANG=1033 "FileVersion" "${VERSION}"
|
|
VIAddVersionKey /LANG=1033 "ProductName" "${NMAP_NAME}"
|
|
VIAddVersionKey /LANG=1033 "CompanyName" "Insecure.org"
|
|
VIAddVersionKey /LANG=1033 "InternalName" "NmapInstaller.exe"
|
|
VIAddVersionKey /LANG=1033 "LegalCopyright" "Copyright (c) Nmap Software LLC (fyodor@nmap.org)"
|
|
VIAddVersionKey /LANG=1033 "LegalTrademark" "NMAP"
|
|
VIAddVersionKey /LANG=1033 "FileDescription" "${NMAP_NAME} installer"
|
|
|
|
;--------------------------------
|
|
;Interface Settings
|
|
|
|
!define MUI_ABORTWARNING
|
|
|
|
;--------------------------------
|
|
;Pages
|
|
|
|
!insertmacro MUI_PAGE_LICENSE "..\LICENSE.formatted"
|
|
!insertmacro MUI_PAGE_COMPONENTS
|
|
!insertmacro MUI_PAGE_DIRECTORY
|
|
!insertmacro MUI_PAGE_INSTFILES
|
|
!ifndef INNER
|
|
!ifndef NMAP_OEM
|
|
Page custom shortcutsPage makeShortcuts
|
|
!endif
|
|
Page custom finalPage doFinal
|
|
!endif
|
|
|
|
;--------------------------------
|
|
;Languages
|
|
|
|
!insertmacro MUI_LANGUAGE "English"
|
|
|
|
!ifndef INNER
|
|
!insertmacro GetParameters
|
|
!insertmacro GetOptions
|
|
|
|
;--------------------------------
|
|
;Variables
|
|
|
|
!ifndef NMAP_OEM
|
|
Var zenmapset
|
|
!endif
|
|
Var addremoveset
|
|
Var vcredistset
|
|
!define NMAP_ARCH x86
|
|
!define VCREDISTEXE VC_redist.${NMAP_ARCH}.exe
|
|
!define VCREDISTVER 14.0
|
|
!define VCREDISTYEAR 2019
|
|
|
|
;--------------------------------
|
|
;Reserves
|
|
|
|
!ifndef NMAP_OEM
|
|
ReserveFile "shortcuts.ini"
|
|
!endif
|
|
ReserveFile "final.ini"
|
|
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
|
|
ReserveFile /plugin "System.dll"
|
|
|
|
;--------------------------------
|
|
;Functions
|
|
|
|
;The .onInit function is below the Sections because it needs to refer to
|
|
;the Section IDs which are not defined yet.
|
|
|
|
!ifndef NMAP_OEM
|
|
Function shortcutsPage
|
|
StrCmp $zenmapset "" skip
|
|
|
|
!insertmacro MUI_HEADER_TEXT "Create Shortcuts" ""
|
|
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "shortcuts.ini"
|
|
|
|
skip:
|
|
FunctionEnd
|
|
|
|
!macro writeZenmapShortcut _lnk
|
|
CreateShortcut `${_lnk}` "$INSTDIR\zenmap\bin\pythonw.exe" '-c "from zenmapGUI.App import run;run()"' "$INSTDIR\nmap.exe" 0 "" "" "Launch Zenmap, the Nmap GUI"
|
|
!macroend
|
|
Function makeShortcuts
|
|
StrCmp $zenmapset "" skip
|
|
|
|
ReadINIStr $0 "$PLUGINSDIR\shortcuts.ini" "Field 1" "State"
|
|
StrCmp $0 "0" skipdesktop
|
|
!insertmacro writeZenmapShortcut "$DESKTOP\${NMAP_NAME} - Zenmap GUI.lnk"
|
|
|
|
skipdesktop:
|
|
|
|
ReadINIStr $0 "$PLUGINSDIR\shortcuts.ini" "Field 2" "State"
|
|
StrCmp $0 "0" skipstartmenu
|
|
CreateDirectory "$SMPROGRAMS\${NMAP_NAME}"
|
|
!insertmacro writeZenmapShortcut "$SMPROGRAMS\${NMAP_NAME}\${NMAP_NAME} - Zenmap GUI.lnk"
|
|
|
|
skipstartmenu:
|
|
|
|
skip:
|
|
FunctionEnd
|
|
!endif
|
|
|
|
Function finalPage
|
|
; diplay a page saying everything's finished
|
|
!insertmacro MUI_HEADER_TEXT "Finished" "Thank you for installing ${NMAP_NAME}"
|
|
!insertmacro MUI_INSTALLOPTIONS_DISPLAY "final.ini"
|
|
FunctionEnd
|
|
|
|
Function doFinal
|
|
; don't need to do anything
|
|
FunctionEnd
|
|
|
|
;--------------------------------
|
|
;Installer Sections
|
|
|
|
ReserveFile "${STAGE_DIR_OEM}\Uninstall.exe"
|
|
ReserveFile "..\npcap-${NPCAP_VERSION}.exe"
|
|
ReserveFile ..\${VCREDISTEXE}
|
|
|
|
!insertmacro SanityCheckInstdir ""
|
|
Section "Nmap Core Files" SecCore
|
|
Call SanityCheckInstdir
|
|
;Delete specific subfolders (NB: custom scripts in scripts folder will be lost)
|
|
RMDir /r "$INSTDIR\nselib"
|
|
; nselib-bin held NSE C modules up through version 4.68.
|
|
RMDir /r "$INSTDIR\nselib-bin"
|
|
RMDir /r "$INSTDIR\scripts"
|
|
RMDir /r "$INSTDIR\zenmap"
|
|
RMDir /r "$INSTDIR\py2exe"
|
|
RMDir /r "$INSTDIR\share"
|
|
RMDir /r "$INSTDIR\licenses"
|
|
|
|
SetOutPath "$INSTDIR"
|
|
|
|
SetOverwrite on
|
|
!insertmacro SecCoreFiles
|
|
|
|
Call vcredistinstaller
|
|
Call create_uninstaller
|
|
|
|
SectionEnd
|
|
|
|
Section "Register Nmap Path" SecRegisterPath
|
|
PUSH $INSTDIR
|
|
Call AddToPath
|
|
SectionEnd
|
|
|
|
!ifdef NMAP_OEM
|
|
Section "Npcap ${NPCAP_VERSION} OEM" SecNpcap
|
|
!insertmacro NPCAP_OEM_INSTALL "npcap-${NPCAP_VERSION}-oem.exe"
|
|
SectionEnd
|
|
!else
|
|
Section "Npcap ${NPCAP_VERSION}" SecNpcap
|
|
SetOutPath "$PLUGINSDIR"
|
|
SetOverwrite on
|
|
File "..\npcap-${NPCAP_VERSION}.exe"
|
|
ExecWait '"$PLUGINSDIR\npcap-${NPCAP_VERSION}.exe" /loopback_support=no'
|
|
SectionEnd
|
|
!endif
|
|
|
|
Section /o "Check online for newer Npcap" SecNewNpcap
|
|
ExecShell "open" "https://npcap.com/#download"
|
|
SectionEnd
|
|
|
|
Section "Network Performance Improvements" SecPerfRegistryMods
|
|
SetOutPath "$PLUGINSDIR"
|
|
SetOverwrite on
|
|
File ${STAGE_DIR}\nmap_performance.reg
|
|
; Apply the changes from the random PLUGINSDIR for better security
|
|
Exec 'regedt32 /S "$PLUGINSDIR\nmap_performance.reg"'
|
|
; Keep a copy in the installation directory for users to inspect
|
|
CopyFiles /SILENT "$PLUGINSDIR\nmap_performance.reg" "$INSTDIR"
|
|
SectionEnd
|
|
|
|
Section "Ncat (Modern Netcat reincarnation)" SecNcat
|
|
SetOutPath "$INSTDIR"
|
|
SetOverwrite on
|
|
!insertmacro SecNcatFiles
|
|
Call vcredistinstaller
|
|
Call create_uninstaller
|
|
SectionEnd
|
|
|
|
Section "Nping (Packet generator)" SecNping
|
|
SetOutPath "$INSTDIR"
|
|
SetOverwrite on
|
|
!insertmacro SecNpingFiles
|
|
Call vcredistinstaller
|
|
Call create_uninstaller
|
|
SectionEnd
|
|
|
|
!ifndef NMAP_OEM
|
|
Section "Zenmap (GUI Frontend)" SecZenmap
|
|
SetOutPath "$INSTDIR"
|
|
SetOverwrite on
|
|
!insertmacro SecZenmapFiles
|
|
WriteINIStr "$INSTDIR\zenmap\share\zenmap\config\zenmap.conf" paths nmap_command_path "$INSTDIR\nmap.exe"
|
|
WriteINIStr "$INSTDIR\zenmap\share\zenmap\config\zenmap.conf" paths ndiff_command_path "$INSTDIR\ndiff.bat"
|
|
!insertmacro writeZenmapShortcut "$INSTDIR\Zenmap.lnk"
|
|
StrCpy $zenmapset "true"
|
|
${If} ${Silent}
|
|
File "/oname=$PLUGINSDIR\shortcuts.ini" "shortcuts.ini"
|
|
Call makeShortcuts
|
|
${EndIf}
|
|
Call create_uninstaller
|
|
SectionEnd
|
|
|
|
Section "Ndiff (Scan comparison tool)" SecNdiff
|
|
SetOutPath "$INSTDIR"
|
|
SetOverwrite on
|
|
!insertmacro SecNdiffFiles
|
|
Call create_uninstaller
|
|
SectionEnd
|
|
!endif
|
|
|
|
# Custom LogicLib test macro
|
|
!macro _VCRedistInstalled _a _b _t _f
|
|
SetRegView 32
|
|
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\VisualStudio\${VCREDISTVER}\VC\Runtimes\${NMAP_ARCH}" "Installed"
|
|
StrCmp $0 "1" `${_t}` `${_f}`
|
|
!macroend
|
|
# add dummy parameters for our test
|
|
!define VCRedistInstalled `"" VCRedistInstalled ""`
|
|
|
|
Function create_uninstaller
|
|
StrCmp $addremoveset "" 0 skipaddremove
|
|
; Register Nmap with add/remove programs
|
|
WriteRegStr HKLM "${NMAP_UNINSTALL_KEY}" "DisplayName" "${NMAP_NAME} ${VERSION}"
|
|
WriteRegStr HKLM "${NMAP_UNINSTALL_KEY}" "DisplayVersion" "${VERSION}"
|
|
WriteRegStr HKLM "${NMAP_UNINSTALL_KEY}" "Publisher" "Nmap Project"
|
|
WriteRegStr HKLM "${NMAP_UNINSTALL_KEY}" "URLInfoAbout" "https://nmap.org/"
|
|
WriteRegStr HKLM "${NMAP_UNINSTALL_KEY}" "URLUpdateInfo" "https://nmap.org/download.html"
|
|
WriteRegStr HKLM "${NMAP_UNINSTALL_KEY}" "UninstallString" '"$INSTDIR\uninstall.exe"'
|
|
WriteRegStr HKLM "${NMAP_UNINSTALL_KEY}" "InstallLocation" $INSTDIR
|
|
WriteRegStr HKLM "${NMAP_UNINSTALL_KEY}" "DisplayIcon" '"$INSTDIR\icon1.ico"'
|
|
WriteRegDWORD HKLM "${NMAP_UNINSTALL_KEY}" "NoModify" 1
|
|
WriteRegDWORD HKLM "${NMAP_UNINSTALL_KEY}" "NoRepair" 1
|
|
;Create uninstaller
|
|
SetOutPath $INSTDIR
|
|
|
|
; this packages the signed uninstaller
|
|
|
|
File "${STAGE_DIR_OEM}\Uninstall.exe"
|
|
StrCpy $addremoveset "true"
|
|
skipaddremove:
|
|
FunctionEnd
|
|
|
|
;Disable a named section if the command line option Opt has the value "NO".
|
|
;See http://nsis.sourceforge.net/Macro_vs_Function for the ID label technique.
|
|
!macro OptionDisableSection Params Opt Sec
|
|
!define ID ${__LINE__}
|
|
${GetOptions} ${Params} ${Opt} $1
|
|
StrCmp $1 "NO" "" OptionDisableSection_keep_${ID}
|
|
SectionGetFlags ${Sec} $2
|
|
IntOp $2 $2 & ${SECTION_OFF}
|
|
SectionSetFlags ${Sec} $2
|
|
OptionDisableSection_keep_${ID}:
|
|
!undef ID
|
|
!macroend
|
|
|
|
Function _GetFileVersionProductName
|
|
System::Store S ; Stash registers
|
|
Pop $R0 ; file path
|
|
Push "" ; return value (bad)
|
|
System::Call 'version::GetFileVersionInfoSize(t"$R0", i.r2) i.r0'
|
|
${If} $0 <> 0
|
|
System::Alloc $0 ; Alloc buffer to top of stack
|
|
; Arg 4 pops the buffer off stack and puts it in $1. Pushes return of GetLastError
|
|
System::Call 'version::GetFileVersionInfo(t"$R0", ir2, ir0, isr1) i.r0 ? e'
|
|
Pop $2 ; GetLastError
|
|
${If} $2 == 0
|
|
${AndIf} $0 <> 0
|
|
; 0409 = English; 04b0 = Unicode
|
|
System::Call 'version::VerQueryValue(ir1, t"\StringFileInfo\040904b0\ProductName", *i0r2, *i0r3) i.r0'
|
|
${If} $0 <> 0
|
|
Pop $0 ; Take the "" off the stack
|
|
; Push the Unicode string at r2 of length r3
|
|
System::Call '*$2(&t$3.r0)'
|
|
Push $0
|
|
${EndIf}
|
|
${EndIf}
|
|
System::Free $1
|
|
${EndIf}
|
|
System::Store L ; Restore registers
|
|
FunctionEnd
|
|
!macro GetFileVersionProductName _file _outvar
|
|
Push ${_file}
|
|
Call _GetFileVersionProductName
|
|
Pop ${_outvar}
|
|
!macroend
|
|
!define GetFileVersionProductName "!insertmacro GetFileVersionProductName"
|
|
|
|
!macro stripQuotes string
|
|
Push $R0
|
|
; Strip double quotes
|
|
StrCpy $R0 ${string} 1
|
|
${If} $R0 == "$\""
|
|
StrLen $R0 ${string}
|
|
IntOp $R0 $R0 - 1
|
|
StrCpy $R0 ${string} 1 $R0
|
|
${If} $R0 == "$\""
|
|
StrCpy ${string} ${string} -1 1
|
|
${EndIf}
|
|
${EndIf}
|
|
Pop $R0
|
|
!macroend
|
|
|
|
Function RunUninstaller
|
|
System::Store S ; stash registers
|
|
Pop $2 ; old instdir
|
|
Pop $1 ; params
|
|
Pop $0 ; Uninstaller
|
|
!insertmacro stripQuotes $0
|
|
!insertmacro stripQuotes $2
|
|
|
|
; Try to run and delete, but ignore errors.
|
|
ExecWait '"$0" $1 _?=$2'
|
|
Delete $0
|
|
RmDir $2
|
|
System::Store L ; restore registers
|
|
FunctionEnd
|
|
|
|
; GH#2982: Nmap 7.95 OEM installer uses "Nmap" for NMAP_NAME, not "Nmap OEM"
|
|
; We have to look for this specific problem and correct it.
|
|
Function RepairBug2982
|
|
System::Store S ; stash registers
|
|
; See what's installed as "Nmap"
|
|
ReadRegStr $0 HKLM "${REG_UNINSTALL_KEY}\Nmap" "UninstallString"
|
|
; Nothing? Done.
|
|
StrCmp $0 "" repair_2982_done
|
|
Push $0 ; UninstallString
|
|
; Check product name on the uninstaller
|
|
!insertmacro stripQuotes $0
|
|
${GetFileVersionProductName} $0 $3
|
|
Push $3 ; ProductName
|
|
; If it's not "Nmap OEM" it's not a buggy install
|
|
StrCmp $3 "Nmap OEM" 0 repair_2982_done
|
|
; Ok, it's a screwed-up install. We need to fix it up first.
|
|
; Finish getting the old install info
|
|
ReadRegStr $2 HKLM "${REG_UNINSTALL_KEY}\Nmap" "DisplayVersion"
|
|
${GetParent} $0 $1 ; Get InstallLocation from the path to Uninstall.exe
|
|
; Rename the old install reg keys
|
|
; winreg.h: #define HKEY_LOCAL_MACHINE (( HKEY ) (ULONG_PTR)((LONG)0x80000002) )
|
|
System::Call 'advapi32::RegRenameKey(p0x80000002, t"${REG_UNINSTALL_KEY}\Nmap", t"Nmap OEM") i.r3'
|
|
${If} $3 <> 0
|
|
; Failed to rename!
|
|
goto repair_2982_done
|
|
${EndIf}
|
|
; Change appropriate entries
|
|
WriteRegStr HKLM "${REG_UNINSTALL_KEY}\Nmap OEM" "DisplayName" "Nmap OEM $2"
|
|
WriteRegStr HKLM "${REG_UNINSTALL_KEY}\Nmap OEM" "InstallLocation" $1
|
|
|
|
; winreg.h: #define HKEY_CURRENT_USER (( HKEY ) (ULONG_PTR)((LONG)0x80000001) )
|
|
System::Call 'advapi32::RegRenameKey(p0x80000001, t"SOFTWARE\Nmap", t"Nmap OEM") i.r3'
|
|
${If} $3 <> 0
|
|
; Failed to rename!
|
|
goto repair_2982_done
|
|
${EndIf}
|
|
|
|
repair_2982_done:
|
|
System::Store L ; restore registers
|
|
FunctionEnd
|
|
|
|
Function _TryUninstall
|
|
System::Store S ; stash registers
|
|
Pop $3 ; ProductName
|
|
Pop $2 ; Old version
|
|
Pop $1 ; Uninstall dir
|
|
Pop $0 ; Uninstaller path
|
|
${If} ${Silent}
|
|
StrCpy $5 $3 4
|
|
${If} $5 != "Nmap"
|
|
; In silent mode, abort the install
|
|
; if INSTDIR contains an uninstaller that's not Nmap.
|
|
Abort
|
|
${EndIf}
|
|
${Else}
|
|
${If} $2 == "UNKNOWN"
|
|
${GetFileVersion} $0 $2
|
|
${EndIf}
|
|
MessageBox MB_YESNOCANCEL|MB_ICONQUESTION \
|
|
'$3 $2 is already installed in "$1". $\n$\nWould you like to uninstall it first?' \
|
|
/SD IDYES IDYES tryuninstall_go IDNO tryuninstall_end
|
|
Abort
|
|
${EndIf}
|
|
tryuninstall_go:
|
|
Push $0 ; Uninstaller
|
|
Push "/S" ; Params
|
|
Push $1 ; Old instdir
|
|
Call RunUninstaller
|
|
|
|
tryuninstall_end:
|
|
System::Store L ; restore registers
|
|
FunctionEnd
|
|
; If _version is "", we use the uninstaller's file version, which is X.X.X.X
|
|
; so for Nmap itself, use the DisplayVersion if known.
|
|
!macro TryUninstall _uninstaller _uninstdir _version _productname
|
|
Push ${_uninstaller}
|
|
Push ${_uninstdir}
|
|
Push ${_version}
|
|
Push ${_productname}
|
|
Call _TryUninstall
|
|
!macroend
|
|
|
|
Function .onInit
|
|
${GetParameters} $R0
|
|
; Make /S (silent install) case-insensitive
|
|
${GetOptions} $R0 "/s" $R1
|
|
${IfNot} ${Errors}
|
|
SetSilent silent
|
|
${EndIf}
|
|
!ifndef NMAP_OEM
|
|
; shortcuts apply only to Zenmap, not included in NMAP_OEM
|
|
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "shortcuts.ini"
|
|
!endif
|
|
|
|
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "final.ini"
|
|
|
|
; Check if Npcap is already installed.
|
|
ReadRegStr $0 HKLM "${REG_UNINSTALL_KEY}\NpcapInst" "DisplayVersion"
|
|
${If} $0 != ""
|
|
${VersionCompare} $0 ${NPCAP_VERSION} $1
|
|
; If our version is not newer than the installed version, don't offer to install Npcap.
|
|
${If} $1 != 2
|
|
SectionGetFlags ${SecNpcap} $2
|
|
IntOp $2 $2 & ${SECTION_OFF}
|
|
SectionSetFlags ${SecNpcap} $2
|
|
${EndIf}
|
|
!ifndef NMAP_OEM
|
|
; If Npcap is not installed, Nmap can't be installed silently.
|
|
${ElseIf} ${Silent}
|
|
SetSilent normal
|
|
MessageBox MB_OK|MB_ICONEXCLAMATION "Silent installation of Nmap requires the Npcap packet capturing software. See https://nmap.org/nmap-silent-install"
|
|
Quit
|
|
!endif
|
|
${EndIf}
|
|
|
|
;Disable section checkboxes based on options. For example /ZENMAP=NO to avoid
|
|
;installing Zenmap.
|
|
!insertmacro OptionDisableSection $R0 "/NMAP=" ${SecCore}
|
|
!insertmacro OptionDisableSection $R0 "/REGISTERPATH=" ${SecRegisterPath}
|
|
!insertmacro OptionDisableSection $R0 "/NPCAP=" ${SecNpcap}
|
|
!insertmacro OptionDisableSection $R0 "/REGISTRYMODS=" ${SecPerfRegistryMods}
|
|
!ifndef NMAP_OEM
|
|
!insertmacro OptionDisableSection $R0 "/ZENMAP=" ${SecZenmap}
|
|
!insertmacro OptionDisableSection $R0 "/NDIFF=" ${SecNdiff}
|
|
!endif
|
|
!insertmacro OptionDisableSection $R0 "/NCAT=" ${SecNcat}
|
|
!insertmacro OptionDisableSection $R0 "/NPING=" ${SecNping}
|
|
|
|
Call RepairBug2982
|
|
ClearErrors
|
|
Pop $3 ; ProductName?
|
|
Pop $0 ; UninstallString?
|
|
${If} ${Errors}
|
|
${OrIf} $3 != "${NMAP_NAME}"
|
|
; RepairBug2982 did not get info, so we get it here instead
|
|
; $0 = old uninstall.exe path
|
|
ReadRegStr $1 HKLM "${NMAP_UNINSTALL_KEY}" "UninstallString"
|
|
; If it's the same as what RepairBug2982 got, then $3 is valid, too.
|
|
${If} $1 != $0
|
|
StrCpy $0 $1
|
|
; $3 is obviously not valid
|
|
StrCpy $3 ""
|
|
${EndIf}
|
|
${EndIf}
|
|
|
|
; If no uninstall key was found, assume it's a new install
|
|
StrCmp $0 "" set_instdir
|
|
|
|
!insertmacro stripQuotes $0
|
|
; $1 = old instdir
|
|
; We want to use this location going forward:
|
|
ReadRegStr $1 HKLM "${NMAP_UNINSTALL_KEY}" "InstallLocation"
|
|
StrCmp $1 "" 0 get_old_version
|
|
; But old installers used this location instead:
|
|
ReadRegStr $1 HKCU "Software\${NMAP_NAME}" ""
|
|
StrCmp $1 "" 0 get_old_version
|
|
; Last chance, parent dir of uninstaller
|
|
${GetParent} $0 $1
|
|
|
|
get_old_version:
|
|
; $2 = old version
|
|
ReadRegStr $2 HKLM "${NMAP_UNINSTALL_KEY}" "DisplayVersion"
|
|
|
|
${If} $3 == ""
|
|
${GetFileVersionProductName} $0 $3
|
|
${EndIf}
|
|
!insertmacro TryUninstall $0 $1 $2 $3
|
|
|
|
set_instdir:
|
|
; If it's already set, user specified with /D=
|
|
StrCmp $INSTDIR "" 0 done
|
|
; If we got the old instdir from the registry, use that.
|
|
${If} $1 != ""
|
|
StrCpy $INSTDIR $1
|
|
${Else}
|
|
; Default InstallDir set here
|
|
StrCpy $INSTDIR "$PROGRAMFILES\${NMAP_NAME}"
|
|
${EndIf}
|
|
|
|
done:
|
|
; If we didn't already try to uninstall, check to see if there's something in
|
|
; $INSTDIR that needs to be uninstalled.
|
|
${If} $INSTDIR != $1
|
|
${AndIf} ${FileExists} "$INSTDIR\Uninstall.exe"
|
|
${If} $3 == ""
|
|
${GetFileVersionProductName} $INSTDIR\Uninstall.exe $3
|
|
${EndIf}
|
|
!insertmacro TryUninstall "$INSTDIR\Uninstall.exe" $INSTDIR "UNKNOWN" $3
|
|
${EndIf}
|
|
|
|
FunctionEnd
|
|
|
|
;--------------------------------
|
|
;Descriptions
|
|
|
|
;Component strings
|
|
LangString DESC_SecCore ${LANG_ENGLISH} "Installs Nmap executable, NSE scripts and Visual C++ ${VCREDISTYEAR} runtime components"
|
|
LangString DESC_SecRegisterPath ${LANG_ENGLISH} "Registers Nmap path to System path so you can execute it from any directory"
|
|
LangString DESC_SecNpcap ${LANG_ENGLISH} "Installs Npcap ${NPCAP_VERSION} (required for most Nmap scans unless it is already installed)"
|
|
LangString DESC_SecNewNpcap ${LANG_ENGLISH} "Opens npcap.com in your web browser so you can check for a newer version of Npcap."
|
|
LangString DESC_SecPerfRegistryMods ${LANG_ENGLISH} "Modifies Windows registry values to improve TCP connect scan performance. Recommended."
|
|
!ifndef NMAP_OEM
|
|
LangString DESC_SecZenmap ${LANG_ENGLISH} "Installs Zenmap, the official Nmap graphical user interface. Recommended."
|
|
LangString DESC_SecNdiff ${LANG_ENGLISH} "Installs Ndiff, a tool for comparing Nmap XML files."
|
|
!endif
|
|
LangString DESC_SecNcat ${LANG_ENGLISH} "Installs Ncat, Nmap's Netcat replacement."
|
|
LangString DESC_SecNping ${LANG_ENGLISH} "Installs Nping, a packet generation tool."
|
|
|
|
;Assign language strings to sections
|
|
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecCore} $(DESC_SecCore)
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecNpcap} $(DESC_SecNpcap)
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecNewNpcap} $(DESC_SecNewNpcap)
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecRegisterPath} $(DESC_SecRegisterPath)
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecPerfRegistryMods} $(DESC_SecPerfRegistryMods)
|
|
!ifndef NMAP_OEM
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecZenmap} $(DESC_SecZenmap)
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecNdiff} $(DESC_SecNdiff)
|
|
!endif
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecNcat} $(DESC_SecNcat)
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SecNping} $(DESC_SecNping)
|
|
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
|
|
|
; Keep this at the end: vcredist is big and not needed in many cases, so we can
|
|
; speed install up by not extracting it.
|
|
Function vcredistinstaller
|
|
${If} $vcredistset != ""
|
|
Return
|
|
${EndIf}
|
|
StrCpy $vcredistset "true"
|
|
;Check if VC++ runtimes are already installed.
|
|
;This version creates a registry key that makes it easy to check whether a version (not necessarily the
|
|
;one we may be about to install) of the VC++ redistributables have been installed.
|
|
;Only run our installer if a version isn't already present, to prevent installing older versions resulting in error messages.
|
|
;If VC++ runtimes are not installed...
|
|
${IfNot} ${VCRedistInstalled}
|
|
DetailPrint "Installing Microsoft Visual C++ ${VCREDISTYEAR} Redistributable"
|
|
SetOutPath $PLUGINSDIR
|
|
File ..\${VCREDISTEXE}
|
|
ExecWait '"$PLUGINSDIR\${VCREDISTEXE}" /quiet' $0
|
|
;Check for successful installation of our package...
|
|
Delete "$PLUGINSDIR\${VCREDISTEXE}"
|
|
|
|
${IfNot} ${VCRedistInstalled}
|
|
DetailPrint "Microsoft Visual C++ ${VCREDISTYEAR} Redistributable failed to install"
|
|
MessageBox MB_OK "Microsoft Visual C++ ${VCREDISTYEAR} Redistributable Package (${NMAP_ARCH}) failed to install. Please ensure your system meets the minimum requirements before running the installer again."
|
|
${Else}
|
|
DetailPrint "Microsoft Visual C++ ${VCREDISTYEAR} Redistributable was successfully installed"
|
|
${EndIf}
|
|
${EndIf}
|
|
FunctionEnd
|
|
|
|
;--------------------------------
|
|
;Uninstaller Section
|
|
|
|
!else ;INNER
|
|
Function .onInit
|
|
; If INNER is defined, then we aren't supposed to do anything except write out
|
|
; the installer. This is better than processing a command line option as it means
|
|
; this entire code path is not present in the final (real) installer.
|
|
|
|
${GetParent} "$EXEPATH" $0
|
|
WriteUninstaller "$0\Uninstall.exe"
|
|
Quit ; just bail out quickly when running the "inner" installer
|
|
FunctionEnd
|
|
|
|
!insertmacro SanityCheckInstdir "un."
|
|
|
|
Section "Uninstall"
|
|
|
|
Call un.SanityCheckInstdir
|
|
|
|
IfFileExists $INSTDIR\nmap.exe nmap_installed
|
|
IfFileExists $INSTDIR\zenmap.exe nmap_installed
|
|
IfFileExists $INSTDIR\ncat.exe nmap_installed
|
|
IfFileExists $INSTDIR\nping.exe nmap_installed
|
|
IfFileExists $INSTDIR\ndiff.exe nmap_installed
|
|
MessageBox MB_YESNO "It does not appear that ${NMAP_NAME} is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?" IDYES nmap_installed
|
|
Abort "Uninstall aborted by user"
|
|
|
|
SetDetailsPrint textonly
|
|
DetailPrint "Uninstalling Files..."
|
|
SetDetailsPrint listonly
|
|
|
|
nmap_installed:
|
|
!insertmacro SecCoreFiles
|
|
!insertmacro SecNcatFiles
|
|
!insertmacro SecNpingFiles
|
|
!ifndef NMAP_OEM
|
|
!insertmacro SecZenmapFiles
|
|
!insertmacro SecNdiffFiles
|
|
!endif
|
|
Delete "$INSTDIR\nmap_performance.reg"
|
|
|
|
Delete "$INSTDIR\Uninstall.exe"
|
|
|
|
;Removes folder if it's now empty
|
|
RMDir "$INSTDIR"
|
|
|
|
SetDetailsPrint textonly
|
|
DetailPrint "Deleting Registry Keys..."
|
|
SetDetailsPrint listonly
|
|
DeleteRegKey HKCU "Software\${NMAP_NAME}"
|
|
DeleteRegKey HKLM "${NMAP_UNINSTALL_KEY}"
|
|
SetDetailsPrint textonly
|
|
DetailPrint "Unregistering Nmap Path..."
|
|
Push $INSTDIR
|
|
Call un.RemoveFromPath
|
|
|
|
Delete "$DESKTOP\${NMAP_NAME} - Zenmap GUI.lnk"
|
|
Delete "$SMPROGRAMS\${NMAP_NAME}\${NMAP_NAME} - Zenmap GUI.lnk"
|
|
RMDIR "$SMPROGRAMS\${NMAP_NAME}"
|
|
|
|
SetDetailsPrint both
|
|
SectionEnd
|
|
!endif
|