Fact-checked by Grok 2 weeks ago

Inno Setup

Inno Setup is a free, open-source installation builder designed for creating software installers for Windows applications, utilizing a script-driven approach based on Pascal scripting to customize installation processes. Developed by Jordan Russell and Martijn Laan, it was first introduced in 1997 and has become a widely trusted tool among developers for its reliability and flexibility in packaging and deploying software. Key features of Inno Setup include support for modern Windows versions such as , 10, and 7 without requiring service packs, as well as compatibility with 64-bit architectures (x64 and Arm64) and multilingual installations, including right-to-left languages. It enables the creation of single executable installer files with built-in uninstall capabilities, customizable setup types like Full or Minimal, and advanced functionalities such as file compression using algorithms like , , and LZMA/LZMA2, alongside registry and editing. The tool maintains a minimal overhead of approximately 1.78 MB, making it efficient for distribution. While Inno Setup is provided under an open-source model, its developers request that commercial users—such as organizations distributing installers for profit—purchase a dedicated license to support project sustainability, though it remains free for personal and non-commercial use. Notably, it has been adopted by prominent software projects, including Visual Studio Code, Git for Windows, and Embarcadero Delphi, highlighting its role in professional development workflows.

History

Development Origins

Inno Setup was developed by Jordan Russell in 1997 as a script-driven installation system for Windows applications, utilizing Embarcadero Delphi as the primary programming language. This choice of Delphi enabled the creation of a compact, efficient executable installer without dependencies on external runtime libraries, aligning with Russell's goal of producing a self-contained tool. The project originated from Russell's experience in software distribution, where he sought to address limitations in existing solutions by emphasizing ease of use and customization through scripting. Martijn Laan joined as a key contributor, with his "My Inno Setup Extensions" incorporated into version 2.0 in June 2003, enhancing the tool's capabilities. The first public release occurred in 1997. By focusing on a lightweight design that generated single executable files with no ongoing fees, Inno Setup prioritized simplicity, scriptability, and accessibility for independent developers and small teams. Early adoption of Inno Setup spread primarily through word-of-mouth within programming and communities, where its reliability and lack of licensing restrictions made it a preferred choice for applications. Developers began incorporating it into their distributions, further amplifying its visibility without formal marketing efforts. This grassroots growth laid the foundation for its evolution into an open-source project, though detailed advancements in later versions are covered elsewhere.

Major Releases and Milestones

Significant technical milestones followed in the mid-2000s. Version 5.1, released on May 31, 2005, introduced support for installing 64-bit applications on 64-bit Windows systems. Later, version 5.3.0-beta, released on April 22, 2009, added support, enabling better handling of international languages and characters across different system code pages. In the 2010s, Inno Setup transitioned to full open-source availability, with its hosted on since October 2013, allowing community contributions alongside primary development by Jordan Russell and Martijn Laan. Version 6.0, first released in beta on February 11, 2019, brought enhancements to the integrated Compiler IDE, including per-monitor DPI awareness, support for the Segoe UI font, and improved output views for better usability on modern displays. Recent updates have continued to expand capabilities. Version 6.5.0, released on August 12, 2025, increased the maximum size limit for a single Setup.exe file to 4 GB, aligning with Windows' upper limits and accommodating larger installations. Version 6.6.0, released on November 11, 2025, introduced support for dark mode and dynamic theme adaptation in Setup and Uninstall interfaces, along with custom styles for enhanced visual consistency. Ongoing development remains led by Russell and Laan, with community input facilitated through pull requests and issues.

Core Features

Installation Capabilities

Inno Setup provides robust mechanisms for deploying applications across diverse Windows environments, enabling seamless installation processes that adapt to system configurations and user needs. Central to its installation capabilities is the ability to create a single executable installer that supports multiple processor architectures, including (32-bit), x64 (64-bit), and ARM64, by detecting the host system's at and installing the appropriate files without requiring separate builds. This multi-architecture support is facilitated through directives in the [Files] section, such as ArchitecturesAllowed and ArchitecturesInstallIn64BitMode, which allow developers to specify architecture-specific installation rules within one unified setup package. A key aspect of Inno Setup's file handling during installation involves automatic version comparison to ensure updates are applied intelligently. By default, the installer compares the version information of existing files against those being installed, replacing them only if the new version is higher, which prevents unnecessary overwrites and maintains system stability. For files that are in use by running processes and cannot be replaced immediately, Inno Setup employs a retry mechanism—up to four attempts—and supports the "restartreplace" flag in the [Files] section to schedule replacements for the next system reboot via Windows' MoveFileEx API, prompting the user for a restart if necessary. This approach minimizes disruptions while ensuring complete file updates. The tool integrates comprehensive uninstaller creation as a standard feature, generating a dedicated (unins000.exe) that handles full cleanup of installed files, directories, registry entries, and shortcuts based on the original installation log. The Uninstallable directive in the [Setup] controls this , ensuring the is included and registered in the Windows Add/Remove Programs control panel, where it performs reverse operations like deleting files listed in [UninstallDelete] and running specified programs in [UninstallRun] to restore the system state accurately. This built-in support for thorough uninstallation promotes reliable software management without residual artifacts. Inno Setup addresses prerequisite dependencies through integrated checks and execution capabilities, allowing installers to verify and install required runtimes such as the .NET Framework or Visual C++ redistributables before proceeding. Developers can use Pascal scripting functions like IsDotNetInstalled to detect the presence of specific .NET versions and service packs, and the [Run] section to execute external installers or setup programs if prerequisites are missing, ensuring the target application launches successfully post-installation. This proactive handling prevents common deployment failures on unprepared systems. Localization is a core strength, with multi-language support enabling installers to present user interfaces in the system's preferred language or via a selection dialog at launch. This is achieved through the [Languages] section, which references external .isl (Inno Setup Language) files containing translated strings, dialog captions, and messages; Inno Setup includes pre-built .isl files for over 40 s, and custom ones can be created for additional support, including right-to-left scripts. The language selection occurs automatically based on system locale or choice, making installations accessible globally without altering the core . To enhance security and user trust, Inno Setup incorporates digital signing integration directly into the compilation process, allowing executables and uninstallers to be signed with certificates using tools like . The SignTool directive in the [Setup] section specifies the signing command, which applies to the setup executable, embedded files, and the generated uninstaller when SignedUninstaller is enabled, thereby avoiding "unknown publisher" warnings in Windows SmartScreen and UAC prompts. This feature ensures compliance with modern Windows security standards and streamlines distribution.

