BruteRatel_1.7.3 许可分析

BruteRatel_1.7.3 许可分析

对泄露的brc4 1.7.3 版本进行许可分析,因xmodlib文件已被解密且版本不对应,故不具备Badger功能!

载荷位于xmodlib.bin文件中,泄露的1.7.3版本给出的xmodlib 不正确,主体数据已经过解密但数据偏移并不对应,无法使用Badger的功能;

猜测是高版本破解版修改的xmodlib,

虽然功能无法使用,但可以从中提取载荷,分析其功能的实现。

xmodlib 文件数据的解析、验证流程 与之前1.4.4 版本一致,并无修改。xmodlib文件完全可以伪造,即使有泄露也要多加防范!

BruteRatel_1.7.3 来源:APTIRAN/C2

main_main 07826E0

1、main_main_func3_79A0E0

main_main_func3_79A0E0 中调用main_DecryptVortexMsg_725CC0 ==>AES_ECB_128 解密xmodlib 尾部的license_encdata 得到 lic_key:base64(license_data)

2、main_main_func4_79A3E0

main_main_func4_79A3E0 中调用main_decryptmsg_725620==>魔改aes解密license_data得到license_info ==》注册时间:过期时间:user:Email:mark

例如:03-20-2023:01-01-3000:ikun:ikun@kunkun.com:Sing and dance rap basketball

3、main_main_func6_79BBA0

main_main_func6_79BBA0 中

  • 先根据license信息计算得到xmodlib 加密的xmodlib_key
  • main_main_func6_5 ——79B8A0中 调用main_DecryptVortexMsg ==》AES_ECB_128 解密payloads
  • 调用time__Time_UnmarshalBinary 验证解密后的xmodlib头部的过期时间数据
  • 对解密后的xmodlib使用0x493F1C27542B0D59 进行字节xor
  • 根据硬编码偏移对xmodlib数据进行分割

可参考后面脚本中的dec_xmodlibparse_payloads

main_EncryptVortexMsg => AES_ECB_128_ENC
main_DecryptVortexMsg => AES_ECB_128_DEC


main_encryptmsg => XXAES128_ECB_encrypt
main_decryptmsg => XXAES128_ECB_decrypt

py

MYAES.py

import base64
# pip install pycryptodome
from Crypto.Cipher import AES
STATE = [[0]*4 for _ in range(4)]
ROUNDKEY = [0]*176

# KEY = None
# IV = None

# The number of columns comprising a state in AES. This is a constant in AES. Value=4
Nb = 4
# The number of 32 bit words in a key.
Nk = 4
# Key length in bytes [128 bit]
KEYLEN = 16
# The number of rounds in AES Cipher.
Nr = 10

sbox = [
    # 0     1    2      3     4    5     6     7      8    9     A      B    C     D     E     F
    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]

rsbox = [
    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
    0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
    0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
    0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
    0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
    0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
    0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
    0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
    0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
    0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
    0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]


""" The round constant word array, Rcon[i], contains the values given by
    x to th e power (i-1) being powers of x (x is denoted as {02}) in the field GF(2^8)
    Note that i starts at 1, not 0)."""
Rcon = [
    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
    0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39,
    0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
    0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
    0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef,
    0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
    0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b,
    0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,
    0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
    0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
    0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,
    0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
    0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
    0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63,
    0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb]


def getSBoxValue(num):
    return sbox[num]


def getSBoxInvert(num):
    return rsbox[num]


