import
os, sys
import
random
import
time
import
hashlib
log256_26
=
[
2
,
4
,
6
,
7
]
APP_VERSION_LIST
=
{
"OmniFocus v3"
:
0xe
,
"OmniFocus Pro v3"
:
0xf
,
"OmniGraffle v7"
:
9
,
"OmniGraffle Pro v7"
:
8
,
"OmniOutliner Essentials v5"
:
0xc
,
"OmniOutliner Pro v5"
:
0xd
,
"OmniPlan v3"
:
6
,
"OmniPlan Pro v3"
:
7
}
APP_UID_LIST
=
[
1000205
,
1000216
,
1000215
,
1000200
,
1000211
,
1000210
,
1000219
,
1000220
,
1000221
,
1000222
,
1000212
,
1000209
,
1000224
,
1000223
,
1000228
,
1000226
,
1000214
,
1000208
,
1000207
,
1000197
]
APP_CONST_LIST
=
[
0x8F
,
0x0E0
,
0x1F
,
0x81
,
0x36
,
0x28
,
0x9B
,
0x0D1
,
0x45
,
0x0A3
,
0x1E
,
0x0C7
,
0x0B2
,
0x56
,
0x0BE
,
0x0E7
,
0x42
,
0x96
,
0x7E
,
0x0E9
,
0x0DD
,
0x18
,
0x56
,
0x0E8
,
0x80
,
0x0CF
,
0x8E
,
0x0E5
,
0x0BF
,
0x0FF
,
0x0B1
,
0x0BB
,
0x39
,
0x63
,
0x0C0
,
0x57
,
0x0C6
,
0x0EA
,
0x0D1
,
0x0B5
,
0x0C0
,
0x0A2
,
0x0F2
,
0x0E4
,
0x0CD
,
0x0E9
,
0x0FF
,
0x39
,
0x59
,
0x0F
,
0x79
,
0x0DB
,
0x0D7
,
0x29
,
0x0A7
,
0x68
,
0x0D4
,
0x68
,
0x48
,
0x16
,
0x0
,
0x15
,
0x3A
,
0x0A9
,
0x17
,
0x0D
,
0x5
,
0x6E
,
0x75
,
0x2F
,
0x54
,
0x0AD
,
0x0B6
,
0x72
,
0x0E5
,
0x0E4
,
0x0EB
,
0x9C
,
0x0C7
,
0x75
,
0x0BA
,
0x72
,
0x0F2
,
0x6
,
0x99
,
0x8B
,
0x4D
,
0x4B
,
0x46
,
0x17
,
0x0CD
,
0x0A
,
0x0E1
,
0x0E0
,
0x82
,
0x88
,
0x0FB
,
0x27
,
0x0D8
,
0x0B7
,
0x87
,
0x0D6
,
0x87
,
0x4B
,
0x91
,
0x9
,
0x0A6
,
0x54
,
0x32
,
0x0E6
,
0x0A0
,
0x48
,
0x0F2
,
0x0E4
,
0x7E
,
0x0E
,
0x82
,
0x9E
,
0x17
,
0x0A7
,
0x35
,
0x0CF
,
0x0EC
,
0x5C
,
0x0C1
,
0x0A7
,
0x0F1
,
0x0C9
,
0x23
,
0x0F4
,
0x21
,
0x96
,
0x0C3
,
0x0A7
,
0x60
,
0x0E0
,
0x27
,
0x0EF
,
0x0A4
,
0x17
,
0x0B4
,
0x33
,
0x52
,
0x3C
,
0x1F
,
0x0DA
,
0x11
,
0x0C7
,
0x12
,
0x32
,
0x0A2
,
0x1A
,
0x0B0
,
0x6F
,
0x0F9
,
0x3F
,
0x89
,
0x8
,
0x0C
,
0x6C
,
0x1
,
0x0F1
,
0x0C2
,
0x8D
,
0x0C6
,
0x60
,
0x46
,
0x55
,
0x0D9
,
0x2C
,
0x10
,
0x0B3
,
0x7C
,
0x14
,
0x0E5
,
0x38
,
0x52
,
0x39
,
0x0B
,
0x2A
,
0x3E
,
0x0E2
,
0x65
,
0x30
,
0x8
,
0x0B2
,
0x0A3
,
0x0D6
,
0x96
,
0x40
,
0x72
,
0x0D6
,
0x14
,
0x5B
,
0x5F
,
0x0D2
,
0x91
,
0x0B6
,
0x51
,
0x42
,
0x4C
,
0x0BF
,
0x8A
,
0x0BE
,
0x0A1
,
0x7D
,
0x2F
,
0x6
,
0x36
,
0x0B9
,
0x0FD
,
0x26
,
0x81
,
0x0C3
,
0x0E8
,
0x90
,
0x55
,
0x7E
,
0x8D
,
0x7
,
0x0B0
,
0x2A
,
0x8B
,
0x0B5
,
0x37
,
0x0BE
,
0x0C1
,
0x85
,
0x0EC
,
0x8
,
0x2C
,
0x0FE
,
0x0B9
,
0x2F
,
0x0B0
,
0x0FC
,
0x42
,
0x6F
,
0x61
,
0x0BC
,
0x6F
,
0x81
,
0x0D1
,
0x92
,
0x13
,
0x68
,
0x0A3
,
0x0DE
,
0x75
,
0x0D4
,
0x0F6
,
0x0CC
,
0x46
,
0x69
,
0x52
,
0x4D
,
0x53
,
0x7B
,
0x91
,
0x0B7
,
0x39
,
0x17
,
0x7E
,
0x0A3
,
0x6
,
0x7
,
0x8F
,
0x47
,
0x8E
,
0x88
,
0x61
,
0x0C0
,
0x0F6
,
0x0C9
,
0x64
,
0x7E
,
0x4B
,
0x0D0
,
0x89
,
0x0B3
,
0x79
,
0x89
,
0x2E
,
0x3C
,
0x17
,
0x3E
,
0x0BB
,
0x0C4
,
0x0E9
,
0x0DB
,
0x68
,
0x91
,
0x15
,
0x1F
,
0x0F2
,
0x0B4
,
0x47
,
0x2B
,
0x7
,
0x63
,
0x9B
,
0x0A2
,
0x71
,
0x0E9
,
0x0E6
,
0x3A
,
0x1B
,
0x5C
,
0x0F6
,
0x5
,
0x0F8
,
0x3F
,
0x8B
,
0x6E
,
0x8E
,
0x0D6
,
0x8C
,
0x0B2
,
0x90
,
0x0F7
,
0x0A5
,
0x0D
,
0x2
,
0x0B8
,
0x0AC
,
0x0E3
,
0x0F2
,
0x0C6
,
0x82
,
0x0C5
,
0x1E
,
0x8E
,
0x4C
,
0x64
,
0x0EE
,
0x9A
,
0x8
,
0x5D
,
0x77
,
0x0D5
,
0x28
,
0x7E
,
0x72
,
0x0B4
,
0x58
,
0x0BA
,
0x0DD
,
0x0F5
,
0x0B2
,
0x48
,
0x6C
,
0x8
,
0x0ED
,
0x0D0
,
0x3C
,
0x0
,
0x7F
,
0x0FD
,
0x0D5
,
0x1C
,
0x73
,
0x91
,
0x0CB
,
0x4E
,
0x24
,
0x0B3
,
0x0F6
,
0x0FB
,
0x0E5
,
0x90
,
0x4A
,
0x0A8
,
0x86
,
0x22
,
0x79
,
0x0F6
,
0x1E
,
0x0E2
,
0x0A1
,
0x18
,
0x0E4
,
0x0A3
,
0x17
,
0x0AB
,
0x0B7
,
0x99
,
0x0C4
,
0x8F
,
0x67
,
0x0F2
,
0x0FD
,
0x7B
,
0x0BF
,
0x4E
,
0x4B
,
0x71
,
0x0D7
,
0x0C0
,
0x29
,
0x4C
]
def
ascii26str(data_bytes: bytes):
data_length
=
len
(data_bytes)
sepchar
=
''
if
data_length
=
=
0
:
return
sepchar
tmpi
=
0
tmpv
=
0
data_cursor
=
0
buffer
=
[
0
]
*
48
buffer_cursor
=
0
sbuff
=
[
0
]
*
8
restult_str
=
''
while
data_length >
0
:
data_length
-
=
1
tmpv
=
((data_bytes[data_cursor] | (tmpv <<
8
) &
0xffffffff
)) &
0xffffffffffffffff
if
tmpi
=
=
3
:
sbuff
=
[
0
]
*
8
j
=
logv
=
7
sbuff_i
=
0
while
j >
0
:
rdx
=
(((
0x4EC4EC4EC4EC4EC5
*
tmpv) >>
64
) >>
3
) &
0xffffffffffffffff
eax
=
(rdx
*
5
) &
0xffffffff
eax
=
(eax
*
5
) &
0xffffffff
eax
=
(eax
+
rdx) &
0xffffffff
sbuff[
7
-
j]
=
(tmpv
-
eax) &
0xff
tmpv
=
rdx
j
-
=
1
i
=
0
buffer_cursor
=
0
while
i !
=
-
7
:
buffer
[buffer_cursor]
=
(sbuff[
7
+
i
-
1
]
+
65
) &
0xff
buffer_cursor
+
=
1
i
-
=
1
i
=
0
while
buffer
[i] !
=
0
:
restult_str
+
=
chr
(
buffer
[i])
i
+
=
1
tmpv
=
0
tmpi
=
0
else
:
tmpi
+
=
1
data_cursor
+
=
1
if
tmpi >
0
:
sbuff
=
[
0
]
*
8
sbuff_i
=
0
tmpi1v
=
tmp1v
=
log256_26[tmpi
-
1
]
while
tmp1v >
0
:
rdx
=
(((
0x4EC4EC4EC4EC4EC5
*
tmpv) >>
64
) >>
3
) &
0xffffffffffffffff
eax
=
(rdx
*
5
) &
0xffffffff
eax
=
(eax
*
5
) &
0xffffffff
eax
=
(eax
+
rdx) &
0xffffffff
sbuff[sbuff_i]
=
(tmpv
-
eax) &
0xff
sbuff_i
+
=
1
tmpv
=
rdx
tmp1v
-
=
1
buffer_cursor
=
0
negtmp1v
=
-
log256_26[tmpi
-
1
]
p
=
0
while
p !
=
negtmp1v:
buffer
[buffer_cursor]
=
(sbuff[tmpi1v
+
p
-
1
]
+
65
) &
0xff
buffer_cursor
+
=
1
p
-
=
1
i
=
0
while
buffer
[i] !
=
0
:
restult_str
+
=
chr
(
buffer
[i])
i
+
=
1
return
restult_str
def
createSerial(username
=
"Simon Huang"
, napp_id
=
8
, dbgRandList
=
None
):
if
username
is
None
or
len
(username.strip())
=
=
0
:
username
=
"Simon Huang"
joinedName
=
''
for
achr
in
username:
if
achr.isalpha()
or
achr.isnumeric():
joinedName
+
=
achr
joinedNameLen
=
len
(joinedName)
randvalue
=
random.randint(
0
,
0xff
)
if
dbgRandList:
randvalue
=
dbgRandList[
0
]
md2
=
[
0
]
*
32
i
=
0
while
i !
=
4
:
md2[i
+
5
]
=
randvalue
randvalue
=
random.randint(
0
,
0xff
)
if
dbgRandList:
randvalue
=
dbgRandList[i
+
1
]
i
+
=
1
md2[
9
]
=
randvalue
randvalue
=
random.randint(
0
,
0xff
)
if
dbgRandList:
randvalue
=
dbgRandList[
5
]
md2[
10
]
=
randvalue &
3
md2[
11
]
=
0xff
md2[
12
]
=
0xff
len8data
=
md2[
5
:
5
+
8
]
len8str
=
ascii26str(len8data)
len8str_04
=
len8str[
0
:
0
+
4
]
len8str_44
=
len8str[
4
:
4
+
4
]
len8str_84
=
len8str[
8
:
8
+
4
]
len8str_122
=
len8str[
12
:
12
+
2
]
formatedLic
=
"%s-%s-%s-%s"
%
(len8str_04, len8str_44, len8str_84, len8str_122)
idLicNameStr
=
"%u%s%s"
%
(APP_UID_LIST[napp_id], formatedLic, joinedName)
idLicNameStrUtf8
=
idLicNameStr.encode(
'utf8'
)
idLicNameBytes
=
idLicNameStrUtf8
md
=
list
(hashlib.sha1(idLicNameBytes).digest())
appConstOffset
=
20
*
napp_id
j
=
0
while
j !
=
20
:
md[j] ^
=
APP_CONST_LIST[appConstOffset
+
j]
j
+
=
1
k
=
0
while
k !
=
5
:
md[k] ^
=
md[k
+
15
] ^ md[k
+
10
] ^ md[k
+
5
]
k
+
=
1
i
=
0
while
i <
5
:
md2[i]
=
md[i]
i
+
=
1
if
joinedNameLen >
0
:
n
=
0
while
n !
=
13
:
md2[n]
=
(~(md2[n] ^
ord
(joinedName[(n
%
joinedNameLen)]))) &
0xff
n
+
=
1
md2len13d
=
md2[:
13
]
md2len13dStr
=
ascii26str(md2len13d)
insert_pos
=
[
24
,
20
,
16
,
12
,
8
,
4
]
for
apos
in
insert_pos:
md2len13dStr
=
md2len13dStr[:apos]
+
"-"
+
md2len13dStr[apos:]
serial
=
md2len13dStr[:
-
1
]
return
(username, serial)
if
__name__
=
=
'__main__'
:
username
=
input
(
"Please input your username:"
)
for
app
in
APP_VERSION_LIST:
appUid
=
APP_VERSION_LIST[app]
license
=
createSerial(username
=
username, napp_id
=
appUid)
print
(license,
'\tfor\t'
, app)