Compression and Packaging

Inno Setup provides built-in compression options to optimize the size of installation files while balancing against processing time. The supported algorithms include , , and 7-Zip's LZMA and LZMA2, with configurable compression levels that allow developers to trade off between file size reduction and compression/decompression speed. For instance, and support levels from 0 (no compression, fastest) to 9 (maximum compression, slowest), while LZMA/LZMA2 offer fast and ultra modes for similar adjustments, enabling smaller installers for faster downloads at the potential cost of longer build times. A key feature is the generation of a single (Setup.exe) file that bundles all installation components, facilitating straightforward online distribution without requiring multiple files or archives. This single-EXE format supports installations up to 4 GB in size starting from version 6.5. To further enhance efficiency when packaging multiple files, Inno Setup includes , which treats all files as a single continuous during rather than compressing them individually. This approach can achieve significantly higher overall compression ratios than non-solid methods by exploiting redundancies across files, though it increases memory usage during extraction and may slow down access to individual files. For security in distribution, Inno Setup supports password protection, where a is prompted at the start of the installation process, preventing unauthorized users from proceeding without it. This feature integrates with to safeguard contents, ensuring that the installer cannot be run or files extracted without the correct password. Additionally, of setup files is available to protect and sensitive data during transit. When enabled via the Encryption directive, files compiled into the installation are secured using the XChaCha20 symmetric algorithm, with the key derived from the provided password through functions like for added strength against brute-force attacks. The can apply to specific files or the entire , requiring the password via command-line parameter for full-encrypted setups.

Scripting and Customization

Pascal Scripting Engine

The Pascal Scripting Engine in Inno Setup provides a powerful mechanism for runtime customization of installation and uninstallation processes through a subset of the Pascal programming language, resembling modern Delphi syntax. This engine allows developers to embed executable code directly within installer scripts (.iss files) via the optional [Code] section, enabling dynamic behaviors such as conditional logic, user input validation, and system interactions that go beyond static configuration. The scripting is event-driven, where predefined functions are invoked at specific points during the installation workflow, and it supports standard Pascal constructs like variables, procedures, loops, and conditionals to handle complex scenarios. Central to the engine is the [Code] section, which contains the Pascal script code executed by Inno Setup's integrated . Scripts here can perform pre-installation checks, modify installation parameters based on conditions, or execute post-install actions like launching applications. For instance, the engine supports declaring and variables with standard scoping rules: variables are accessible throughout , while ones are confined to their or , following Pascal's block-structured scoping to prevent unintended side effects. Procedures and functions can be defined to encapsulate reusable logic, and is available via try-except blocks, allowing graceful error recovery with functions like RaiseException to throw custom errors and GetExceptionMessage to retrieve details. Key event functions drive the customization, triggered automatically by the installer at predefined stages. The InitializeSetup event function, declared as function InitializeSetup(): Boolean;, runs early in the process for tasks like verifying prerequisites or reading command-line parameters; returning False aborts the installation, while True proceeds. CurStepChanged, prototyped as procedure CurStepChanged(CurStep: TSetupStep);, executes when the installation advances through steps (e.g., pre-install, install, post-install), ideal for step-specific actions such as progress or adjusting permissions. ShouldSkipPage, as function ShouldSkipPage(PageID: Integer): Boolean;, enables conditional skipping of pages based on user choices or system state, enhancing flexibility without altering the core structure. These events, along with others like DeinitializeSetup for cleanup, form the backbone of runtime adaptability. The engine includes a rich set of built-in support s for common operations, categorized by file handling, registry access, and external integrations. For file operations, CopyFile ([function](/page/Function) CopyFile(const ExistingFile, NewFile: [String](/page/String); FailIfExists: Boolean): Boolean;) allows scripted file copying with options to overwrite or fail on conflicts, useful for dynamic deployments. Registry manipulation is handled by functions like RegWriteStringValue ([function](/page/Function) RegWriteStringValue(RootKey: [Integer](/page/Integer); SubKey, ValueName, Value: [String](/page/String)): Boolean;), which writes string values to the , enabling configuration persistence. External DLL calls are supported via LoadDLL to load libraries; to call functions dynamically, declare them with the 'external' keyword using the DLL handle, such as [function](/page/Function) SomeFunction(Param: [String](/page/String)): [Integer](/page/Integer); external 'dllhandle@SomeFunction;1';. This facilitates integration with Win32 APIs or custom modules extracted during . Example usage might look like:
var
  DllHandle: LongInt;
begin
  DllHandle := LoadDLL('example.dll');
  if DllHandle <> 0 then
  begin
    try
      SomeFunction('param');
    finally
      UnloadDLL(DllHandle);
    end;
  end;