def KeyExpansion(key):
    tempa = [0, 0, 0, 0]  # Used for the column/row operations

    # The first round key is the key itself.
    for i in range(0, Nk):
        ROUNDKEY[(i * 4) + 0] = key[(i * 4) + 0]
        ROUNDKEY[(i * 4) + 1] = key[(i * 4) + 1]
        ROUNDKEY[(i * 4) + 2] = key[(i * 4) + 2]
        ROUNDKEY[(i * 4) + 3] = key[(i * 4) + 3]

    i = i+1
    # All other round keys are found from the previous round keys.
    for i in range(i, (Nb * (Nr + 1))):
        for j in range(0, 4):
            tempa[j] = ROUNDKEY[(i-1) * 4 + j]
        if i % Nk == 0:
            # This function rotates the 4 bytes in a word to the left once.
            # [a0,a1,a2,a3] becomes [a1,a2,a3,a0]
            # Function RotWord()
            k = tempa[0]
            tempa[0] = tempa[1]
            tempa[1] = tempa[2]
            tempa[2] = tempa[3]
            tempa[3] = k

            # SubWord() is a function that takes a four-byte input word and
            # applies the S-box to each of the four bytes to produce an output word.

            # Function Subword()
            tempa[0] = getSBoxValue(tempa[0])
            tempa[1] = getSBoxValue(tempa[1])
            tempa[2] = getSBoxValue(tempa[2])
            tempa[3] = getSBoxValue(tempa[3])

            tempa[0] = tempa[0] ^ Rcon[i//Nk]

        else:
            if (Nk > 6 and i % Nk == 4):
                # Function Subword()
                tempa[0] = getSBoxValue(tempa[0])
                tempa[1] = getSBoxValue(tempa[1])
                tempa[2] = getSBoxValue(tempa[2])
                tempa[3] = getSBoxValue(tempa[3])

        ROUNDKEY[i * 4 + 0] = ROUNDKEY[(i - Nk) * 4 + 0] ^ tempa[0]
        ROUNDKEY[i * 4 + 1] = ROUNDKEY[(i - Nk) * 4 + 1] ^ tempa[1]
        ROUNDKEY[i * 4 + 2] = ROUNDKEY[(i - Nk) * 4 + 2] ^ tempa[2]
        ROUNDKEY[i * 4 + 3] = ROUNDKEY[(i - Nk) * 4 + 3] ^ tempa[3]

# This function adds the round key to state.
# The round key is added to the state by an XOR function.


def AddRoundKey(round):
    for i in range(0, 4):
        for j in range(0, 4):
            STATE[i][j] ^= ROUNDKEY[round * Nb * 4 + i * Nb + j]


# The SubBytes Function Substitutes the values in the
# state matrix with values in an S-box.
def SubBytes():
    for i in range(0, 4):
        for j in range(0, 4):
            STATE[j][i] = getSBoxValue(STATE[j][i])


# The ShiftRows() function shifts the rows in the state to the left.
# Each row is shifted with different offset.
# Offset = Row number. So the first row is not shifted.
def ShiftRows():
    # Rotate first row 1 columns to left
    temp = STATE[0][1]
    STATE[0][1] = STATE[1][1]
    STATE[1][1] = STATE[2][1]
    STATE[2][1] = STATE[3][1]
    STATE[3][1] = temp

    # Rotate second row 2 columns to left
    temp = STATE[0][2]
    STATE[0][2] = STATE[2][2]
    STATE[2][2] = temp

    temp = STATE[1][2]
    STATE[1][2] = STATE[3][2]
    STATE[3][2] = temp

    # Rotate third row 3 columns to left
    temp = STATE[0][3]
    STATE[0][3] = STATE[3][3]
    STATE[3][3] = STATE[2][3]
    STATE[2][3] = STATE[1][3]
    STATE[1][3] = temp


def xtime(x):
    return (((x << 1) ^ (((x >> 7) & 1) * 0x1b)) % 256)

# MixColumns function mixes the columns of the state matrix


def MixColumns():
    for i in range(0, 4):
        t = STATE[i][0]
        Tmp = STATE[i][0] ^ STATE[i][1] ^ STATE[i][2] ^ STATE[i][3]
        Tm = STATE[i][0] ^ STATE[i][1]
        Tm = xtime(Tm)
        STATE[i][0] ^= Tm ^ Tmp
        Tm = STATE[i][1] ^ STATE[i][2]
        Tm = xtime(Tm)
        STATE[i][1] ^= Tm ^ Tmp
        Tm = STATE[i][2] ^ STATE[i][3]
        Tm = xtime(Tm)
        STATE[i][2] ^= Tm ^ Tmp
        Tm = STATE[i][3] ^ t
        Tm = xtime(Tm)
        STATE[i][3] ^= Tm ^ Tmp

# Multiply is used to multiply numbers in the field GF(2^8)


def Multiply(x, y):
    return (((y & 1) * x) ^
            ((y >> 1 & 1) * xtime(x)) ^
            ((y >> 2 & 1) * xtime(xtime(x))) ^
            ((y >> 3 & 1) * xtime(xtime(xtime(x)))) ^
            ((y >> 4 & 1) * xtime(xtime(xtime(xtime(x))))))

# MixColumns function mixes the columns of the state matrix.
# The method used to multiply may be difficult to understand for the inexperienced.
# Please use the references to gain more information.


def InvMixColumns():
    for i in range(0, 4):
        a = STATE[i][0]
        b = STATE[i][1]
        c = STATE[i][2]
        d = STATE[i][3]

        STATE[i][0] = Multiply(a, 0x0e) ^ Multiply(
            b, 0x0b) ^ Multiply(c, 0x0d) ^ Multiply(d, 0x09)
        STATE[i][1] = Multiply(a, 0x09) ^ Multiply(
            b, 0x0e) ^ Multiply(c, 0x0b) ^ Multiply(d, 0x0d)
        STATE[i][2] = Multiply(a, 0x0d) ^ Multiply(
            b, 0x09) ^ Multiply(c, 0x0e) ^ Multiply(d, 0x0b)
        STATE[i][3] = Multiply(a, 0x0b) ^ Multiply(
            b, 0x0d) ^ Multiply(c, 0x09) ^ Multiply(d, 0x0e)


# The SubBytes Function Substitutes the values in the
# state matrix with values in an S-box.
def InvSubBytes():
    for i in range(0, 4):
        for j in range(0, 4):
            try:
                STATE[j][i] = getSBoxInvert(STATE[j][i])
            except:
                pass


def InvShiftRows():
    # Rotate first row 1 columns to right
    temp = STATE[3][1]
    STATE[3][1] = STATE[2][1]
    STATE[2][1] = STATE[1][1]
    STATE[1][1] = STATE[0][1]
    STATE[0][1] = temp

    # Rotate second row 2 columns to right
    temp = STATE[0][2]
    STATE[0][2] = STATE[2][2]
    STATE[2][2] = temp

    temp = STATE[1][2]
    STATE[1][2] = STATE[3][2]
    STATE[3][2] = temp

    # Rotate third row 3 columns to right
    temp = STATE[0][3]
    STATE[0][3] = STATE[1][3]
    STATE[1][3] = STATE[2][3]
    STATE[2][3] = STATE[3][3]
    STATE[3][3] = temp

# Cipher is the main function that encrypts the PlainText.


def LoadStateArray(input_bs: bytes):
    for i in range(0, 4):
        for j in range(0, 4):
            STATE[i][j] = input_bs[4*i + j]


def StoreStateArray() -> bytes:
    out = bytearray()
    for i in range(0, 4):
        for j in range(0, 4):
            out += bytes([STATE[i][j]])
    return bytes(out)





def Cipher(block: bytes) -> bytes:
    """
    main_EncryptVortexMsg
    """
    LoadStateArray(block)
    # Add the First round key to the state before starting the rounds.
    AddRoundKey(0)

    # There will be Nr rounds.
    # The first Nr-1 rounds are identical.
    # These Nr-1 rounds are executed in the loop below.
    for round in range(1, Nr):
        SubBytes()
        ShiftRows()
        MixColumns()
        AddRoundKey(round)

    # The last round is given below.
    # The MixColumns function is not here in the last round.
    SubBytes()
    ShiftRows()
    AddRoundKey(Nr)
    ret = StoreStateArray()
    return ret



def XXCipher(block: bytes) -> bytes:
    """
    main_encryptmsg
    """
    LoadStateArray(block)
    AddRoundKey(0)
    InvMixColumns()

    for round in range(1, Nr):
        SubBytes()
        ShiftRows()
        MixColumns()
        InvShiftRows()
        AddRoundKey(round)
        ShiftRows()

    SubBytes()
    ShiftRows()
    AddRoundKey(Nr)
    ret = StoreStateArray()
    return ret





def InvCipher(block: bytes) -> bytes:
    """
    main_DecryptVortexMsg
    """
    # Add the First round key to the state before starting the rounds.
    LoadStateArray(block)
    AddRoundKey(Nr)

    # There will be Nr rounds.
    # The first Nr-1 rounds are identical.
    # These Nr-1 rounds are executed in the loop below.
    for round in range(Nr-1, 0, -1):
        InvShiftRows()
        InvSubBytes()
        AddRoundKey(round)
        InvMixColumns()

    # The last round is given below.
    # The MixColumns function is not here in the last round.
    InvShiftRows()
    InvSubBytes()
    AddRoundKey(0)
    ret = StoreStateArray()
    return ret





def XXInvCipher(block: bytes) -> bytes:
    """
    main_decryptmsg
    """
    LoadStateArray(block)
    AddRoundKey(Nr)
    InvShiftRows()
    InvSubBytes()

    for round in range(Nr-1, 0, -1):
        InvShiftRows()
        AddRoundKey(round)
        ShiftRows()
        InvMixColumns()
        InvShiftRows()
        InvSubBytes()
    MixColumns()
    AddRoundKey(0)
    ret = StoreStateArray()
    return ret


def XXAES128_ECB_encrypt(input_data: bytes, key: bytes) -> bytes:
    # do main_encryptmsg

    # Copy input to output, and work in-memory on output
    out = b''
    data_len = len(input_data)
    if (data_len % 16) != 0:
        print('[!]data need pad!')

    elif len(key) != 16:
        print('[!]key error!')
    else:
        KeyExpansion(key)
        for i in range(0, data_len, 0x10):
            # The next function call encrypts the PlainText with the Key using AES algorithm.
            out += XXCipher(input_data[i:i+0x10])
    return out


def XXAES128_ECB_decrypt(input_data: bytes, key: bytes) -> bytes:
    # do main_decryptmsg
    out = b''
    data_len = len(input_data)
    if (data_len % 16) != 0:
        print('[!]data need pad!')
    elif len(key) != 16:
        print('[!]key error!')
    else:
        # The KeyExpansion routine must be called before encryption.
        KeyExpansion(key)
        for i in range(0, data_len, 0x10):
            # The next function call encrypts the PlainText with the Key using AES algorithm.
            out += XXInvCipher(input_data[i:i+0x10])
    return out


def do_test():
    plaintext = b'1234'*4*2
    key = b'1'*16
    encrypted = XXAES128_ECB_encrypt(plaintext, key)
    decrypted = XXAES128_ECB_decrypt(encrypted, key)

    print("Plaintext:", plaintext)
    print("Encrypted:", encrypted)
    print("Decrypted:", decrypted)

    # plaintext = b'1234'*4
    # key = b'1'*16
    # aes_cipher = AES.new(key=key, mode=AES.MODE_ECB)
    # encrypted = aes_cipher.encrypt(plaintext)
    # decrypted = aes_cipher.decrypt(encrypted)
    # print("Plaintext:", plaintext)
    # print("Encrypted:", encrypted)
    # print("Decrypted:", decrypted)
    pass


def AES_ECB_128_ENC(plaintext: bytes, key: bytes) -> bytes:
    """
    cryptodome AES 标准算法
    do main_EncryptVortexMsg
    """
    aes_cipher = AES.new(key=key, mode=AES.MODE_ECB)
    encrypted = aes_cipher.encrypt(plaintext)
    return encrypted


def AES_ECB_128_DEC(encrypted: bytes, key: bytes) -> bytes:
    """
    cryptodome AES 标准算法
    do main_DecryptVortexMsg
    """
    aes_cipher = AES.new(key=key, mode=AES.MODE_ECB)
    decrypted = aes_cipher.decrypt(encrypted)
    return decrypted


main_DecryptVortexMsg = AES_ECB_128_DEC
main_decryptmsg = XXAES128_ECB_decrypt
main_EncryptVortexMsg = AES_ECB_128_ENC
main_encryptmsg = XXAES128_ECB_encrypt




if __name__ == "__main__":
    # do_test()
    pass

_173_dec_xmodlib.py

import base64
from datetime import datetime, timedelta, timezone
import os
import struct

import MYAES

TIME_BIN_SZ = 0xF
# version 1.4.4
PAYLOADS_SZ = 0x39C703
# version 1.7.3
PAYLOADS_SZ_173 = 0x3C0847
PAD_SZ = 16 - ((TIME_BIN_SZ + PAYLOADS_SZ) % 16)  # 0xe
PAD_SZ_173 = 16 - ((TIME_BIN_SZ + PAYLOADS_SZ_173) % 16)  

LIC_OFFSET = TIME_BIN_SZ + PAYLOADS_SZ + PAD_SZ  # 0x39c720
LIC_OFFSET_173 = TIME_BIN_SZ + PAYLOADS_SZ_173 + PAD_SZ_173
# go time
unixToInternal = (1969*365 + 1969//4 - 1969//100 + 1969//400) * (60*60*24)
internalToUnix = -unixToInternal


def parse_go_timebin(data: bytes) -> str:
    version = data[0]
    if version != 1:
        print("[!]This version is not supported!")
        return ""
    sec = struct.unpack(">Q", data[1:9])[0]
    nsec = struct.unpack(">I", data[9:13])[0]
    offset = struct.unpack(">h", data[13:15])[0]

    # if version == 2:
    #     offset += data[15]
    if offset == -1:
        # print('UTC')
        loc = timezone.utc
    else:
        # print('offset hour:',offset)
        loc = timezone(timedelta(hours=offset))
    unix_sec = sec+internalToUnix
    unix_nsec = unix_sec*1_000_000_000 + nsec
    seconds = unix_nsec // 1_000_000_000
    nanoseconds = unix_nsec % 1_000_000_000
    # 创建 datetime 对象
    dt = datetime.fromtimestamp(seconds, loc)

    # 格式化 datetime 对象为字符串,并添加纳秒部分
    time_string = dt.strftime('%Y-%m-%d %H:%M:%S') + \
        f'.{nanoseconds:09d}'+f' {loc}'
    return time_string


def mk_go_timebin(date_string: str, date_format='%Y-%m-%d %H:%M:%S'):
    dt = datetime.strptime(date_string, date_format)
    dt = dt.replace(tzinfo=timezone.utc)
    sec = int(dt.timestamp())+unixToInternal
    nsec = 0
    offset_min = -1  # UTC
    enc = struct.pack('>BQIh', 1, sec, nsec, offset_min)
    return enc


def zero_pad(data, block_size=16, already_pad_add=False):
    # 计算需要填充的字节数
    pad_len = block_size - (len(data) % block_size)
    if not already_pad_add:
        # 如果数据已经对齐,则 pad_len 会等于 block_size,此时无需填充
        if pad_len == block_size:
            return data
    # 进行填充,使用 b'\0' 表示零字节填充
    padded_data = data + b"\0" * pad_len
    return padded_data


def bs_replace(s: bytes) -> bytes:
    ret = s
    ret = ret.replace(b"+", b"-")
    ret = ret.replace(b"/", b":")
    ret = ret.replace(b"=", b"+")
    return ret


def calc_payload_key(lic_key: bytes, lic_encinfo: bytes, email_key: bytes) -> bytes:
    print("[+]calc_payload_key:")
    part1 = MYAES.XXAES128_ECB_encrypt(zero_pad(lic_key), email_key)
    part1_b64 = base64.b64encode(part1)
    part1_b64_rp = bs_replace(part1_b64)
    print("\t[-]part1:", part1_b64_rp)
    part2 = MYAES.XXAES128_ECB_encrypt(zero_pad(lic_encinfo), email_key)
    part2_b64 = base64.b64encode(part2)
    part2_b64_rp = bs_replace(part2_b64)
    print("\t[-]part2:", part2_b64_rp)
    temp: bytes = part1_b64_rp + b"$" + part2_b64_rp
    payloads_aes_key = MYAES.XXAES128_ECB_encrypt(zero_pad(temp), email_key)
    payloads_aes_key_b64 = base64.b64encode(payloads_aes_key)
    print("\t[+]xmodlib key:", payloads_aes_key_b64)
    return payloads_aes_key_b64


def dec_xmodlib(
    fpath: str, license_offset: int ,out_payloads_path: str = ""):
    data = b""
    with open(fpath, "rb") as f:
        data = f.read()
    lic_enc = data[license_offset:]
    lic_aeskey = bytes(MYAES.rsbox[:16])
    lic_data: bytes = MYAES.AES_ECB_128_DEC(
        lic_enc, lic_aeskey).rstrip(b"\x00")
    lic_key, lic_encinfo = lic_data.split(b":")
    print("[-]lic_key:", lic_key)
    print("[-]lic_encinfo:", lic_encinfo)
    lic_decinfo = MYAES.XXAES128_ECB_decrypt(
        base64.b64decode(lic_encinfo), lic_key[:0x10]
    ).rstrip(b"\x00")
    print("[+]license info:", lic_decinfo)
    info = lic_decinfo.split(b":")
    # 注册时间、过期时间、user、Email、mark
    # 03-20-2023:03-20-2024:Rnd Lab - Delhi:daily.workmail22@gmail.com:RND Lab
    email_key = zero_pad(info[3])[:0x10]
    payloads_aes_key_b64 = calc_payload_key(lic_key, lic_encinfo, email_key)
    t_p = MYAES.AES_ECB_128_DEC(
        data[:license_offset], payloads_aes_key_b64[:0x10])
    time_bin = t_p[:0xF]
    print("[-]end_time_bin:", time_bin.hex())
    time_s = parse_go_timebin(time_bin)
    print("[-]end_time:", time_s)
    payloads = t_p[0xF:]
    if out_payloads_path:
        with open(out_payloads_path, "wb") as f:
            f.write(payloads)
    print("dec over!")




def mk_xmodlib_lic(
    date_start: str,
    date_end: str,
    user: str,
    email: str,
    mark: str,
    key: bytes,
):
    # hex: 010000001608f0d11000000000ffff
    # 3000-01-01 01:00:00 +0000 UTC
    # time_bin = bytes.fromhex("010000001608f0d11000000000ffff")
    # end_date = '3000-1-1 1:00:00'

    # or use date_end with date_format='%m-%d-%Y'
    
    # time_bin = mk_go_timebin(end_date,'')

    time_bin = mk_go_timebin(date_end,r'%m-%d-%Y')
    print('[-]end_time_bin:', time_bin)
    print('[-]end_time:', parse_go_timebin(time_bin))

    lic_key = key
    lic_info: str = ":".join([date_start, date_end, user, email, mark])
    temp = MYAES.XXAES128_ECB_encrypt(zero_pad(lic_info.encode("utf8")), lic_key)
    lic_encinfo = base64.b64encode(temp)
    email_key = zero_pad(email.encode())[:0x10]
    xmodlib_key = calc_payload_key(lic_key, lic_encinfo, email_key)
    lic_data = b":".join([lic_key, lic_encinfo])
    print('[+]lic_data:',lic_data)
    lic_enc = MYAES.AES_ECB_128_ENC(zero_pad(lic_data), bytes(MYAES.rsbox[:0x10]))
    print("[-]lic_enc:", lic_enc.hex())

    return time_bin,lic_enc,xmodlib_key

def mk_xmodlib(
    date_start: str,
    date_end: str,
    user: str,
    email: str,
    mark: str,
    payloads_path: str,
    new_xmodlib_path: str,
    key: bytes,
    payloads_sz: int = PAYLOADS_SZ_173
):

    time_bin,lic_enc,xmodlib_key=mk_xmodlib_lic(date_start,date_end,user,email,mark,key)
    payloads = b""
    fstat = os.stat(payloads_path)
    if fstat.st_size < payloads_sz:
        print('[!]size error')
        return
    with open(payloads_path, "rb") as f:
        payloads = f.read()
    t_p = time_bin + payloads[:payloads_sz]
    t_p = zero_pad(t_p)
    enc = MYAES.AES_ECB_128_ENC(t_p, xmodlib_key[:0x10])

    with open(new_xmodlib_path, "wb") as f:
        f.write(enc)
        f.write(lic_enc)
    print('crate over')






def do_test():
    # dec_xmodlib('xmodlib.bin','payloads.bin')
    date_start = '03-20-2023'
    date_end = '01-01-3000'
    user = 'ikun'
    email = 'ikun@kunkun.com'
    mark = 'Sing and dance rap basketball'
    lic_key = b"0" * 16
    # mk_xmodlib(date_start, date_end, user, email, mark, 'payloads.bin', 'my_xmodlib.bin', lic_key)
    time_bin,lic_enc,xmodlib_key=mk_xmodlib_lic(date_start, date_end, user, email, mark, lic_key)
    print('\n\n--------------------------------------------------------------------------------------')
    print('[+]time_bin:',time_bin.hex(),'==>',parse_go_timebin(time_bin))
    print('[+]lic_enc:',lic_enc.hex())
    print('[-]xmodlib_key:',xmodlib_key.hex())



if __name__ == "__main__":

    # print(parse_go_timebin(bytes.fromhex('01 00 00 00 0E DC 59 20 9E 27 82 6E DA 00 00')))

    do_test()
    # dec_xmodlib('my_xmodlib.bin', license_offset=LIC_OFFSET_173)
    pass

"""
[-]end_time_bin: b'\x01\x00\x00\x00\x16\x08\xf0\xc3\x00\x00\x00\x00\x00\xff\xff'
[-]end_time: 3000-01-01 00:00:00.000000000 UTC
[+]calc_payload_key:
        [-]part1: b'UWH8RWoC7hYUOljPOXRwLg++'
        [-]part2: b'-AGq869r8mXNeZIlMN4cOm5YA2y8GYxeZirHKyqDs:VafeDB8DrpIKOgoMaKfBqrtzryzGzChwiasJpQlyKK4DjTbeVMg1Lo0V9cIB2z0-ljUH57sCgWBpbXPLUeQUCXiuqpIb8XYqgv-VeDpxYXbw++'
        [+]xmodlib key: b'yRmbUFuqCA9IPwNq+HPrmXQ6Lyn01qgp+DjzkdBXgRyctfI+7TG+VYhJZeFYVZ2dQRmbmnNH57jzNuW2ub2hZ7Hc4fFZ38R0d6A4eq6Sc5q0/+B2vDG2WenXiv9uc57lvbDWV97LLy3Rq9eNWbKze74RCxz3h0uz/aDXwxSGfLaFkdpO5ta0GqX1Eu/y7gJlm4jqXsCrvPYSdSGd8RBqRPRoC+Y96lh8QNWYmXktAtS2EvZlWa7o0Wu1qroiv5Li'
[+]lic_data: b'0000000000000000:/GlIq2aq6UUt094yBs1I47c+mUBn0hKcQUe5QEDIA5GnaBpCTbn6AVoxjrnm7DS2p57PruH0w7GdiCThyz+gq1Z4LiEvncWJXf+LXWt4wVI='
[-]lic_enc: 53e199d1e63cc0653da2d4f7614344357653ecfcdf24939734cacb3e67c1a13c2dbaec81b0792627a8fb83e6908d79baae1fcf5138d980cae1c7049f99d17d58d68aff59b74149a694313503bfbf1f0e78f425252e5f2bf56348a272debd05d745ff87931c25ddbce110584d6acabbdab542b9374a5cdbb00cf91a3260d425a6


--------------------------------------------------------------------------------------
[+]time_bin: 010000001608f0c30000000000ffff ==> 3000-01-01 00:00:00.000000000 UTC
[+]lic_enc: 53e199d1e63cc0653da2d4f7614344357653ecfcdf24939734cacb3e67c1a13c2dbaec81b0792627a8fb83e6908d79baae1fcf5138d980cae1c7049f99d17d58d68aff59b74149a694313503bfbf1f0e78f425252e5f2bf56348a272debd05d745ff87931c25ddbce110584d6acabbdab542b9374a5cdbb00cf91a3260d425a6
[-]xmodlib_key: 79526d62554675714341394950774e712b4850726d5851364c796e30317167702b446a7a6b644258675279637466492b3754472b5659684a5a654659565a326451526d626d6e4e4835376a7a4e755732756232685a3748633466465a333852306436413465713653633571302f2b42327644473257656e58697639756335376c766244575639374c4c7933527139654e57624b7a6537345243787a336830757a2f61445877785347664c61466b64704f357461304771583145752f7937674a6c6d346a71587343727650595364534764385242715250526f432b5939366c6838514e57596d586b744174533245765a6c5761376f3057753171726f6976354c69

"""

_173_modify_payload.py

from _173_dec_xmodlib import mk_xmodlib, dec_xmodlib, LIC_OFFSET_173
import collections
import os
from typing import Callable


VERSION = 173


xmodlib_info = collections.OrderedDict()
if VERSION == 144:
    PAYLOADS_SZ = 0x39C703
    xmodlib_info["inject_http"] = collections.OrderedDict({"x86": 0x34600})
    xmodlib_info["inject_http"]["x64"] = 0x35000
    xmodlib_info["inject_tcp"] = collections.OrderedDict({"x86": 0x32200})
    xmodlib_info["inject_tcp"]["x64"] = 0x33000
    xmodlib_info["inject_smb"] = collections.OrderedDict({"x86": 0x32400})
    xmodlib_info["inject_smb"]["x64"] = 0x33200
    xmodlib_info["cryptvortex"] = collections.OrderedDict({"x86": 0x6000})
    xmodlib_info["cryptvortex"]["x64"] = 0x7200
    xmodlib_info["psreflect"] = collections.OrderedDict({"x86": 0x7600})
    xmodlib_info["psreflect"]["x64"] = 0x8800
    xmodlib_info["sharpreflect"] = collections.OrderedDict({"x86": 0x2400})
    xmodlib_info["sharpreflect"]["x64"] = 0x2800
    xmodlib_info["mimikatz"] = collections.OrderedDict({"x86": 0x0FDE00})
    xmodlib_info["mimikatz"]["x64"] = 0x131600
    xmodlib_info["dllbase_o"] = collections.OrderedDict({"x86": 0x102C})
    xmodlib_info["dllbase_o"]["x64"] = 0x19D4
    xmodlib_info["svcbase_o"] = collections.OrderedDict({"x86": 0x1988})
    xmodlib_info["svcbase_o"]["x64"] = 0x278B
    xmodlib_info["stage_zero_rtl"] = collections.OrderedDict({"x64": 0x2590})
    xmodlib_info["stage_zero_rtl"]["x86"] = 0x1D10
    xmodlib_info["stage_zero_wait"] = collections.OrderedDict({"x64": 0x25C0})
    xmodlib_info["stage_zero_wait"]["x86"] = 0x1D60

    xmodlib_info["stage_core_rtl"] = collections.OrderedDict({"x64": 0x13A0})
    xmodlib_info["stage_core_rtl"]["x86"] = 0x1380
    xmodlib_info["stage_core_wait"] = collections.OrderedDict({"x64": 0x13C0})
    xmodlib_info["stage_core_wait"]["x86"] = 0x13C0
    xmodlib_info["stage_core_stealth_rtl"] = collections.OrderedDict({
        "x64": 0x1CC0})
    xmodlib_info["stage_core_stealth_wait"] = collections.OrderedDict({
        "x64": 0x1CD0})
elif VERSION == 173:
    PAYLOADS_SZ = 0x3C0847
    xmodlib_info["inject_http"] = collections.OrderedDict({"x86": 0x38A00})
    xmodlib_info["inject_http"]["x64"] = 0x3BC00
    xmodlib_info["inject_tcp"] = collections.OrderedDict({"x86": 0x36A00})
    xmodlib_info["inject_tcp"]["x64"] = 0x39E00
    xmodlib_info["inject_smb"] = collections.OrderedDict({"x86": 0x36C00})
    xmodlib_info["inject_smb"]["x64"] = 0x3A200
    xmodlib_info["cryptvortex"] = collections.OrderedDict({"x86": 0x6000})
    xmodlib_info["cryptvortex"]["x64"] = 0x7200
    xmodlib_info["psreflect"] = collections.OrderedDict({"x86": 0x7600})
    xmodlib_info["psreflect"]["x64"] = 0x8800
    xmodlib_info["sharpreflect"] = collections.OrderedDict({"x86": 0x2400})
    xmodlib_info["sharpreflect"]["x64"] = 0x2800
    xmodlib_info["mimikatz"] = collections.OrderedDict({"x86": 0x0FDE00})
    xmodlib_info["mimikatz"]["x64"] = 0x131600
    xmodlib_info["dllbase_o"] = collections.OrderedDict({"x86": 0x1005})
    xmodlib_info["dllbase_o"]["x64"] = 0x19DD
    xmodlib_info["svcbase_o"] = collections.OrderedDict({"x86": 0x19A7})
    xmodlib_info["svcbase_o"]["x64"] = 0x27BE
    xmodlib_info["stage_zero_rtl"] = collections.OrderedDict({"x64": 0x2B90})
    xmodlib_info["stage_zero_rtl"]["x86"] = 0x2320
    xmodlib_info["stage_zero_wait"] = collections.OrderedDict({"x64": 0x2BC0})
    xmodlib_info["stage_zero_wait"]["x86"] = 0x2370

    xmodlib_info["stage_core_rtl"] = collections.OrderedDict({"x64": 0x15A0})
    xmodlib_info["stage_core_rtl"]["x86"] = 0x1570
    xmodlib_info["stage_core_wait"] = collections.OrderedDict({"x64": 0x15C0})
    xmodlib_info["stage_core_wait"]["x86"] = 0x15B0
    xmodlib_info["stage_core_stealth_rtl"] = collections.OrderedDict({
        "x64": 0x1E40})
    xmodlib_info["stage_core_stealth_wait"] = collections.OrderedDict({
        "x64": 0x1E60})
pos = 0
pos_info = {}
for k in xmodlib_info:
    pos_info[k] = {}
    # print("pos:", pos)
    item = xmodlib_info[k]
    for subkey in item:
        subitem = item[subkey]
        pos_info[k][subkey] = pos
        # print("key:%s\tskey:%s\tsz:%04x" % (k, subkey, subitem))
        pos += subitem


def xor_data(data: bytearray, xor_key: bytes):
    for i in range(len(data)):
        data[i] ^= xor_key[i % 8]
    return data


def patch_payloads(data: bytearray):
    index = 0
    for payload_name, archs_dict in xmodlib_info.items():
        for arch in archs_dict:
            pos = pos_info[payload_name][arch]
            sz = xmodlib_info[payload_name][arch]
            data[pos:pos+sz] = index.to_bytes(1, 'little')*sz
            index += 1
    print('[-]patch over')
    return


def modify_payloads(fname: str = "payloads.bin", xor_number: int = 0x493F1C27542B0D59, out_path: str = 'modify_payloads.bin', patch_callback: Callable[[bytearray], None] = patch_payloads):
    xor_bs = xor_number.to_bytes(8, "little")
    all_data = bytearray()
    if fname and os.path.exists(fname):
        with open(fname, "rb") as f:
            all_data += f.read()
    else:
        all_data = bytearray(PAYLOADS_SZ)

    if xor_number and fname:
        xor_data(all_data, xor_bs)

    # do patch
    patch_callback(all_data)

    if xor_number:
        xor_data(all_data, xor_bs)
    with open(out_path, 'wb') as f:
        f.write(all_data)
    print('[-]modify_payloads end')
    pass


def parse_payloads(fpath="modify_payloads.bin", out_dir=''):
    with open(fpath, "rb") as f:
        bs = bytearray(f.read())
        xor_data(bs, 0x493F1C27542B0D59.to_bytes(8, "little"))
        count = 0
        for k in xmodlib_info:
            print("pos:", count)
            item = xmodlib_info[k]
            for subkey in item:
                subitem = item[subkey]
                print("key:%s\tskey:%s\tsz:%04x" % (k, subkey, subitem))
                if out_dir:
                    if not os.path.exists(out_dir):
                        os.makedirs(out_dir)
                    out_p=os.path.join(out_dir, k+"_"+subkey)
                    with open(out_p, 'wb') as f2:
                        f2.write(bs[count:count+subitem])
                        print(f'[-]save==>{out_p}')
                count += subitem

        # print('\n[-]payload types:',len(xmodlib_info))
        # print("[+]allsize:", hex(count))


def test():
    out_payloads = 'my_payloads.bin'
    out_xmodlib = 'my_xmodlib2.bin'

    modify_payloads('', out_path=out_payloads)
    print('\n\n--------------------------------------------------------------------------------------')

    parse_payloads(out_payloads)
    print('\n\n--------------------------------------------------------------------------------------')

    # 配置生成xmodlib文件
    date_start = '03-20-2023'
    date_end = '01-01-3000'
    user = 'ikun'
    email = 'ikun@kunkun.com'
    mark = 'Sing and dance rap basketball'
    lic_key = b"0" * 16
    mk_xmodlib(date_start, date_end, user, email, mark,
               out_payloads, out_xmodlib, lic_key)
    print('\n\n--------------------------------------------------------------------------------------')
    # 解析指定版本的xmodlib文件
    dec_xmodlib(out_xmodlib, LIC_OFFSET_173)
    pass


if __name__ == '__main__':

    test()
    pass



"""
[-]patch over
[-]modify_payloads end


--------------------------------------------------------------------------------------
pos: 0
key:inject_http skey:x86        sz:38a00
key:inject_http skey:x64        sz:3bc00
pos: 476672
key:inject_tcp  skey:x86        sz:36a00
key:inject_tcp  skey:x64        sz:39e00
pos: 937472
key:inject_smb  skey:x86        sz:36c00
key:inject_smb  skey:x64        sz:3a200
pos: 1399808
key:cryptvortex skey:x86        sz:6000
key:cryptvortex skey:x64        sz:7200
pos: 1453568
key:psreflect   skey:x86        sz:7600
key:psreflect   skey:x64        sz:8800
pos: 1518592
key:sharpreflect        skey:x86        sz:2400
key:sharpreflect        skey:x64        sz:2800
pos: 1538048
key:mimikatz    skey:x86        sz:fde00
key:mimikatz    skey:x64        sz:131600
pos: 3828736
key:dllbase_o   skey:x86        sz:1005
key:dllbase_o   skey:x64        sz:19dd
pos: 3839458
key:svcbase_o   skey:x86        sz:19a7
key:svcbase_o   skey:x64        sz:27be
pos: 3856199
key:stage_zero_rtl      skey:x64        sz:2b90
key:stage_zero_rtl      skey:x86        sz:2320
pos: 3876343
key:stage_zero_wait     skey:x64        sz:2bc0
key:stage_zero_wait     skey:x86        sz:2370
pos: 3896615
key:stage_core_rtl      skey:x64        sz:15a0
key:stage_core_rtl      skey:x86        sz:1570
pos: 3907639
key:stage_core_wait     skey:x64        sz:15c0
key:stage_core_wait     skey:x86        sz:15b0
pos: 3918759
key:stage_core_stealth_rtl      skey:x64        sz:1e40
pos: 3926503
key:stage_core_stealth_wait     skey:x64        sz:1e60


--------------------------------------------------------------------------------------
[-]end_time_bin: b'\x01\x00\x00\x00\x16\x08\xf0\xc3\x00\x00\x00\x00\x00\xff\xff'
[-]end_time: 3000-01-01 00:00:00.000000000 UTC
[+]calc_payload_key:
        [-]part1: b'UWH8RWoC7hYUOljPOXRwLg++'
        [-]part2: b'-AGq869r8mXNeZIlMN4cOm5YA2y8GYxeZirHKyqDs:VafeDB8DrpIKOgoMaKfBqrtzryzGzChwiasJpQlyKK4DjTbeVMg1Lo0V9cIB2z0-ljUH57sCgWBpbXPLUeQUCXiuqpIb8XYqgv-VeDpxYXbw++'
        [+]xmodlib key: b'yRmbUFuqCA9IPwNq+HPrmXQ6Lyn01qgp+DjzkdBXgRyctfI+7TG+VYhJZeFYVZ2dQRmbmnNH57jzNuW2ub2hZ7Hc4fFZ38R0d6A4eq6Sc5q0/+B2vDG2WenXiv9uc57lvbDWV97LLy3Rq9eNWbKze74RCxz3h0uz/aDXwxSGfLaFkdpO5ta0GqX1Eu/y7gJlm4jqXsCrvPYSdSGd8RBqRPRoC+Y96lh8QNWYmXktAtS2EvZlWa7o0Wu1qroiv5Li'
[+]lic_data: b'0000000000000000:/GlIq2aq6UUt094yBs1I47c+mUBn0hKcQUe5QEDIA5GnaBpCTbn6AVoxjrnm7DS2p57PruH0w7GdiCThyz+gq1Z4LiEvncWJXf+LXWt4wVI='
[-]lic_enc: 53e199d1e63cc0653da2d4f7614344357653ecfcdf24939734cacb3e67c1a13c2dbaec81b0792627a8fb83e6908d79baae1fcf5138d980cae1c7049f99d17d58d68aff59b74149a694313503bfbf1f0e78f425252e5f2bf56348a272debd05d745ff87931c25ddbce110584d6acabbdab542b9374a5cdbb00cf91a3260d425a6
crate over


--------------------------------------------------------------------------------------
[-]lic_key: b'0000000000000000'
[-]lic_encinfo: b'/GlIq2aq6UUt094yBs1I47c+mUBn0hKcQUe5QEDIA5GnaBpCTbn6AVoxjrnm7DS2p57PruH0w7GdiCThyz+gq1Z4LiEvncWJXf+LXWt4wVI='
[+]license info: b'03-20-2023:01-01-3000:ikun:ikun@kunkun.com:Sing and dance rap basketball'
[+]calc_payload_key:
        [-]part1: b'UWH8RWoC7hYUOljPOXRwLg++'
        [-]part2: b'-AGq869r8mXNeZIlMN4cOm5YA2y8GYxeZirHKyqDs:VafeDB8DrpIKOgoMaKfBqrtzryzGzChwiasJpQlyKK4DjTbeVMg1Lo0V9cIB2z0-ljUH57sCgWBpbXPLUeQUCXiuqpIb8XYqgv-VeDpxYXbw++'
        [+]xmodlib key: b'yRmbUFuqCA9IPwNq+HPrmXQ6Lyn01qgp+DjzkdBXgRyctfI+7TG+VYhJZeFYVZ2dQRmbmnNH57jzNuW2ub2hZ7Hc4fFZ38R0d6A4eq6Sc5q0/+B2vDG2WenXiv9uc57lvbDWV97LLy3Rq9eNWbKze74RCxz3h0uz/aDXwxSGfLaFkdpO5ta0GqX1Eu/y7gJlm4jqXsCrvPYSdSGd8RBqRPRoC+Y96lh8QNWYmXktAtS2EvZlWa7o0Wu1qroiv5Li'
[-]end_time_bin: 010000001608f0c30000000000ffff
[-]end_time: 3000-01-01 00:00:00.000000000 UTC
dec over!
"""

ps

没有实际功能!

image-20250219231430079

没有实际功能!没有实际功能!没有实际功能!

posted @ 2025-02-19 23:42  DirWangK  阅读(567)  评论(1)    收藏  举报