/010Editor-keygen

A keygen for 010Editor

Primary LanguageC++GNU General Public License v3.0GPL-3.0

010Editor-keygen

A keygen for 010Editor

1. How does the key generated?

NOTICE: The content of this section is just my suspection. I cannot guarantee that it is absolutely correct because there is no symbol information in 010Editor.exe to confirm my suspection.

There are 3 types of keys (also called passwords in 010Editor) that can activate 010Editor, which are

Key Type Key Length Format
Evaluation 19 chars xxxx-xxxx-xxxx-xxxx
VersionLicense 19 chars xxxx-xxxx-xxxx-xxxx
TimeLicense 24 chars xxxx-xxxx-xxxx-xxxx-xxxx

The x in Format column represents a hex char and is case-insensitive if a letter.

Before I explain each kind of keys, there are some concepts I should give.

  • Daystamp: We know that timestamp is the number of seconds since 00:00:00 Jan. 1st, 1970. Similarly, daystamp is the number of days since Jan. 1st, 1970. For example, the daystamp of Jan. 2nd, 1970 is 1 and Jun. 23th, 2018 is 17705.

  • Checksum: I'm not sure if it can be called checksum. But I do not have a better word to describe it. Checksum is a 4-bytes-long data and is related with some parameters. You can go to the definition of function _010Editor::Keygen<_010Editor::KeyType::Base>::CalculateChecksum in _010EditorKeygen.hpp to see how to calculate it. The function CalculateChecksum receives 4 parameters. There are

    Parameter Description
    utf8_username The UTF-8 bytes of username that the key licensed to.
    IsRegistrationVersion false for Evaluation key only. Otherwise it must be true.
    a3 An unknown parameter. So far it has an unclear meaning.
    LicenseCount It represents how many users can use this license. Must be 1~1000.
  • EncodedExpireDaystamp: This is a 3-bytes-long data. The function _010Editor::Keygen<_010Editor::KeyType::Base>::EncodeExpireDate in _010EditorKeygen.hpp can calulate it. This function receives 2 parameters. There are

    Parameter Description
    DaystampOfExpiration The daystamp of expiration. Must be less than 0x1000000.
    Seed A parameter used in encoding expire daystamp.
  • EncodedLicenseCount: This is a 2-bytes-long data. The function _010Editor::Keygen<_010Editor::KeyType::Base>::EncodeLicenseCount in _010EditorKeygen.hpp can calulate it. This function receives only 1 parameter.

    Parameter Description
    DesiredLicenseCount The license count your want. Must be Must be 1~1000.

1.1 Evaluation Key

Evaluation key is generated by 8-bytes-long data. To make it clear, I use

unsigned char data[8];

to represent the 8-bytes-long data.

Evaluation key cannot make your 010Editor become registered version. It can only extend your 010Editor's trial period.

  • data[4] ~ data[7] are Checksum and calculated by CalculateChecksum function where IsRegistrationVersion = false, a3 = 255 and LicenseCount = 1. utf8_username is based on your input.

  • data[3] must be 0xFC. It represents the type of key.

  • data[0] ~ data[2] are EncodedExpireDaystamp and calculated by EncodeExpireDate function where DaystampOfExpiration is based on your input and Seed is Checksum.

Finally, the Evaluation key is the hex string of data[8] where 4 hex chars consist of a block and each block is joined by "-"(hyphen).

1.2 VersionLicense Key

VersionLicense key is also generated by 8-bytes-long data. To make it clear, I use

unsigned char data[8];

to represent the 8-bytes-long data, too.

VersionLicense key can only be used for specified version or the older. And it does not has time limit.

  • data[4] ~ data[7] are Checksum and calculated by CalculateChecksum function where IsRegistrationVersion = true, a3 = MajorVersion >= 2 ? 0 : MajorVersion. LicenseCount and utf8_username are based on your input.

  • data[3] must be 0x9C. It represents the type of key.

  • data[1] ~ data[2] are based on EncodedLicenseCount, data[7] and data[5]. EncodedLicenseCount can be calculated by EncodeLicenseCount function where DesiredLicenseCount is based on your input.

    data[1] = EncodedLicenseCount.bytes[1] ^ data[7];
    data[2] = EncodedLicenseCount.bytes[0] ^ data[5];
  • data[0] is based on MajorVersion and data[6].

    data[0] = MajorVersion;
    data[0] ^= 0xA7;
    data[0] -= 0x3D;
    data[0] ^= 0x18;
    data[0] ^= Password.data[6];

Finally, the VersionLicense key is the hex string of data[8] where 4 hex chars consist of a block and each block is joined by "-"(hyphen).

1.3 TimeLicense Key

TimeLicense key is generated by 10-bytes-long data which is different to Evaluation and VersionLicense key. To make it clear, I use

unsigned char data[10];

to represent the 10-bytes-long data.

TimeLicense key can be used for any kind of version. But it has time limit.

  • data[4] ~ data[7] are Checksum and calculated by CalculateChecksum function where IsRegistrationVersion = true, a3 = DaystampOfExpiration. DaystampOfExpiration, LicenseCount and utf8_username are based on your input.

  • data[0], data[8] ~ data[9] are based on EncodedExpireDaystamp and data[4] ~ data[6]. EncodedExpireDaystamp can be calculated by EncodeExpireDate function where Seed = 0x5B8C27 and DaystampOfExpiration is based on your input.

    data[0] = EncodedExpireDaystamp.bytes[0] ^ data[6];
    data[8] = EncodedExpireDaystamp.bytes[1] ^ data[4];
    data[9] = EncodedExpireDaystamp.bytes[2] ^ data[5];
  • data[3] must be 0xAC. It represents the type of key.

  • data[1] ~ data[2] are based on EncodedLicenseCount, data[7] and data[5]. EncodedLicenseCount can be calculated by EncodeLicenseCount function where DesiredLicenseCount is based on your input.

    data[1] = EncodedLicenseCount.bytes[1] ^ data[7];
    data[2] = EncodedLicenseCount.bytes[0] ^ data[5];

Finally, the TimeLicense key is the hex string of data[10] where 4 hex chars consist of a block and each block is joined by "-"(hyphen).

2. How to build

In console:

cd cpp
g++ -std=c++11 main.cpp -o 010Editor-keygen.exe

3. How to use

Just run it.

Example:

E:\Github\010Editor-keygen\cpp>010Editor-keygen.exe
Input your name(English Only): DoubleLabyrinth
47AD-E1AC-D789-D133-2114

E:\Github\010Editor-keygen\cpp>

NOTICE:
This key generated will expired after 2020-06-23. If you want to modify expire date, please modify variables named ExpireYear, ExpireMonth and ExpireDay in main.cpp.