end;
This extends the script's capabilities to system-level interactions. Finally, the Pascal Scripting Engine integrates seamlessly with Inno Setup's (ISPP), allowing conditional compilation in .iss files using directives like #if, #elif, #else, and #endif. These evaluate expressions at to include or exclude script sections based on defined constants (e.g., #define DEBUG), such as #if DEBUG then #include "debug_code.iss" #endif, which can conditionally embed debugging procedures or variant logic without overhead. This combination supports both compile-time flexibility and runtime dynamism, making the engine versatile for diverse deployment needs.

User Interface Customization

Inno Setup offers extensive options for tailoring the wizard interface, allowing developers to modify standard pages, integrate custom elements, and adapt the visual style to enhance during installation. The follows a sequential page-based structure, where each page handles specific user interactions, and customization is achieved primarily through the [Setup] section directives, Pascal scripting, and resource files. This flexibility enables branding, conditional page skipping, and dynamic content display without altering the core installer logic. Standard wizard pages include the page, which introduces the ; the License Agreement page, displayed if a LicenseFile is specified in the script; the page, shown when is enabled via the Password directive; and the Select Components page, which allows users to choose installation options defined in the [Components] section. These pages can be disabled or modified using directives such as DisableWelcomePage, DisableLicensePage, and DisablePasswordPage, or through Pascal scripting event functions like ShouldSkipPage to conditionally bypass them based on user input or system conditions. For instance, the Select Components page supports hierarchical component trees and descriptions for user-friendly selection. Additionally, pages like Select Destination Location and Select Start Menu Folder permit directory and folder customization, with options to set defaults via DefaultDirName and DefaultGroupName. Custom wizard pages can be added or fully designed using the Pascal scripting engine, extending the standard flow with tailored interactions. The CreateCustomPage function initializes an empty page, onto which developers add controls like labels, edit boxes, or radio buttons using methods such as CreateStaticText for labels and CreateComboBox for combo boxes; pre-built pages are available via functions like CreateInputQueryPage for simple queries, CreateDirTreePage for folder selection, or CreateInputSelectListPage for list-based inputs. Custom dialogs are supported through functions such as MsgBox, which displays modal message boxes with configurable icons, buttons, and text, and TaskDialogMsgBox for modern Windows task dialogs with instructions and expandable details. These elements allow for dynamic user interactions, such as validation or confirmation prompts, integrated seamlessly into the wizard flow. A brief reference to scripting events, like NextButtonClick, enables triggering changes or validations during page transitions. Theme support enhances visual customization, with the WizardStyle directive offering styles such as classic (gray background), modern (white background), and advanced modes including light, dark, dynamic (system-adaptive), polar (blue accents), slate (gray), windows11 (matching Windows 11 aesthetics), and zircon (cyan accents) as of version 6.6.0 (November 2025). Version 6.6.0 introduced full dark mode support for both Setup and Uninstall, along with new directives like WizardStyleFileDynamicDark for custom dark themes and direct support for built-in custom styles in WizardStyle. It also added automatic adaptation to Windows settings in dynamic mode, with high DPI scaling through per-monitor awareness and directives like WizardResizable, ensuring proper layout and font scaling on high-resolution displays without aspect ratio distortion. Custom styles are ignored in high-contrast themes to maintain accessibility. Icon and bitmap integration allows branding the installer UI with custom graphics. The SetupIconFile directive specifies a .ico file or executable for the main Setup and Uninstall window icon, replacing the default built-in icon. Side images are customized via WizardImageFile, which supports .bmp and .png formats (including transparency with WizardImageAlphaFormat) for the large left-panel bitmap, sized to 164x314 pixels by default; WizardSmallImageFile handles the smaller top-panel image (80x70 pixels), also supporting transparency and custom backgrounds via WizardImageBackColor or WizardSmallImageBackColor. These elements ensure a cohesive, professional appearance tailored to the application's branding. Progress bar and status messages during installation provide real-time feedback, customizable through scripting for advanced scenarios. The standard Installing page features a determinate that updates based on file sizes and operations, with status text reflecting current actions like file extraction or registry changes. For more control, the CreateOutputProgressPage function generates a custom wizard page with a and , updated via SetText and SetProgress methods during scripted operations; alternatively, CreateOutputMarqueeProgressPage offers an indeterminate marquee-style bar for ongoing tasks without known duration. functions like CurInstallProgressChanged allow monitoring and adjusting in , ensuring users receive clear, branded feedback throughout the process.

Usage and Tools

Creating Installers

Inno Setup installers are authored using script files with the .iss extension, which are plain text files encoded in ASCII or Unicode (UTF-8) that resemble the structure of Windows .INI files. These scripts define the entire installation process through a series of named sections, each containing key-value pairs or entries that specify parameters, files, and actions. The [Setup] section is foundational, containing directives that configure global installation settings such as the application's name, version, publisher, and output directory for the compiled installer. For instance, directives like AppName, AppVersion, and DefaultDir determine basic metadata and the target installation path. Subsequent sections build on this: the [Files] section lists source files to copy to the destination, using parameters like Source for the input path (supporting wildcards) and DestDir for the output location; the [Icons] section creates shortcuts in locations like the Start Menu or desktop, with entries specifying the icon file, target executable, and working directory; and the [Registry] section manages Windows Registry modifications, defining keys and values to add, set, or delete during installation, with options to control uninstall behavior. Other common sections include [Components] for grouping optional features, [Tasks] for user-selectable actions, and [Run] for post-installation executions. To compile a .iss script into an executable installer, users employ the Inno Setup Compiler, available as a command-line tool (ISCC.exe) or through the graphical interface provided in the installation package. The command-line usage is straightforward: running ISCC.exe followed by the script filename, such as ISCC.exe MySetup.iss, processes the script and outputs a single Setup.exe file, with options for output directory (/O), or controls. The compiler outputs progress messages to the console. Since version 6.0, the graphical compiler includes an (IDE) with , error checking, and a built-in editor for authoring and compiling scripts directly, streamlining the development workflow. Components, tasks, and run lists enable modular and customizable installations. The [Components] section defines hierarchical optional elements displayed on the wizard's Select Components page, using parameters like Name, Description, and Flags (e.g., fixed or optional) to allow users to select features such as core application files versus add-ons. Similarly, the [Tasks] section specifies additional operations like creating desktop icons or associating file types, presented as check boxes with parameters including Name, Description, and GroupDescription for categorization. The [Run] section, meanwhile, outlines programs or commands to execute after file , such as launching the application or running tools, with parameters like , Parameters, and WorkingDir; entries can be conditional based on components or tasks selected. These features support flexible setups without requiring extensive scripting. Handling dependencies, such as required runtimes or external software, is managed through directives in sections like [Files], where BeforeInstall parameters can invoke prerequisite installers before main files are copied, or via the InitializeSetup event function for custom logic. For example, an entry in [Files] might execute an external or .exe for a framework like .NET, with options to wait for completion or run minimized. More complex prerequisite detection and installation often integrates with the Pascal scripting engine for custom logic. Testing installers involves compiling the script and running the resulting with command-line s for automated . The /SILENT suppresses the while showing a progress bar, allowing interactive but minimized testing, whereas /VERYSILENT runs the completely unattended without any , ideal for scripted deployments or batch validation; both modes log output to a file if /LOG is specified, facilitating error diagnosis.

Third-Party Extensions

Third-party extensions for Inno Setup provide additional functionality beyond the core , enabling developers to streamline creation, automate , and integrate advanced features through external tools and s. These add-ons, often developed by the community and hosted on platforms like , enhance productivity by offering graphical interfaces, visual designers, and modular components that extend the installer’s capabilities without modifying the base software. ISTool serves as a graphical script editor designed specifically for Inno Setup, featuring for easier code navigation and template support to import configurations from other installer formats like Visual Basic .lst or .iwz files. It includes drag-and-drop functionality for adding files directly from Windows Explorer and preserves original script comments during editing, supporting all Inno Setup directives across multiple languages. Released in versions compatible with Inno Setup 5.3 and later, ISTool simplifies the creation of complex setup scripts for professional installations. Inno Script Studio functions as an IDE-like that allows visual design of installer pages and components, reducing the need for manual scripting by providing a structured graphical . Developers can define installation elements intuitively without deep knowledge of the Pascal-based , facilitating the generation and of .iss files for Windows applications. This free , available via donation-supported downloads, integrates seamlessly with the Inno Setup to produce customized . The Inno Setup Dependency Installer automates the detection, download, and installation of required runtimes such as .NET Framework, Visual C++ Redistributables, or during the setup process, ensuring application compatibility without user intervention. This extension uses Inno Setup scripts and Pascal code to handle dependencies dynamically, supporting both 32-bit and 64-bit architectures. Hosted on , it is widely adopted for simplifying deployments of software with external prerequisites. Other notable extensions include community-driven collections like the Inno Setup Extensions (ISX) repository, which offers additional components for tasks such as enhanced file handling and modifications. Community scripts, often shared on and forums, address specific needs like web-based updates by checking for new versions online and prompting downloads during installation. For instance, scripts can integrate HTTP requests to verify application updates against a . Modern integrations include the Inno Setup extension for , offering syntax highlighting, auto-completion, and compilation support within the editor. Integration examples demonstrate how these extensions pair with for of .iss files, allowing collaborative editing and automated builds via GitHub Actions to compile installers directly from repository changes. The official Inno Setup source code, maintained on , further encourages such workflows by providing pre-configured setups.

Licensing

License Terms

Inno Setup is governed by the Inno Setup License, a permissive that grants users the right to use, modify, and redistribute the software for any purpose, including commercial applications, without requiring royalties, runtime fees, or mandatory payments. The license provides perpetual access to any downloaded versions of the software, ensuring long-term usability without expiration or recurring costs. Since its inception, Inno Setup has been open-source, with the full hosted on under the jrsoftware/issrc repository, facilitating community contributions, modifications, and redistribution while preserving the project's collaborative development model. Redistributions in form must retain all existing copyright notices and conditions without alteration, and binary distributions must include the original copyright notices and the jrsoftware.org website address. Attribution requirements under the license are minimal: users must not misrepresent the origin of the software or modified versions, which should be clearly marked as such, but formal acknowledgment in product documentation—such as crediting original author Jordan Russell—is appreciated though not obligatory. The license operates on a voluntary model to support ongoing development, where contributions are encouraged for users seeking to aid the project but remain entirely optional for free use. As of 2025, recent donors qualify for complimentary commercial licenses as a of appreciation.

Commercial Use

In version 6.5.0 of Inno Setup, released on August 12, 2025, the developers introduced an encouragement for commercial users to purchase a one-time perpetual to support ongoing development and access professional . This commercial provides two years of major and minor updates following the purchase, after which users may continue using the version acquired at the time of purchase indefinitely. Pricing follows a single payment model, with options tailored for different scales: a single-user at $150, a team for 2-5 developers at $395, and an enterprise for unlimited users at $1,095; exact costs and ordering details are available on the official order page, which also includes local taxes and a 30-day . Inno Setup remains freely available for all uses, including , with no enforcement of the , though purchases and donations from any users help sustain the project. The initiative aims to ensure long-term sustainability for the project's maintainers, Jordan Russell and Martijn Laan, by funding improvements and maintenance efforts.

Security Considerations

Known Vulnerabilities

Inno Setup, a widely used tool for creating Windows installers, has documented security weaknesses primarily related to its handling of dynamic link libraries (DLLs) and search paths, which can enable local or code execution if exploited. These vulnerabilities stem from the installer's reliance on Windows' DLL loading mechanisms without sufficient safeguards against untrusted paths. A key example is the uncontrolled search path vulnerability identified in all versions of Inno Setup, classified under CWE-427 (Uncontrolled Search Path Element), which allows attackers to manipulate the environment for DLL hijacking by placing malicious libraries in directories searched by the installer. In 2017, CVE-2017-20051 was assigned to a problematic functionality in the Inno Setup installer that exposes it to uncontrolled search path manipulation, potentially leading to the execution of arbitrary code during installation. This issue affects the core extraction and loading processes, where the installer fails to verify the integrity of libraries loaded from non-privileged directories, such as the current or temporary folders. The has a CVSS v3.1 base score of 7.8 (high severity) and is exploitable remotely if users run a crafted installer, though it requires local system access for full impact. Historical analyses have highlighted similar DLL hijacking risks in earlier versions, where Inno Setup extracts components like _ShFolder.dll and temporary subinstallers (e.g., is-*.tmp) to insecure locations such as %TEMP%\is-.tmp, allowing unprivileged users to overwrite these files with malicious DLLs like UXTheme.dll. This enables , as installers often request administrative rights via the "requireAdministrator" manifest, loading rogue libraries from the application's startup directory (e.g., Downloads). Affected versions include those up to Inno Setup 5.5.6 and extend to later releases like 6.x due to persistent search order flaws, as confirmed in security advisories from 2015. These inherent weaknesses, including risks from unsanitized inputs in file operations (aligning with CWE-73: External Control of File Name or Path) and insecure creation (CWE-378: Creation of Temporary File With Insecure Permissions), have facilitated directory traversal (CAPEC-13) and search order hijacking (CAPEC-471) in early versions. Additionally, untrusted search paths contribute to broader code execution risks (CWE-426: Untrusted Search Path). Beyond technical flaws, Inno Setup has been frequently abused in malware campaigns from 2023 to , where attackers embed malicious Pascal scripts within legitimate-looking installers to deliver payloads. A notable instance occurred in July , when cybercriminals used Inno Setup to distribute the stealer, leveraging obfuscated scripts for multi-stage attacks that retrieve and execute next-stage malware like HijackLoader, targeting browser credentials and wallets. This exploitation underscores the risks of via unsanitized scripting inputs (CWE-427), with multiple reported campaigns in alone disguising infostealers as benign software updates.

Best Practices for Secure Installers

When building installers with Inno Setup, implementing robust input validation in Pascal scripts is essential to mitigate risks such as command injection. Developers should use parameterized paths for file operations and sanitize any user-provided inputs—such as directory selections or custom parameters—before incorporating them into script logic, ensuring they conform to expected formats and do not contain executable characters or sequences. This approach prevents malicious inputs from altering script behavior, particularly when combined with functions like Exec or ShellExec that invoke external processes. Digitally signing installers enhances trust and verifies integrity, reducing the likelihood of users encountering warnings about unknown publishers. Configure the SignTool directive in the [Setup] section to integrate with tools like SignTool.exe from the Windows SDK, applying certificates from trusted authorities such as or Sectigo. Additionally, since version 6.5, Inno Setup supports signature verification for downloaded files and extractions, allowing scripts to check digital signatures of dependencies before proceeding with installation to prevent tampering. Always verify certificates against revocation lists during the signing process. Auditing Pascal scripts is a critical step to identify and eliminate potential vulnerabilities in the [Code] section. Avoid constructing commands dynamically from untrusted sources, as this can lead to unintended execution; instead, hardcode or validate parameters explicitly. Thoroughly review uses of high-risk functions like Exec and ShellExec, ensuring their arguments are static or properly escaped to block , and test scripts in isolated environments to detect anomalous behavior. For installers containing sensitive data, enable encryption via the Encryption directive in the [Setup] section, which protects compiled files using the XChaCha20 algorithm since version 6.4, derived with PBKDF2-HMAC-SHA256 for key strengthening. Set Encryption to "yes" for setup files only or "full" for the entire installation, requiring a strong password—at least 12 characters with mixed case, numbers, and symbols—passed via the /PASSWORD command-line parameter to avoid weak key derivation. This ensures data remains confidential even if the installer is intercepted. Maintaining security requires regular updates to the latest Inno Setup version, 6.6.0 as of November 2025, which includes enhancements for installer safety and reliability. Earlier versions addressed specific issues, such as vulnerabilities fixed in 6.0.5, underscoring the importance of upgrading to patch known flaws. Additionally, before distribution, scan installers and dependencies with reputable antivirus tools to detect embedded signatures, and monitor for updates to third-party extensions used in the build process.

References

  1. [1]
    Inno Setup - JrSoftware
    Inno Setup is an open-source installation builder for Windows applications by Jordan Russell and Martijn Laan. Since its introduction in 1997, Inno Setup ...DownloadsDocumentation
  2. [2]
    Wildly Popular Inno Setup Is A Free Installer For Windows Built In ...
    Nov 26, 2020 · Inno Setup is a free installer for Windows that is fast, free, and built in Delphi. Introduced in 1997, Inno Setup is brought you by Jordan Russell and Martijn ...
  3. [3]
    Inno Setup FAQ - JrSoftware
    Inno Setup Frequently Asked Questions. The Inno Setup Frequently Asked Questions contains supplemental information not found in the documentation.
  4. [4]
    jrsoftware/issrc: Inno Setup is an open-source installation ... - GitHub
    Inno Setup is an open-source installation builder for Windows applications by Jordan Russell and Martijn Laan. Since its introduction in 1997, Inno Setup ...<|control11|><|separator|>
  5. [5]
    What is Inno Setup? - DevOpsSchool.com
    Dec 4, 2017 · Inno Setup is an open source script-driven installation system created in Delphi by Jordan Russell. The first version was released in 1997.
  6. [6]
    jrsoftware.org // Jordan Russell's Software
    Welcome to jrsoftware.org, home of the Inno Setup installer! What's New. November 11, 2025 - Inno Setup 6.6.0 released. September 24, 2025 - Inno Setup ...
  7. [7]
    Inno Setup 6.0 Revision History - JrSoftware
    Inno Setup 6 introduces a large number of changes: Administrative vs. non administrative install mode. A number of changes have been made.Missing: enhancements | Show results with:enhancements
  8. [8]
    Inno Setup Downloads - JrSoftware
    To contribute to the Inno Setup source code, see CONTRIBUTING.md on GitHub for more info. Copyright © 1997-2025 Jordan Russell. All rights reserved ...Old Downloads · Non Administrative Install Mode · Third-Party Files · Mailing ListMissing: origins | Show results with:origins
  9. [9]
  10. [10]
    [Files] section - Inno Setup Help
    The supported archive formats, beyond .7z, and the support for password-protected and multi-volume archives, depend on the ArchiveExtraction [Setup] section ...
  11. [11]
    [Setup]: Uninstallable - Inno Setup Help
    Description: This determines if Inno Setup's automatic uninstaller is to be included in the installation. If this is yes or to a scripted boolean expression ...
  12. [12]
    [UninstallDelete] section - Inno Setup Help
    Deleting .INI files created by your application is one common use for this section. The uninstaller processes these entries as the last step of uninstallation.
  13. [13]
    [Run] & [UninstallRun] sections - Inno Setup Help
    The [Run] section executes programs after install, and [UninstallRun] executes programs as the first step of uninstallation. Both are optional.Missing: lightweight royalties
  14. [14]
    Pascal Scripting: IsDotNetInstalled - Inno Setup Help
    Returns True if the .NET Framework with the specified MinVersion and MinServicePack parameters is installed.Missing: prerequisites | Show results with:prerequisites
  15. [15]
    [Languages] section - Inno Setup Help
    Inno Setup supports multilingual installations. The [Languages] section defines the languages to make available to the Setup program.
  16. [16]
    SignTool - Inno Setup Help
    Specifies the name and parameters of the Sign Tool to be used to digitally sign. When Setup has a valid digital signature, users will not see an unidentified ...
  17. [17]
    [Setup]: SignedUninstaller - Inno Setup Help
    The first time you compile a script with SignedUninstaller set to yes, a uniquely-named non-temporary copy of the uninstaller EXE file will be created in the ...
  18. [18]
    Compression - Inno Setup Help
    This specifies the method of compression to use on the files, and optionally the level of compression. Higher levels compress better but take longer doing so.
  19. [19]
    Inno Setup 6 Revision History - JrSoftware
    Inno Setup 6. Revision History. Copyright © 1997-2025 Jordan Russell. All rights reserved. Portions Copyright © 2000-2025 Martijn Laan. All rights reserved.Missing: origins | Show results with:origins
  20. [20]
    SolidCompression - Inno Setup Help
    This causes all files to be compressed at once instead of separately. This can result in a much greater overall compression ratio.Missing: documentation | Show results with:documentation
  21. [21]
    Password - Inno Setup Help
    Specifies a password you want to prompt the user for at the beginning of the installation. When using a password, you might consider setting Encryption to ...
  22. [22]
    [Setup]: Encryption - Inno Setup Help
    If set to full, the entire installation will be encrypted, and the password must be specified using the /PASSWORD= command line parameter. If set to yes or ...
  23. [23]
    [Setup]: EncryptionKeyDerivation - Inno Setup Help
    Description: This specifies the key derivation function to use to derive the encryption key from the value of Password, and optionally its parameters. pbkdf2 is ...Missing: AES | Show results with:AES
  24. [24]
    Pascal Scripting: Introduction - Inno Setup Help
    The Pascal scripting feature (modern Delphi-like Pascal) adds lots of new possibilities to customize your Setup or Uninstall at run-time. Some examples:.
  25. [25]
    Pascal Scripting: Creating the [Code] Section - Inno Setup Help
    The [Code] section is an optional section that specifies a Pascal script. A Pascal script can be used to customize Setup or Uninstall in many ways.Missing: documentation | Show results with:documentation
  26. [26]
    Inno Setup Tips & Tricks - Mirality Systems
    Jul 9, 2006 · function InitializeSetup(): Boolean; begin Result := False; if not Component1IsInstalled() then begin MsgBox('Sorry, no component 1.', mbError, ...
  27. [27]
    Pascal Scripting: RaiseException - Inno Setup Help
    Prototype: procedure RaiseException(const Msg: String);. Description: Raises an exception with the specified message. Example: begin RaiseException ...Missing: scoping | Show results with:scoping
  28. [28]
    Pascal Scripting: Event Functions - Inno Setup Help
    If Setup finds the CheckPassword event function in the Pascal script, it automatically displays the Password page and calls CheckPassword to check passwords.
  29. [29]
    Pascal Scripting: Support Functions Reference - Inno Setup Help
    Here's the list of support functions that can be called from within the Pascal script. Parameter type AnyString means both String and AnsiString can be used.
  30. [30]
    Pascal Scripting: CopyFile - Inno Setup Help
    Prototype: function CopyFile(const ExistingFile, NewFile: String; const FailIfExists: Boolean): Boolean; · Description: Copies ExistingFile to NewFile, ...
  31. [31]
    Pascal Scripting: RegWriteStringValue - Inno Setup Help
    Writes the specified REG_SZ-type registry value. Returns True if successful, False otherwise. Remarks: If the value already exists and is of type REG_EXPAND_SZ,
  32. [32]
    Pascal Scripting: Using DLLs and .NET assemblies - Inno Setup Help
    In order to extract an arbitrary file in a solid-compressed installation, Setup must first decompress all prior files (to a temporary buffer in memory). This ...
  33. [33]
    Inno Setup Preprocessor: #if, #elif, #else, #endif - JrSoftware
    Description. The if, elif, else, and endif conditional directives control in- and exclusion of portions of script. ISPP first evaluates the expressions ...
  34. [34]
    Inno Setup Preprocessor: Introduction - JrSoftware
    The main purpose of Inno Setup Preprocessor (ISPP) is to automate compile-time tasks and avoid repetition in your scripts.
  35. [35]
    [Setup] section - Inno Setup Help
    The [Setup] section contains global settings used by the installer and uninstaller, and certain directives are required for any installation.
  36. [36]
    Wizard Pages - Inno Setup Help
    Below is a list of all the wizard pages Setup may potentially display, and the conditions under which they are displayed. Welcome
  37. [37]
    [Components] section - Inno Setup Help
    This section is optional. It defines all of the components Setup will show on the Select Components page of the wizard for setup type customization.
  38. [38]
    Pascal Scripting: Using Custom Wizard Pages - Inno Setup Help
    The Pascal script allows you to add custom pages to Setup's wizard. This includes pre-built wizard pages for common queries and completely custom wizard pages.
  39. [39]
    Pascal Scripting: CreateCustomPage - Inno Setup Help
    Creates a custom wizard page. The page is empty by default; you have to create your own controls afterward and place them on the page.
  40. [40]
    Pascal Scripting: MsgBox - Inno Setup Help
    Displays a message box. Text specifies the message to display. Typ specifies which icon to display in the message box. Buttons specifies which buttons to ...
  41. [41]
    Pascal Scripting: TaskDialogMsgBox - Inno Setup Help
    Displays a message box using a task dialog: Instruction specifies the instruction to display. Text specifies the message to display.
  42. [42]
    [Setup]: WizardStyle - Inno Setup Help
    Use Anchors and KeepSizeY properties to add full support for WizardResizable and WizardSizePercent to all your custom controls and wizard pages if you have any.
  43. [43]
    Inno Setup 6 Revision History
    Setup now always uses high-quality, system-defined icons instead of custom ones on the Select Destination Location and Preparing to Install wizard pages, and on ...Missing: bitmaps | Show results with:bitmaps
  44. [44]
    [Setup]: WizardResizable - Inno Setup Help
    Use Anchors and KeepSizeY properties to add full support for WizardResizable and WizardSizePercent to all your custom controls, custom wizard pages and ...
  45. [45]
    [Setup]: SetupIconFile - Inno Setup Help
    SetupIconFile specifies a custom icon for Setup/Uninstall. If blank, a built-in icon is used. If not specified, a built-in icon will be used.
  46. [46]
    [Setup]: WizardImageFile - Inno Setup Help
    Use WizardImageBackColor to customize the background color. Even transparent .bmp files are supported, see WizardImageAlphaFormat for more information. The size ...
  47. [47]
    [Setup]: WizardSmallImageFile - Inno Setup Help
    Supports .bmp and .png images, including those with transparency. Use WizardSmallImageBackColor to customize the background color. Even transparent .bmp files ...Missing: UI | Show results with:UI
  48. [48]
    Pascal Scripting: CreateOutputProgressPage - Inno Setup Help
    CreateOutputProgressPage creates a wizard page with static text and a progress bar, displayed programmatically, and must be hidden using Hide method.
  49. [49]
    Pascal Scripting: CreateOutputMarqueeProgressPage - JrSoftware
    The `CreateOutputMarqueeProgressPage` function creates a wizard page with static text and a marquee progress bar. Use `Animate` to animate the progress bar.
  50. [50]
    Creating Installations - Inno Setup Help
    Installations are created using .iss scripts, which control all aspects. After editing, compiling the script creates a ready-to-run setup program.Missing: documentation | Show results with:documentation
  51. [51]
    [Icons] section - Inno Setup Help
    Note: when Setup is running on 64-bit Windows, it will automatically replace {commonpf32}\'s value in the filename with '%ProgramFiles(x86)%\' to work around a ...<|separator|>
  52. [52]
    [Registry] section - Inno Setup Help
    On an installation supporting both 32- and 64-bit architectures, it is possible to avoid the error by adding a Check: IsWin64 parameter, which will cause the ...
  53. [53]
    Command Line Compiler Execution - Inno Setup Help
    You can compile scripts from the command line using the console-mode compiler, ISCC.exe. Command line usage is as follows:
  54. [54]
    [Tasks] section - Inno Setup Help
    It defines all of the user-customizable tasks Setup will perform during installation. These tasks appear as check boxes and radio buttons on the Select ...<|separator|>
  55. [55]
    INNO Setup Command Line Parameters - JrSoftware
    The Setup program accepts optional command line parameters. These can be useful to system administrators, and to other programs calling the Setup program.
  56. [56]
    okhlybov/isx: Inno Setup extensions - GitHub
    Welcome to the Inno Setup installer eXtensions collection. This collection contains scripts which extend the functionality of the Inno Setup installer.
  57. [57]
    ISTool
    Sep 29, 2009 · ISTool helps you create scripts for Jordan Russell's Inno Setup compiler. Inno Setup is a great compiler for very professional looking setups.
  58. [58]
    Inno Script Studio - Kymoto Solutions
    Inno Script Studio is a new intuitive graphical interface for generating and compiling scripts for the award winning Inno Setup compiler from Jordan Russell.Downloads · Features · Screenshots · Release History
  59. [59]
    Inno Setup Dependency Installer - GitHub
    Inno Setup Dependency Installer can download and install any dependency such as .NET, Visual C++ or SQL Server during your application's installation.<|control11|><|separator|>
  60. [60]
    Inno setup: check for new updates - Stack Overflow
    Mar 8, 2014 · 1) If there isn't a new update, don't show any message. 2) And if there is a new update, show a message asking whether you want to download it or not.Creating an installer that will perform an update if an older version is ...using inno setup how to update application with version?More results from stackoverflow.com
  61. [61]
    Inno Setup License - JrSoftware
    1. All redistributions of source code files must retain all copyright notices that are currently in place, and this list of conditions without modification.
  62. [62]
    Inno Setup Commercial Licenses - JrSoftware
    By introducing a commercial license option, we aim to provide a straightforward and familiar way for organizations to contribute to the project's sustainability ...
  63. [63]
    Inno Setup 6.5.0 released - Google Groups
    Aug 12, 2025 · Hi everyone,. Inno Setup 6.5.0 has been released, on which we spent a great amount of time and effort to bring you a wide array of ...
  64. [64]
    Contributors - Inno Setup Help
    Inno Setup was created by Jordan Russell and is currently maintained by Martijn Laan (since 5.4.3, released in 2011). The following is a list of those who ...Missing: maintainers | Show results with:maintainers<|control11|><|separator|>
  65. [65]
    CVE-2017-20051 Detail - NVD
    A vulnerability was found in InnoSetup Installer. It has been declared as problematic. Affected by this vulnerability is an unknown functionality.
  66. [66]
    CVE-2017-20051 : A vulnerability was found in InnoSetup Installer. It ...
    Jun 16, 2022 · CVE-2017-20051 : A vulnerability was found in InnoSetup Installer. It has been declared as problematic. Affected by this vulnerability is an ...
  67. [67]
    Full Disclosure: Executable installers are vulnerable^WEVIL (case 5)
    Dec 8, 2015 · Executable installers are vulnerable^WEVIL (case 5): JRSoft InnoSetup. From: "Stefan Kanthak" <stefan.kanthak () nexgo de>
  68. [68]
    CWE-73: External Control of File Name or Path
    The product allows user input to control or influence paths or file names that are used in filesystem operations.Missing: Inno | Show results with:Inno
  69. [69]
    CWE-378: Creation of Temporary File With Insecure Permissions
    Opening temporary files without appropriate measures or controls can leave the file, its contents and any function that it impacts vulnerable to attack.Missing: Inno Setup 426 427<|separator|>
  70. [70]
    CWE-426: Untrusted Search Path
    CWE-426 and CWE-427 are often misused because they both mention search paths, although CWE-426 is focused on attacker control of the search path itself, while ...Missing: Inno 378
  71. [71]
    CAPEC-471: Search Order Hijacking (Version 3.9)
    An adversary exploits a weakness in an application's specification of external libraries to exploit the functionality of the loader where the process loading ...Missing: Inno 13
  72. [72]
    When Installers Turn Evil: The Pascal Script Behind Inno Setup ...
    Jul 3, 2025 · Inno Setup is abused to disguise malware using Pascal scripting, which embeds the malicious code, and the script uses WMI queries to check for ...
  73. [73]
    Hackers Abuse Legitimate Inno Setup Installer to Deliver Malware
    Jul 4, 2025 · Cybercriminals are increasingly weaponizing legitimate software installer frameworks like Inno Setup to distribute malware.
  74. [74]
    Pascal Scripting: Exec - Inno Setup Help
    Executes the specified executable or batch file, using the same credentials as Setup/Uninstall. The Wait parameter specifies whether the function should return ...Missing: documentation | Show results with:documentation
  75. [75]
    Pascal Scripting: ShellExec - Inno Setup Help
    Description: Opens the specified file or performs another action specified by Verb, using the same credentials as Setup/Uninstall. The filename can be an ...
  76. [76]
    Inno Setup 6.4 released - Google Groups
    Jan 15, 2025 · We're excited to announce the release of Inno Setup 6.4, which brings a substantial array of improvements and new features.<|control11|><|separator|>
  77. [77]
    Inno Setup 6: DLL Hijacking issue - Google Groups
    Recently we have discovered a DLL hijacking issue related to the installer. To reproduce it, it's enough to build an x86 C++ library called `version.dll` and ...Missing: x | Show results with:x