-
-
2024春秋杯网络安全联赛冬季赛 RE所有题目WP
-
发表于: 2025-2-26 21:05 7787
-
第一次在看雪发复现的完整比赛WP,望大佬们轻喷菜鸡
学习到了新的知识:断点检测0xcc(后面Hgame里又碰到了类似的题目)
custom_md5_init里很关键,发现对文件函数内容做了md5加密,位置为custom_md5_init + 1024后
为了保证动态调试获取正确的srand seed值,需要保证断点下在custom_md5_init函数前,查看汇编代码发现只有main函数在前头,因此只需在这里下断点,然后xor_string_with_rand下个断点打印rand()%127值
直接脚本异或获取flag
ida反编译的是假flag逻辑,查看汇编代码发现有花指令,大部分是jz、jnz,直接nop
真正函数逻辑如下
sub_4012AD是rc4加密,里面的异或魔改为减法操作,注意Str已经被hook替换掉了
第一天的题发现直接其实早就出了,没读好题,爆破出来的key为oadi,输入发现有提示only xxx can get right flag啥的以为做的不对,结果最后才发现zip早就正确还原了
函数逻辑为:
由于key只有四位可以爆破,检查最终前四位是zip文件头504b0304即可
得到key值直接运行main输入即可得到正确zip,里面就是flag
虽然对控制流进行了混淆,但还是可以看出来是tea类型的魔改加密,但挺让人恼火的是他魔改有点太狠了
只能动态调试一步步看,纯考验调试耐心了,这是我当时记下来的加密流程
比赛后复现wp发现几乎接近了,还是key那里的操作没搞懂;然后最后xtea加密完的结果前四字节做了字节替换,因此逆向要先把字节替换还原再xtea解密
jeb反编译可知检查了用户名和密码,其中用户名调用so文件来检查,ida分析可知是des加密,里面的各种盒全被魔改了
借着chatgpt好不容易实现了个可以用的python脚本,易知用户名为'7d77cfe8'
checkpassword是skip32算法,要注意的是算法类里的FTABLE被jni hook替换了,还是借助try进行了隐藏
。
frida已会一点:
解密脚本很简单,skip32就是对称加密,只需要把skip32最后一个参数设置为0即可进行解密
最终答案是flag{username+password}
纯恶心人的,上千行main只能动态一点点调试分析,也没啥逆向技术含金量
我把大概加密流程贴出来
输入字符串
检查长度30(输入a4来测试)
此时只需要关注这个qword,发现他做的运算如下
正好两两一组,相当于做了哈希
后面有15组比较
到这里就明了了,测试下发现正好是逆序
ok爆破启动
首先题目给的exe会在C:\Users\xxx\AppData\Local\Temp\onefile_xxxx\
下生成新的exe以及python dll,查看可知程序是python打包过来的
还是动态调试不停的找输入点如下,这个函数里有“input”字符串且动调这里输入(测试字符为aaaaaaa),因此合理猜测当前函数是主函数
往下动调发现len函数
接着是cmp函数,发现要求输入长度为40否则v14、v15为0,进入if打印wrong并退出
重新输入40个a测试,发现进入大循环,下图这里出现了取值操作
重复40次出来跑一段代码后再次进入新的while循环,碰到from_bytes
然后是little,基本可以推测出来int.from_bytes(bytes, "little")
发现v63很可能是上面操作的返回值,但是值不是aaaa
结合wp查了下。cython里貌似是30bits,所以0121相当于二进制00000001 00100001,本来是01100001,多出来的一位单独开了1字节
走完这个循环就是把40字节转为了10个unsigned int,一直走直到在进入一个循环,在里面发现了两个取值函数,取出0x61616161和0xf5138033(已转化)
两个值都传入了sub_7FF612F401D0,看下函数里面的实现发现,确定是异或操作
在下面的v100里找到了异或后的值
wp说的这两个一个异或值一个比较值列表,确实能找到列表里的值,但不知道怎么提取,只能硬扣了
总结下这种题做法:动态调试找输入点;找规律确定关键处理函数(有大段无用代码);函数处理完返回值点进去找数据
很不喜欢这类题,感觉还没找到真正的做法,这题还是看着wp一点点猜函数和数据的才做出来的
题目给了pyd和python脚本,脚本调用了pyd
定位encrypt.check函数(直接搜字符串交叉引用)
里面就一点点扣,找交叉引用
写个python正向+逆向脚本即可
0解题,但我花了一下午做出来,当时没去看很可惜了
这道题一看到pyhumor我就想起来TFCCTF 2024的一道题目,当时以为特别难没去做,给了pyd还有什么pytransform
但是我去使用pyarmor-unpacker方法3发现导出的pyc没法反编译,试了很久都不行还github找了很多其他工具都不管用,最后就去尝试pyarmor-unpacker里的方法2注入dll竟然发现可以了
需要:
运行完后可以拿到pyc且反编译成功拿到源码
前半部分是校验,后面是加密
需要patch下花指令,两种
patch完可以很明显看出来是控制流平坦化,但是D810不知道为啥没法用,只能硬分析,发现两处地方改变输入值
第一个函数里有rc4的字样,猜测单字节加密,测试下
没问题,而且ord("a")^ord("d")==ord("b")^ord("g"),基本确定里面最后相当于异或,第二个加密分析同理
因此可以直接计算出异或值,找到最终cmp的值即可
分析16位汇编码
借助deepseek直接分析出来,先是冒泡排序2开始的数组,word为单位;然后异或输入并比较
必须得动态调试,直接读有点困难(linux装个conda,配好python3.8,跑起来输入先不回车,然后ida附加python进程,F9跑到没法跑,输入按下回车即可断在下的断点代码位置,这里我在所有包含vm的操作里下了断点,主要是那些调用api位置的地方)
找到了比较位置,还是核心api richcompare,里面v8和v10都是结构体得下拉24字节才能找到要比较的字节
没什么好思路,vm.opcode又看不太懂只能手扣代码值
手动太慢了,还是得试试idapython,下条件断点在python api上,获取寄存器值并访问打印对应的数据
比较强制跳转保证始终为True(动调的时候去改,在vm_execute刚开始下个断点,然后去vm_be里nop掉这个jz确保if进不去,然后取消vm_execute上的断点清空控制台,F9直接打印出来整个加密流程)
Perfect!效率大大提高不需要手动在那调试和查看值了,和前面一模一样
提取下abc反编译(下面只保留了关键代码)
简单分析下可知sm4加密魔改了
这个比赛的re出的还是相当不错的,开学到现在才断断续续复现完所有题目,里面有不少python相关题目,趁着这个机会学习了新知识,也尝试了用自己方法做出来好几道题目
unsigned
__int64
main_program()
{
unsigned
int
seed[2];
// [rsp+20h] [rbp-80h] BYREF
__int64
v2;
// [rsp+28h] [rbp-78h]
char
s[48];
// [rsp+30h] [rbp-70h] BYREF
char
s1[56];
// [rsp+60h] [rbp-40h] BYREF
unsigned
__int64
v5;
// [rsp+98h] [rbp-8h]
v5 = __readfsqword(0x28u);
*(_QWORD *)seed = 0LL;
v2 = 0LL;
custom_md5_init(seed);
srand
(seed[0]);
printf
(
"Enter input: "
);
fgets
(s, 43, stdin);
if
(
strlen
(s) == 42 )
{
memset
(s1, 0, 0x2BuLL);
xor_string_with_rand(s, s1);
if
( !
memcmp
(s1, &ida_chars, 0x2BuLL) )
puts
(
"right"
);
else
puts
(
"wrong"
);
}
else
{
puts
(
"Invalid input length."
);
}
return
v5 - __readfsqword(0x28u);
}
void
__fastcall xor_string_with_rand(
__int64
a1,
__int64
a2)
{
int
i;
// [rsp+18h] [rbp-8h]
for
( i = 0; i <= 41; ++i )
*(_BYTE *)(i + a2) = (
rand
() % 127) ^ *(_BYTE *)(i + a1);
}
unsigned
__int64
main_program()
{
unsigned
int
seed[2];
// [rsp+20h] [rbp-80h] BYREF
__int64
v2;
// [rsp+28h] [rbp-78h]
char
s[48];
// [rsp+30h] [rbp-70h] BYREF
char
s1[56];
// [rsp+60h] [rbp-40h] BYREF
unsigned
__int64
v5;
// [rsp+98h] [rbp-8h]
v5 = __readfsqword(0x28u);
*(_QWORD *)seed = 0LL;
v2 = 0LL;
custom_md5_init(seed);
srand
(seed[0]);
printf
(
"Enter input: "
);
fgets
(s, 43, stdin);
if
(
strlen
(s) == 42 )
{
memset
(s1, 0, 0x2BuLL);
xor_string_with_rand(s, s1);
if
( !
memcmp
(s1, &ida_chars, 0x2BuLL) )
puts
(
"right"
);
else
puts
(
"wrong"
);
}
else
{
puts
(
"Invalid input length."
);
}
return
v5 - __readfsqword(0x28u);
}
void
__fastcall xor_string_with_rand(
__int64
a1,
__int64
a2)
{
int
i;
// [rsp+18h] [rbp-8h]
for
( i = 0; i <= 41; ++i )
*(_BYTE *)(i + a2) = (
rand
() % 127) ^ *(_BYTE *)(i + a1);
}
unsigned
__int64
__fastcall custom_md5_init(
__int64
a1)
{
char
v2[96];
// [rsp+20h] [rbp-470h] BYREF
char
v3[1032];
// [rsp+80h] [rbp-410h] BYREF
unsigned
__int64
v4;
// [rsp+488h] [rbp-8h]
v4 = __readfsqword(0x28u);
qmemcpy(v3, custom_md5_init, 0x400uLL);
MD5_Init(v2, (
char
*)custom_md5_init + 1024, 128LL);
MD5_Update(v2, v3, 1024LL);
MD5_Final(a1, v2);
return
v4 - __readfsqword(0x28u);
}
unsigned
__int64
__fastcall custom_md5_init(
__int64
a1)
{
char
v2[96];
// [rsp+20h] [rbp-470h] BYREF
char
v3[1032];
// [rsp+80h] [rbp-410h] BYREF
unsigned
__int64
v4;
// [rsp+488h] [rbp-8h]
v4 = __readfsqword(0x28u);
qmemcpy(v3, custom_md5_init, 0x400uLL);
MD5_Init(v2, (
char
*)custom_md5_init + 1024, 128LL);
MD5_Update(v2, v3, 1024LL);
MD5_Final(a1, v2);
return
v4 - __readfsqword(0x28u);
}
xor
=
[
58
,
26
,
43
,
31
,
110
,
0
,
50
,
69
,
82
,
68
,
34
,
85
,
58
,
55
,
125
,
67
,
123
,
35
,
82
,
28
,
96
,
70
,
10
,
7
,
86
,
56
,
114
,
121
,
16
,
29
,
82
,
74
,
47
,
117
,
97
,
22
,
117
,
20
,
92
,
65
,
88
,
118
]
cmp
=
[
0x5C
,
0x76
,
0x4A
,
0x78
,
0x15
,
0x62
,
0x05
,
0x7C
,
0x6B
,
0x21
,
0x40
,
0x66
,
0x5B
,
0x1A
,
0x48
,
0x7A
,
0x1E
,
0x46
,
0x7F
,
0x28
,
0x02
,
0x75
,
0x68
,
0x2A
,
0x34
,
0x0C
,
0x4B
,
0x1D
,
0x3D
,
0x2E
,
0x6B
,
0x7A
,
0x17
,
0x45
,
0x07
,
0x75
,
0x47
,
0x27
,
0x39
,
0x78
,
0x61
,
0x0B
]
for
i
in
range
(
42
):
print
(
chr
(xor[i] ^
cmp
[i]), end
=
"")
xor
=
[
58
,
26
,
43
,
31
,
110
,
0
,
50
,
69
,
82
,
68
,
34
,
85
,
58
,
55
,
125
,
67
,
123
,
35
,
82
,
28
,
96
,
70
,
10
,
7
,
86
,
56
,
114
,
121
,
16
,
29
,
82
,
74
,
47
,
117
,
97
,
22
,
117
,
20
,
92
,
65
,
88
,
118
]
cmp
=
[
0x5C
,
0x76
,
0x4A
,
0x78
,
0x15
,
0x62
,
0x05
,
0x7C
,
0x6B
,
0x21
,
0x40
,
0x66
,
0x5B
,
0x1A
,
0x48
,
0x7A
,
0x1E
,
0x46
,
0x7F
,
0x28
,
0x02
,
0x75
,
0x68
,
0x2A
,
0x34
,
0x0C
,
0x4B
,
0x1D
,
0x3D
,
0x2E
,
0x6B
,
0x7A
,
0x17
,
0x45
,
0x07
,
0x75
,
0x47
,
0x27
,
0x39
,
0x78
,
0x61
,
0x0B
]
for
i
in
range
(
42
):
print
(
chr
(xor[i] ^
cmp
[i]), end
=
"")
int
__cdecl sub_402B60(
int
a1,
signed
int
Size)
{
char
v3;
// [esp+0h] [ebp-124h]
signed
int
i;
// [esp+D0h] [ebp-54h]
_BYTE *v5;
// [esp+DCh] [ebp-48h]
char
v6[14];
// [esp+E8h] [ebp-3Ch]
char
v7[38];
// [esp+F6h] [ebp-2Eh] BYREF
int
v8;
// [esp+11Ch] [ebp-8h]
v8 =
strlen
(Str);
v6[0] = 24;
v6[1] = -100;
v6[2] = 71;
v6[3] = 61;
v6[4] = 59;
v6[5] = -31;
v6[6] = 41;
v6[7] = 39;
v6[8] = -97;
v6[9] = 52;
v6[10] = -125;
v6[11] = -43;
v6[12] = -19;
v6[13] = -75;
qmemcpy(v7,
"nY"
, 2);
v7[2] = 127;
v7[3] = -34;
v7[4] = 71;
v7[5] = -41;
v7[6] = 101;
v7[7] = 63;
v7[8] = 122;
v7[9] = 51;
v7[10] = 91;
v7[11] = 100;
v7[12] = -74;
v7[13] = -6;
v7[14] = -108;
v7[15] = 85;
v7[16] = -121;
v7[17] = 66;
v7[18] = 32;
v7[19] = 6;
v7[20] = 12;
v7[21] = 105;
v7[22] = -2;
v7[23] = 114;
v7[24] = -87;
v7[25] = -28;
v7[26] = -47;
v7[27] = 124;
v5 =
malloc
(Size);
if
( !v5 )
return
-1;
sub_4012AD(a1, (
int
)v5, Size, (
int
)Str, v8);
for
( i = 0; i < Size; ++i )
{
if
( v6[i] != v5[i] )
return
0;
}
sub_401096(
"yes"
, v3);
return
Size;
}
int
__cdecl sub_402B60(
int
a1,
signed
int
Size)
{
char
v3;
// [esp+0h] [ebp-124h]
signed
int
i;
// [esp+D0h] [ebp-54h]
_BYTE *v5;
// [esp+DCh] [ebp-48h]
char
v6[14];
// [esp+E8h] [ebp-3Ch]
char
v7[38];
// [esp+F6h] [ebp-2Eh] BYREF
int
v8;
// [esp+11Ch] [ebp-8h]
v8 =
strlen
(Str);
v6[0] = 24;
v6[1] = -100;
v6[2] = 71;
v6[3] = 61;
v6[4] = 59;
v6[5] = -31;
v6[6] = 41;
v6[7] = 39;
v6[8] = -97;
v6[9] = 52;
v6[10] = -125;
v6[11] = -43;
v6[12] = -19;
v6[13] = -75;
qmemcpy(v7,
"nY"
, 2);
v7[2] = 127;
v7[3] = -34;
v7[4] = 71;
v7[5] = -41;
v7[6] = 101;
v7[7] = 63;
v7[8] = 122;
v7[9] = 51;
v7[10] = 91;
v7[11] = 100;
v7[12] = -74;
v7[13] = -6;
v7[14] = -108;
v7[15] = 85;
v7[16] = -121;
v7[17] = 66;
v7[18] = 32;
v7[19] = 6;
v7[20] = 12;
v7[21] = 105;
v7[22] = -2;
v7[23] = 114;
v7[24] = -87;
v7[25] = -28;
v7[26] = -47;
v7[27] = 124;
v5 =
malloc
(Size);
if
( !v5 )
return
-1;
sub_4012AD(a1, (
int
)v5, Size, (
int
)Str, v8);
for
( i = 0; i < Size; ++i )
{
if
( v6[i] != v5[i] )
return
0;
}
sub_401096(
"yes"
, v3);
return
Size;
}
def
KSA(key):
""" Key-Scheduling Algorithm (KSA) 密钥调度算法"""
S
=
list
(
range
(
256
))
j
=
0
for
i
in
range
(
256
):
j
=
(j
+
S[i]
+
key[i
%
len
(key)])
%
256
S[i], S[j]
=
S[j], S[i]
return
S
def
PRGA(S):
""" Pseudo-Random Generation Algorithm (PRGA) 伪随机数生成算法"""
i, j
=
0
,
0
while
True
:
i
=
(i
+
1
)
%
256
j
=
(j
+
S[i])
%
256
S[i], S[j]
=
S[j], S[i]
K
=
S[(S[i]
+
S[j])
%
256
]
yield
K
def
RC4(key, text):
""" RC4 encryption/decryption """
S
=
KSA(key)
keystream
=
PRGA(S)
res
=
[]
for
char
in
text:
res.append((char
+
next
(keystream))&
0xff
)
return
bytes(res)
key
=
b
"DDDDAAAASSSS"
text
=
[
24
,
-
100
,
71
,
61
,
59
,
-
31
,
41
,
39
,
-
97
,
52
,
-
125
,
-
43
,
-
19
,
-
75
,
ord
(
"n"
),
ord
(
"Y"
),
127
,
-
34
,
71
,
-
41
,
101
,
63
,
122
,
51
,
91
,
100
,
-
74
,
-
6
,
-
108
,
85
,
-
121
,
66
,
32
,
6
,
12
,
105
,
-
2
,
114
,
-
87
,
-
28
,
-
47
,
124
]
print
(RC4(key, text).decode())
def
KSA(key):
""" Key-Scheduling Algorithm (KSA) 密钥调度算法"""
S
=
list
(
range
(
256
))
j
=
0
for
i
in
range
(
256
):
j
=
(j
+
S[i]
+
key[i
%
len
(key)])
%
256
S[i], S[j]
=
S[j], S[i]
return
S
def
PRGA(S):
""" Pseudo-Random Generation Algorithm (PRGA) 伪随机数生成算法"""
i, j
=
0
,
0
while
True
:
i
=
(i
+
1
)
%
256
j
=
(j
+
S[i])
%
256
S[i], S[j]
=
S[j], S[i]
K
=
S[(S[i]
+
S[j])
%
256
]
yield
K
def
RC4(key, text):
""" RC4 encryption/decryption """
S
=
KSA(key)
keystream
=
PRGA(S)
res
=
[]
for
char
in
text:
res.append((char
+
next
(keystream))&
0xff
)
return
bytes(res)
key
=
b
"DDDDAAAASSSS"
text
=
[
24
,
-
100
,
71
,
61
,
59
,
-
31
,
41
,
39
,
-
97
,
52
,
-
125
,
-
43
,
-
19
,
-
75
,
ord
(
"n"
),
ord
(
"Y"
),
127
,
-
34
,
71
,
-
41
,
101
,
63
,
122
,
51
,
91
,
100
,
-
74
,
-
6
,
-
108
,
85
,
-
121
,
66
,
32
,
6
,
12
,
105
,
-
2
,
114
,
-
87
,
-
28
,
-
47
,
124
]
print
(RC4(key, text).decode())
from
base64
import
b64encode
from
itertools
import
product
from
string
import
ascii_letters, digits
c
=
list
(ascii_letters
+
digits)
xor
=
[
0x0000000000000001
,
0x0000000000000057
,
0x000000000000002C
,
0x000000000000007C
,
0x00000000000000C7
,
0x0000000000000072
,
0x0000000000000020
,
0x0000000000000070
,
0x00000000000000A5
,
0x0000000000000096
,
0x0000000000000021
,
0x00000000000000DC
,
0x00000000000000A8
,
0x0000000000000076
,
0x0000000000000069
,
0x0000000000000014
,
0x00000000000000C5
,
0x0000000000000024
,
0x0000000000000025
,
0x0000000000000002
,
0x00000000000000B7
,
0x000000000000007A
,
0x00000000000000FC
,
0x00000000000000F0
,
0x00000000000000C4
,
0x0000000000000049
,
0x0000000000000056
,
0x00000000000000C2
,
0x00000000000000C1
,
0x0000000000000095
,
0x00000000000000EC
,
0x0000000000000026
,
0x00000000000000CC
,
0x00000000000000F7
,
0x00000000000000FF
,
0x0000000000000073
,
0x00000000000000E1
,
0x000000000000003F
,
0x0000000000000084
,
0x0000000000000046
,
0x00000000000000A9
,
0x00000000000000F9
,
0x000000000000003D
,
0x000000000000000E
,
0x0000000000000045
,
0x00000000000000F1
,
0x00000000000000DA
,
0x0000000000000092
,
0x00000000000000CE
,
0x000000000000003B
,
0x000000000000003C
,
0x00000000000000A0
,
0x0000000000000016
,
0x00000000000000BC
,
0x000000000000002D
,
0x00000000000000BD
,
0x00000000000000A4
,
0x0000000000000032
,
0x0000000000000090
,
0x0000000000000062
,
0x000000000000009D
,
0x000000000000000C
,
0x00000000000000DE
,
0x00000000000000AD
,
0x0000000000000040
,
0x00000000000000CF
,
0x000000000000004B
,
0x000000000000004D
,
0x000000000000006E
,
0x0000000000000079
,
0x00000000000000C8
,
0x0000000000000085
,
0x00000000000000D2
,
0x00000000000000AC
,
0x0000000000000099
,
0x00000000000000E8
,
0x000000000000001E
,
0x00000000000000C9
,
0x00000000000000D4
,
0x0000000000000006
,
0x0000000000000034
,
0x0000000000000066
,
0x00000000000000B8
,
0x00000000000000D3
,
0x0000000000000013
,
0x00000000000000F4
,
0x0000000000000042
,
0x000000000000001B
,
0x0000000000000063
,
0x000000000000005F
,
0x0000000000000082
,
0x000000000000005B
,
0x0000000000000091
,
0x000000000000002A
,
0x0000000000000033
,
0x000000000000005D
,
0x00000000000000B9
,
0x000000000000007D
,
0x00000000000000D5
,
0x000000000000006C
,
0x000000000000000D
,
0x0000000000000028
,
0x0000000000000008
,
0x000000000000009B
,
0x0000000000000018
,
0x000000000000002E
,
0x00000000000000A2
,
0x0000000000000067
,
0x000000000000005A
,
0x00000000000000E6
,
0x000000000000008A
,
0x0000000000000019
,
0x0000000000000050
,
0x000000000000009C
,
0x00000000000000B1
,
0x00000000000000EF
,
0x000000000000001F
,
0x0000000000000012
,
0x00000000000000BA
,
0x0000000000000086
,
0x0000000000000083
,
0x0000000000000077
,
0x0000000000000060
,
0x0000000000000094
,
0x00000000000000FD
,
0x00000000000000F6
,
0x0000000000000054
,
0x00000000000000BF
,
0x00000000000000A1
,
0x0000000000000093
,
0x0000000000000003
,
0x00000000000000E7
,
0x0000000000000058
,
0x00000000000000E5
,
0x000000000000009A
,
0x000000000000007F
,
0x0000000000000022
,
0x00000000000000BE
,
0x00000000000000D9
,
0x0000000000000038
,
0x0000000000000027
,
0x0000000000000065
,
0x00000000000000D7
,
0x0000000000000023
,
0x00000000000000FB
,
0x0000000000000071
,
0x00000000000000FA
,
0x000000000000008F
,
0x00000000000000F5
,
0x000000000000006D
,
0x0000000000000051
,
0x000000000000009E
,
0x00000000000000D6
,
0x000000000000008B
,
0x0000000000000089
,
0x0000000000000011
,
0x00000000000000CA
,
0x000000000000000F
,
0x000000000000008E
,
0x00000000000000CB
,
0x00000000000000B3
,
0x00000000000000BB
,
0x00000000000000F2
,
0x0000000000000087
,
0x0000000000000075
,
0x000000000000005C
,
0x000000000000002F
,
0x0000000000000098
,
0x000000000000002B
,
0x000000000000001C
,
0x00000000000000B4
,
0x00000000000000C6
,
0x000000000000000A
,
0x000000000000004C
,
0x0000000000000036
,
0x000000000000001A
,
0x0000000000000015
,
0x0000000000000088
,
0x000000000000001D
,
0x00000000000000E4
,
0x00000000000000C3
,
0x0000000000000097
,
0x0000000000000053
,
0x0000000000000030
,
0x000000000000004A
,
0x000000000000003A
,
0x00000000000000B5
,
0x0000000000000061
,
0x0000000000000055
,
0x00000000000000C0
,
0x00000000000000A7
,
0x00000000000000DB
,
0x0000000000000029
,
0x0000000000000068
,
0x00000000000000E2
,
0x00000000000000E0
,
0x0000000000000010
,
0x0000000000000009
,
0x0000000000000041
,
0x0000000000000031
,
0x00000000000000F3
,
0x00000000000000AF
,
0x00000000000000B6
,
0x000000000000006A
,
0x000000000000006F
,
0x0000000000000000
,
0x0000000000000005
,
0x000000000000000B
,
0x00000000000000E3
,
0x00000000000000D1
,
0x000000000000008D
,
0x0000000000000047
,
0x0000000000000074
,
0x0000000000000078
,
0x000000000000007B
,
0x0000000000000064
,
0x00000000000000DD
,
0x00000000000000AB
,
0x00000000000000B0
,
0x0000000000000039
,
0x0000000000000037
,
0x00000000000000FE
,
0x00000000000000ED
,
0x0000000000000052
,
0x00000000000000CD
,
0x0000000000000081
,
0x00000000000000F8
,
0x00000000000000AA
,
0x0000000000000048
,
0x000000000000006B
,
0x00000000000000D0
,
0x00000000000000EB
,
0x000000000000008C
,
0x0000000000000044
,
0x0000000000000059
,
0x0000000000000017
,
0x000000000000009F
,
0x000000000000004F
,
0x00000000000000B2
,
0x0000000000000035
,
0x00000000000000A3
,
0x000000000000007E
,
0x00000000000000EE
,
0x000000000000004E
,
0x00000000000000DF
,
0x00000000000000E9
,
0x0000000000000007
,
0x0000000000000043
,
0x00000000000000A6
,
0x00000000000000AE
,
0x00000000000000D8
,
0x00000000000000EA
,
0x0000000000000080
,
0x000000000000003E
,
0x0000000000000004
,
0x000000000000005E
]
print
(xor[
ord
(
"S"
)])
standard_base64_chars
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
custom_base64_chars
=
"TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
encode_map
=
{standard_base64_chars[i]: custom_base64_chars[i]
for
i
in
range
(
64
)}
with
open
(
"zip.zip"
,
"rb"
) as f:
data
=
f.read()
for
i
in
product(c, repeat
=
4
):
s
=
"".join(i)
encode_s
=
b64encode(s.encode()).decode()
encode_s
=
list
(''.join([encode_map.get(c, c)
for
c
in
encode_s]).encode())
for
j
in
range
(
8
):
if
encode_s[j] !
=
ord
(
"="
):
encode_s[j]
=
encode_s[j]^
12
encode_s[
0
] ^
=
2
encode_s[
2
] ^
=
2
encode_s[
3
] ^
=
5
encode_s[
4
] ^
=
5
encode_s[
5
] ^
=
2
encode_s[
7
] ^
=
2
new_data
=
[]
for
j
in
range
(
4
):
if
data[j]:
new_data.append(data[j] ^ xor[encode_s[j
%
8
]] ^ encode_s[j
%
8
] ^ encode_s[j
%
2
+
4
])
else
:
new_data.append(
0
)
if
new_data
=
=
[
0x50
,
0x4b
,
3
,
4
]:
print
("".join(i))
break
from
base64
import
b64encode
from
itertools
import
product
from
string
import
ascii_letters, digits
c
=
list
(ascii_letters
+
digits)
xor
=
[
0x0000000000000001
,
0x0000000000000057
,
0x000000000000002C
,
0x000000000000007C
,
0x00000000000000C7
,
0x0000000000000072
,
0x0000000000000020
,
0x0000000000000070
,
0x00000000000000A5
,
0x0000000000000096
,
0x0000000000000021
,
0x00000000000000DC
,
0x00000000000000A8
,
0x0000000000000076
,
0x0000000000000069
,
0x0000000000000014
,
0x00000000000000C5
,
0x0000000000000024
,
0x0000000000000025
,
0x0000000000000002
,
0x00000000000000B7
,
0x000000000000007A
,
0x00000000000000FC
,
0x00000000000000F0
,
0x00000000000000C4
,
0x0000000000000049
,
0x0000000000000056
,
0x00000000000000C2
,
0x00000000000000C1
,
0x0000000000000095
,
0x00000000000000EC
,
0x0000000000000026
,
0x00000000000000CC
,
0x00000000000000F7
,
0x00000000000000FF
,
0x0000000000000073
,
0x00000000000000E1
,
0x000000000000003F
,
0x0000000000000084
,
0x0000000000000046
,
0x00000000000000A9
,
0x00000000000000F9
,
0x000000000000003D
,
0x000000000000000E
,
0x0000000000000045
,
0x00000000000000F1
,
0x00000000000000DA
,
0x0000000000000092
,
0x00000000000000CE
,
0x000000000000003B
,
0x000000000000003C
,
0x00000000000000A0
,
0x0000000000000016
,
0x00000000000000BC
,
0x000000000000002D
,
0x00000000000000BD
,
0x00000000000000A4
,
0x0000000000000032
,
0x0000000000000090
,
0x0000000000000062
,
0x000000000000009D
,
0x000000000000000C
,
0x00000000000000DE
,
0x00000000000000AD
,
0x0000000000000040
,
0x00000000000000CF
,
0x000000000000004B
,
0x000000000000004D
,
0x000000000000006E
,
0x0000000000000079
,
0x00000000000000C8
,
0x0000000000000085
,
0x00000000000000D2
,
0x00000000000000AC
,
0x0000000000000099
,
0x00000000000000E8
,
0x000000000000001E
,
0x00000000000000C9
,
0x00000000000000D4
,
0x0000000000000006
,
0x0000000000000034
,
0x0000000000000066
,
0x00000000000000B8
,
0x00000000000000D3
,
0x0000000000000013
,
0x00000000000000F4
,
0x0000000000000042
,
0x000000000000001B
,
0x0000000000000063
,
0x000000000000005F
,
0x0000000000000082
,
0x000000000000005B
,
0x0000000000000091
,
0x000000000000002A
,
0x0000000000000033
,
0x000000000000005D
,
0x00000000000000B9
,
0x000000000000007D
,
0x00000000000000D5
,
0x000000000000006C
,
0x000000000000000D
,
0x0000000000000028
,
0x0000000000000008
,
0x000000000000009B
,
0x0000000000000018
,
0x000000000000002E
,
0x00000000000000A2
,
0x0000000000000067
,
0x000000000000005A
,
0x00000000000000E6
,
0x000000000000008A
,
0x0000000000000019
,
0x0000000000000050
,
0x000000000000009C
,
0x00000000000000B1
,
0x00000000000000EF
,
0x000000000000001F
,
0x0000000000000012
,
0x00000000000000BA
,
0x0000000000000086
,
0x0000000000000083
,
0x0000000000000077
,
0x0000000000000060
,
0x0000000000000094
,
0x00000000000000FD
,
0x00000000000000F6
,
0x0000000000000054
,
0x00000000000000BF
,
0x00000000000000A1
,
0x0000000000000093
,
0x0000000000000003
,
0x00000000000000E7
,
0x0000000000000058
,
0x00000000000000E5
,
0x000000000000009A
,
0x000000000000007F
,
0x0000000000000022
,
0x00000000000000BE
,
0x00000000000000D9
,
0x0000000000000038
,
0x0000000000000027
,
0x0000000000000065
,
0x00000000000000D7
,
0x0000000000000023
,
0x00000000000000FB
,
0x0000000000000071
,
0x00000000000000FA
,
0x000000000000008F
,
0x00000000000000F5
,
0x000000000000006D
,
0x0000000000000051
,
0x000000000000009E
,
0x00000000000000D6
,
0x000000000000008B
,
0x0000000000000089
,
0x0000000000000011
,
0x00000000000000CA
,
0x000000000000000F
,
0x000000000000008E
,
0x00000000000000CB
,
0x00000000000000B3
,
0x00000000000000BB
,
0x00000000000000F2
,
0x0000000000000087
,
0x0000000000000075
,
0x000000000000005C
,
0x000000000000002F
,
0x0000000000000098
,
0x000000000000002B
,
0x000000000000001C
,
0x00000000000000B4
,
0x00000000000000C6
,
0x000000000000000A
,
0x000000000000004C
,
0x0000000000000036
,
0x000000000000001A
,
0x0000000000000015
,
0x0000000000000088
,
0x000000000000001D
,
0x00000000000000E4
,
0x00000000000000C3
,
0x0000000000000097
,
0x0000000000000053
,
0x0000000000000030
,
0x000000000000004A
,
0x000000000000003A
,
0x00000000000000B5
,
0x0000000000000061
,
0x0000000000000055
,
0x00000000000000C0
,
0x00000000000000A7
,
0x00000000000000DB
,
0x0000000000000029
,
0x0000000000000068
,
0x00000000000000E2
,
0x00000000000000E0
,
0x0000000000000010
,
0x0000000000000009
,
0x0000000000000041
,
0x0000000000000031
,
0x00000000000000F3
,
0x00000000000000AF
,
0x00000000000000B6
,
0x000000000000006A
,
0x000000000000006F
,
0x0000000000000000
,
0x0000000000000005
,
0x000000000000000B
,
0x00000000000000E3
,
0x00000000000000D1
,
0x000000000000008D
,
0x0000000000000047
,
0x0000000000000074
,
0x0000000000000078
,
0x000000000000007B
,
0x0000000000000064
,
0x00000000000000DD
,
0x00000000000000AB
,
0x00000000000000B0
,
0x0000000000000039
,
0x0000000000000037
,
0x00000000000000FE
,
0x00000000000000ED
,
0x0000000000000052
,
0x00000000000000CD
,
0x0000000000000081
,
0x00000000000000F8
,
0x00000000000000AA
,
0x0000000000000048
,
0x000000000000006B
,
0x00000000000000D0
,
0x00000000000000EB
,
0x000000000000008C
,
0x0000000000000044
,
0x0000000000000059
,
0x0000000000000017
,
0x000000000000009F
,
0x000000000000004F
,
0x00000000000000B2
,
0x0000000000000035
,
0x00000000000000A3
,
0x000000000000007E
,
0x00000000000000EE
,
0x000000000000004E
,
0x00000000000000DF
,
0x00000000000000E9
,
0x0000000000000007
,
0x0000000000000043
,
0x00000000000000A6
,
0x00000000000000AE
,
0x00000000000000D8
,
0x00000000000000EA
,
0x0000000000000080
,
0x000000000000003E
,
0x0000000000000004
,
0x000000000000005E
]
print
(xor[
ord
(
"S"
)])
standard_base64_chars
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
custom_base64_chars
=
"TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
encode_map
=
{standard_base64_chars[i]: custom_base64_chars[i]
for
i
in
range
(
64
)}
with
open
(
"zip.zip"
,
"rb"
) as f:
data
=
f.read()
for
i
in
product(c, repeat
=
4
):
s
=
"".join(i)
encode_s
=
b64encode(s.encode()).decode()
encode_s
=
list
(''.join([encode_map.get(c, c)
for
c
in
encode_s]).encode())
for
j
in
range
(
8
):
if
encode_s[j] !
=
ord
(
"="
):
encode_s[j]
=
encode_s[j]^
12
encode_s[
0
] ^
=
2
encode_s[
2
] ^
=
2
encode_s[
3
] ^
=
5
encode_s[
4
] ^
=
5
encode_s[
5
] ^
=
2
encode_s[
7
] ^
=
2
new_data
=
[]
for
j
in
range
(
4
):
if
data[j]:
new_data.append(data[j] ^ xor[encode_s[j
%
8
]] ^ encode_s[j
%
8
] ^ encode_s[j
%
2
+
4
])
else
:
new_data.append(
0
)
if
new_data
=
=
[
0x50
,
0x4b
,
3
,
4
]:
print
("".join(i))
break
int
__cdecl sub_F91E00(_BYTE *a1,
int
a2)
{
int
result;
// eax
__int64
v3;
// [esp-8h] [ebp-2C8h]
int
j;
// [esp+148h] [ebp-178h]
int
v5;
// [esp+154h] [ebp-16Ch]
int
v6[21];
// [esp+158h] [ebp-168h]
int
i;
// [esp+1ACh] [ebp-114h]
int
*v8;
// [esp+1B8h] [ebp-108h]
_BYTE *v9;
// [esp+1C4h] [ebp-FCh]
_DWORD *v10;
// [esp+1D0h] [ebp-F0h]
_DWORD *v11;
// [esp+1DCh] [ebp-E4h]
int
v12;
// [esp+1E8h] [ebp-D8h]
int
v13;
// [esp+1F4h] [ebp-CCh]
int
v14;
// [esp+200h] [ebp-C0h]
unsigned
int
v15;
// [esp+20Ch] [ebp-B4h]
unsigned
int
v16;
// [esp+218h] [ebp-A8h]
int
v17;
// [esp+224h] [ebp-9Ch]
unsigned
int
v18;
// [esp+230h] [ebp-90h]
int
v19;
// [esp+23Ch] [ebp-84h]
int
v20;
// [esp+248h] [ebp-78h]
int
v21;
// [esp+254h] [ebp-6Ch] BYREF
int
v22;
// [esp+260h] [ebp-60h]
int
v23;
// [esp+26Ch] [ebp-54h]
int
v24;
// [esp+278h] [ebp-48h]
int
v25;
// [esp+284h] [ebp-3Ch]
int
v26;
// [esp+290h] [ebp-30h]
int
v27;
// [esp+29Ch] [ebp-24h]
int
v28;
// [esp+2A8h] [ebp-18h]
int
v29;
// [esp+2B4h] [ebp-Ch]
__CheckForDebuggerJustMyCode(&unk_F9D015);
a1[36] = 0;
a1[37] = 0;
a1[38] = 0;
a1[39] = 0;
v17 = 0xABCDEF12;
v16 = 0;
v15 = 0;
v14 = 0;
v13 = 0;
v12 = 1;
v11 = 0;
v10 = 0;
v9 = 0;
while
( 2 )
{
switch
( *(_DWORD *)(a2 + 4 * v14) )
{
case
0x66:
if
( v12 == 32 )
{
v8 = &v21;
for
( i = 0; i < 4; ++i )
*((_BYTE *)v8 + i) = byte_F9B000[4 * *((unsigned
__int8
*)v8 + i)];
*v11 = v21;
*v10 = v20;
v14 -= 31;
v12 = 1;
++v13;
v16 = 0;
}
else
{
++v12;
v14 -= 31;
}
if
( v13 != 5 )
continue
;
v9 = a1;
v5 = 0x83845981;
v6[0] = 0;
v6[1] = 0x34402115;
v6[2] = 0;
v6[3] = 0xFB1F53D2;
v6[4] = 0;
v6[5] = 0x547564C9;
v6[6] = 0;
v6[7] = 0x3B42FCC6;
v6[8] = 0;
v6[9] = 0x2B67FCDE;
v6[10] = 0;
v6[11] = 0x675AB09C;
v6[12] = 0;
v6[13] = 0x1D47F41A;
v6[14] = 0;
v6[15] = 0x876D3272;
v6[16] = 0;
result = 0;
v6[17] = 0x734D7D95;
v6[18] = 0;
for
( j = 0; j < 10; ++j )
{
if
( *(_DWORD *)&v9[4 * j] != v6[2 * j - 1] || v6[2 * j] )
{
puts
(
"You are Wrong!"
);
exit
(0);
}
result = j + 1;
}
return
result;
case
0xA1:
v16 += xor(v17, 0x8BE8CF37);
// 0x20252025
v15 = v16 >> 7;
// 0x404a40
++v14;
continue
;
case
0xA2:
if
( v12 == 1 )
v11 = &a1[8 * v13];
else
*v11 = v21;
v21 = *v11 + v22;
++v14;
continue
;
case
0xA3:
v20 = *v10 + v22;
++v14;
continue
;
case
0xB2:
if
( v12 == 1 )
v10 = &a1[8 * v13 + 4];
else
*v10 = v20;
v29 = v14 + 1;
*(_DWORD *)(a2 + 4 * (v14 + 1)) = *v10;
v14 += 2;
continue
;
case
0xB3:
if
( v12 == 1 )
v11 = &a1[8 * v13];
else
*v11 = v21 - v22;
v29 = v14 + 1;
v24 = v22 + *v11;
*(_DWORD *)(a2 + 4 * v29) = v24;
v14 += 2;
continue
;
case
0xC4:
v29 = v14 + 1;
v18 = *(_DWORD *)(a2 + 4 * v14 - 4);
v27 = shl(v18, *(_DWORD *)(a2 + 4 * (v14 + 1)));
v14 += 2;
continue
;
case
0xC5:
v29 = v14 + 1;
v18 = *(_DWORD *)(a2 + 4 * v14 - 4);
v26 = shr(v18, *(_DWORD *)(a2 + 4 * (v14 + 1)));
v14 += 2;
continue
;
case
0xC6:
v19 = dword_F9B400[v28] + v16;
// 这里基本确定是key值
v22 = xor(v25, v19);
v22 = xor(v22, 3);
++v14;
continue
;
case
0xD7:
v25 = xor(v27, v26);
v25 = xor(v25, 66);
++v14;
continue
;
case
0xD8:
v29 = v14 + 1;
HIDWORD(v3) = *(_DWORD *)(a2 + 4 * (v14 + 1));
if
( v15 )
{
LODWORD(v3) = v15;
v28 = sub_F91037(v3);
v15 = 0;
}
else
{
LODWORD(v3) = v16;
v28 = sub_F91037(v3);
}
v14 += 2;
continue
;
case
0xF4:
if
( *(_DWORD *)(a2 + 4 * v14 + 4) == 0xE1 )
v23 = v24;
if
( *(_DWORD *)(a2 + 4 * v14 + 4) == 0xE2 )
v23 = *v10;
v25 += v23;
v14 += 2;
continue
;
default
:
puts
(
"error"
);
continue
;
}
}
}
int
__cdecl sub_F91E00(_BYTE *a1,
int
a2)
{
int
result;
// eax
__int64
v3;
// [esp-8h] [ebp-2C8h]
int
j;
// [esp+148h] [ebp-178h]
int
v5;
// [esp+154h] [ebp-16Ch]
int
v6[21];
// [esp+158h] [ebp-168h]
int
i;
// [esp+1ACh] [ebp-114h]
int
*v8;
// [esp+1B8h] [ebp-108h]
_BYTE *v9;
// [esp+1C4h] [ebp-FCh]
_DWORD *v10;
// [esp+1D0h] [ebp-F0h]
_DWORD *v11;
// [esp+1DCh] [ebp-E4h]
int
v12;
// [esp+1E8h] [ebp-D8h]
int
v13;
// [esp+1F4h] [ebp-CCh]
int
v14;
// [esp+200h] [ebp-C0h]
unsigned
int
v15;
// [esp+20Ch] [ebp-B4h]
unsigned
int
v16;
// [esp+218h] [ebp-A8h]
int
v17;
// [esp+224h] [ebp-9Ch]
unsigned
int
v18;
// [esp+230h] [ebp-90h]
int
v19;
// [esp+23Ch] [ebp-84h]
int
v20;
// [esp+248h] [ebp-78h]
int
v21;
// [esp+254h] [ebp-6Ch] BYREF
int
v22;
// [esp+260h] [ebp-60h]
int
v23;
// [esp+26Ch] [ebp-54h]
int
v24;
// [esp+278h] [ebp-48h]
int
v25;
// [esp+284h] [ebp-3Ch]
int
v26;
// [esp+290h] [ebp-30h]
int
v27;
// [esp+29Ch] [ebp-24h]
int
v28;
// [esp+2A8h] [ebp-18h]
int
v29;
// [esp+2B4h] [ebp-Ch]
__CheckForDebuggerJustMyCode(&unk_F9D015);
a1[36] = 0;
a1[37] = 0;
a1[38] = 0;
a1[39] = 0;
v17 = 0xABCDEF12;
v16 = 0;
v15 = 0;
v14 = 0;
v13 = 0;
v12 = 1;
v11 = 0;
v10 = 0;
v9 = 0;
while
( 2 )
{
switch
( *(_DWORD *)(a2 + 4 * v14) )
{
case
0x66:
if
( v12 == 32 )
{
v8 = &v21;
for
( i = 0; i < 4; ++i )
*((_BYTE *)v8 + i) = byte_F9B000[4 * *((unsigned
__int8
*)v8 + i)];
*v11 = v21;
*v10 = v20;
v14 -= 31;
v12 = 1;
++v13;
v16 = 0;
}
else
{
++v12;
v14 -= 31;
}
if
( v13 != 5 )
continue
;
v9 = a1;
v5 = 0x83845981;
v6[0] = 0;
v6[1] = 0x34402115;
v6[2] = 0;
v6[3] = 0xFB1F53D2;
v6[4] = 0;
v6[5] = 0x547564C9;
v6[6] = 0;
v6[7] = 0x3B42FCC6;
v6[8] = 0;
v6[9] = 0x2B67FCDE;
v6[10] = 0;
v6[11] = 0x675AB09C;
v6[12] = 0;
v6[13] = 0x1D47F41A;
v6[14] = 0;
v6[15] = 0x876D3272;
v6[16] = 0;
result = 0;
v6[17] = 0x734D7D95;
v6[18] = 0;
for
( j = 0; j < 10; ++j )
{
if
( *(_DWORD *)&v9[4 * j] != v6[2 * j - 1] || v6[2 * j] )
{
puts
(
"You are Wrong!"
);
exit
(0);
}
result = j + 1;
}
return
result;
case
0xA1:
v16 += xor(v17, 0x8BE8CF37);
// 0x20252025
v15 = v16 >> 7;
// 0x404a40
++v14;
continue
;
case
0xA2:
if
( v12 == 1 )
v11 = &a1[8 * v13];
else
*v11 = v21;
v21 = *v11 + v22;
++v14;
continue
;
case
0xA3:
v20 = *v10 + v22;
++v14;
continue
;
case
0xB2:
if
( v12 == 1 )
v10 = &a1[8 * v13 + 4];
else
*v10 = v20;
v29 = v14 + 1;
*(_DWORD *)(a2 + 4 * (v14 + 1)) = *v10;
v14 += 2;
continue
;
case
0xB3:
if
( v12 == 1 )
v11 = &a1[8 * v13];
else
*v11 = v21 - v22;
v29 = v14 + 1;
v24 = v22 + *v11;
*(_DWORD *)(a2 + 4 * v29) = v24;
v14 += 2;
continue
;
case
0xC4:
v29 = v14 + 1;
v18 = *(_DWORD *)(a2 + 4 * v14 - 4);
v27 = shl(v18, *(_DWORD *)(a2 + 4 * (v14 + 1)));
v14 += 2;
continue
;
case
0xC5:
v29 = v14 + 1;
v18 = *(_DWORD *)(a2 + 4 * v14 - 4);
v26 = shr(v18, *(_DWORD *)(a2 + 4 * (v14 + 1)));
v14 += 2;
continue
;
case
0xC6:
v19 = dword_F9B400[v28] + v16;
// 这里基本确定是key值
v22 = xor(v25, v19);
v22 = xor(v22, 3);
++v14;
continue
;
case
0xD7:
v25 = xor(v27, v26);
v25 = xor(v25, 66);
++v14;
continue
;
case
0xD8:
v29 = v14 + 1;
HIDWORD(v3) = *(_DWORD *)(a2 + 4 * (v14 + 1));
if
( v15 )
{
LODWORD(v3) = v15;
v28 = sub_F91037(v3);
v15 = 0;
}
else
{
LODWORD(v3) = v16;
v28 = sub_F91037(v3);
}
v14 += 2;
continue
;
case
0xF4:
if
( *(_DWORD *)(a2 + 4 * v14 + 4) == 0xE1 )
v23 = v24;
if
( *(_DWORD *)(a2 + 4 * v14 + 4) == 0xE2 )
v23 = *v10;
v25 += v23;
v14 += 2;
continue
;
default
:
puts
(
"error"
);
continue
;
}
}
}
a
=
((((s[
4
:
8
]<<
4
)^(s[
4
:
8
]>>
6
)^
66
)
+
s[
4
:
8
])^(total
+
2
)^
3
)
(((((a
+
s[:
4
])<<
4
)^((a
+
s[:
4
])>>
6
)^
66
)
+
(a
+
s[:
4
]))^(
0x20252025
+
2
)^
3
)
+
s[
4
:
8
]
a
=
((((s[
4
:
8
]<<
4
)^(s[
4
:
8
]>>
6
)^
66
)
+
s[
4
:
8
])^(total
+
2
)^
3
)
(((((a
+
s[:
4
])<<
4
)^((a
+
s[:
4
])>>
6
)^
66
)
+
(a
+
s[:
4
]))^(
0x20252025
+
2
)^
3
)
+
s[
4
:
8
]
import
struct
from
ctypes
import
c_uint32
def
xtea_encrypt(r, v, key):
v0, v1
=
c_uint32(v[
0
]), c_uint32(v[
1
])
delta
=
0x20252025
total
=
c_uint32(
0
)
for
i
in
range
(r):
v0.value
+
=
(((v1.value <<
4
) ^ (v1.value >>
6
) ^
66
)
+
v1.value) ^ (total.value
+
key[total.value &
3
]) ^
3
total.value
+
=
delta
v1.value
+
=
(((v0.value <<
4
) ^ (v0.value >>
6
) ^
66
)
+
v0.value) ^ (total.value
+
key[(total.value >>
7
) &
3
]) ^
3
return
v0.value, v1.value
def
xtea_decrypt(r, v, key):
v0, v1
=
c_uint32(v[
0
]), c_uint32(v[
1
])
delta
=
0x20252025
total
=
c_uint32(delta
*
r)
for
i
in
range
(r):
v1.value
-
=
(((v0.value <<
4
) ^ (v0.value >>
6
) ^
66
)
+
v0.value) ^ (total.value
+
key[(total.value >>
7
) &
3
]) ^
3
total.value
-
=
delta
v0.value
-
=
(((v1.value <<
4
) ^ (v1.value >>
6
) ^
66
)
+
v1.value) ^ (total.value
+
key[total.value &
3
]) ^
3
return
v0.value, v1.value
if
__name__
=
=
"__main__"
:
key
=
[
2
,
0
,
2
,
5
]
b
=
[
0x000000A4
,
0x000000C4
,
0x00000004
,
0x000000CE
,
0x00000014
,
0x00000095
,
0x000000E9
,
0x00000011
,
0x00000031
,
0x00000018
,
0x000000B6
,
0x000000B0
,
0x00000001
,
0x00000026
,
0x00000024
,
0x0000006A
,
0x0000007B
,
0x00000012
,
0x000000CB
,
0x00000067
,
0x000000DB
,
0x000000F8
,
0x000000D2
,
0x0000007E
,
0x0000009D
,
0x000000D0
,
0x0000000C
,
0x0000005F
,
0x00000082
,
0x00000021
,
0x00000087
,
0x00000083
,
0x00000086
,
0x0000007C
,
0x000000C2
,
0x0000009F
,
0x00000029
,
0x000000CA
,
0x000000BF
,
0x00000049
,
0x000000DE
,
0x0000004E
,
0x000000CD
,
0x00000062
,
0x00000053
,
0x000000BE
,
0x000000A7
,
0x00000003
,
0x0000002F
,
0x000000B5
,
0x000000AB
,
0x00000094
,
0x000000CC
,
0x0000002E
,
0x0000001D
,
0x000000F3
,
0x00000036
,
0x00000010
,
0x000000BA
,
0x000000D7
,
0x00000013
,
0x00000035
,
0x000000E5
,
0x000000B3
,
0x00000081
,
0x0000001A
,
0x000000A0
,
0x000000E7
,
0x00000025
,
0x00000075
,
0x000000AF
,
0x00000051
,
0x00000043
,
0x0000005C
,
0x00000050
,
0x00000048
,
0x000000D8
,
0x000000A3
,
0x0000003F
,
0x00000071
,
0x0000007A
,
0x000000C7
,
0x000000C6
,
0x00000090
,
0x000000B1
,
0x000000BB
,
0x000000FA
,
0x000000DD
,
0x000000B9
,
0x000000F6
,
0x000000A9
,
0x000000B7
,
0x00000064
,
0x00000038
,
0x000000DF
,
0x000000E0
,
0x00000008
,
0x000000B2
,
0x00000077
,
0x00000033
,
0x0000005B
,
0x00000002
,
0x0000005E
,
0x00000079
,
0x00000061
,
0x00000007
,
0x00000069
,
0x00000023
,
0x00000057
,
0x0000004A
,
0x000000FD
,
0x000000C0
,
0x0000002B
,
0x000000A1
,
0x000000D1
,
0x00000028
,
0x00000009
,
0x0000006F
,
0x00000080
,
0x00000055
,
0x000000FE
,
0x00000042
,
0x000000E3
,
0x00000047
,
0x00000044
,
0x000000E1
,
0x000000FF
,
0x000000BC
,
0x0000007D
,
0x0000008B
,
0x0000009A
,
0x00000060
,
0x000000AD
,
0x00000097
,
0x000000FB
,
0x0000008D
,
0x000000D6
,
0x000000AC
,
0x0000001E
,
0x0000000F
,
0x00000045
,
0x000000EA
,
0x000000F5
,
0x0000004B
,
0x0000002D
,
0x0000003B
,
0x00000022
,
0x0000001C
,
0x0000005A
,
0x00000072
,
0x00000046
,
0x000000C3
,
0x000000E4
,
0x0000005D
,
0x000000DA
,
0x00000092
,
0x0000009B
,
0x0000000A
,
0x000000BD
,
0x00000099
,
0x00000085
,
0x00000034
,
0x00000073
,
0x000000A5
,
0x00000056
,
0x00000037
,
0x0000004C
,
0x00000016
,
0x00000084
,
0x000000A2
,
0x000000B4
,
0x0000006D
,
0x00000054
,
0x000000E6
,
0x000000C1
,
0x0000001F
,
0x00000017
,
0x0000003D
,
0x00000088
,
0x000000F7
,
0x00000015
,
0x00000058
,
0x000000EF
,
0x0000004D
,
0x000000EE
,
0x00000089
,
0x00000068
,
0x00000059
,
0x000000B8
,
0x00000020
,
0x000000E8
,
0x000000DC
,
0x000000C9
,
0x00000091
,
0x000000FC
,
0x000000D5
,
0x000000C8
,
0x00000041
,
0x0000009E
,
0x00000076
,
0x00000078
,
0x00000032
,
0x00000019
,
0x00000066
,
0x00000065
,
0x00000039
,
0x0000006B
,
0x000000C5
,
0x00000052
,
0x00000027
,
0x000000A8
,
0x00000006
,
0x0000008E
,
0x000000A6
,
0x0000000D
,
0x00000098
,
0x0000008C
,
0x000000F9
,
0x00000005
,
0x0000001B
,
0x00000040
,
0x0000008F
,
0x0000004F
,
0x0000003C
,
0x000000EB
,
0x00000070
,
0x000000D9
,
0x00000063
,
0x000000D3
,
0x000000E2
,
0x0000002C
,
0x000000F0
,
0x00000093
,
0x0000003A
,
0x000000F4
,
0x00000000
,
0x000000F2
,
0x000000AA
,
0x0000007F
,
0x0000002A
,
0x00000030
,
0x000000EC
,
0x0000006C
,
0x00000074
,
0x0000006E
,
0x000000F1
,
0x0000000E
,
0x0000003E
,
0x000000ED
,
0x00000096
,
0x000000AE
,
0x0000008A
,
0x000000CF
,
0x0000000B
,
0x0000009C
,
0x000000D4
]
v
=
[
0x83845981
,
0x34402115
,
0xFB1F53D2
,
0x547564C9
,
0x3B42FCC6
,
0x2B67FCDE
,
0x675AB09C
,
0x1D47F41A
,
0x876D3272
,
0x734D7D95
]
for
k
in
range
(
0
,
len
(v),
2
):
v[k]
=
list
(struct.pack(
"<I"
, v[k]))
for
i
in
range
(
len
(v[k])):
v[k][i]
=
b.index(v[k][i])
v[k]
=
struct.unpack(
"<I"
, bytes(v[k]))[
0
]
for
i
in
range
(
0
,
len
(v),
2
):
v[i:i
+
2
]
=
xtea_decrypt(
32
, v[i:i
+
2
], key)
str_list
=
[]
for
i
in
range
(
len
(v)):
str_list.append(struct.pack(
'<I'
, v[i]).decode())
print
(
'decrypted: %s'
%
''.join(str_list))
import
struct
from
ctypes
import
c_uint32
def
xtea_encrypt(r, v, key):
v0, v1
=
c_uint32(v[
0
]), c_uint32(v[
1
])
delta
=
0x20252025
total
=
c_uint32(
0
)
for
i
in
range
(r):
v0.value
+
=
(((v1.value <<
4
) ^ (v1.value >>
6
) ^
66
)
+
v1.value) ^ (total.value
+
key[total.value &
3
]) ^
3
total.value
+
=
delta
v1.value
+
=
(((v0.value <<
4
) ^ (v0.value >>
6
) ^
66
)
+
v0.value) ^ (total.value
+
key[(total.value >>
7
) &
3
]) ^
3
return
v0.value, v1.value
def
xtea_decrypt(r, v, key):
v0, v1
=
c_uint32(v[
0
]), c_uint32(v[
1
])
delta
=
0x20252025
total
=
c_uint32(delta
*
r)
for
i
in
range
(r):
v1.value
-
=
(((v0.value <<
4
) ^ (v0.value >>
6
) ^
66
)
+
v0.value) ^ (total.value
+
key[(total.value >>
7
) &
3
]) ^
3
total.value
-
=
delta
v0.value
-
=
(((v1.value <<
4
) ^ (v1.value >>
6
) ^
66
)
+
v1.value) ^ (total.value
+
key[total.value &
3
]) ^
3
return
v0.value, v1.value
if
__name__
=
=
"__main__"
:
key
=
[
2
,
0
,
2
,
5
]
b
=
[
0x000000A4
,
0x000000C4
,
0x00000004
,
0x000000CE
,
0x00000014
,
0x00000095
,
0x000000E9
,
0x00000011
,
0x00000031
,
0x00000018
,
0x000000B6
,
0x000000B0
,
0x00000001
,
0x00000026
,
0x00000024
,
0x0000006A
,
0x0000007B
,
0x00000012
,
0x000000CB
,
0x00000067
,
0x000000DB
,
0x000000F8
,
0x000000D2
,
0x0000007E
,
0x0000009D
,
0x000000D0
,
0x0000000C
,
0x0000005F
,
0x00000082
,
0x00000021
,
0x00000087
,
0x00000083
,
0x00000086
,
0x0000007C
,
0x000000C2
,
0x0000009F
,
0x00000029
,
0x000000CA
,
0x000000BF
,
0x00000049
,
0x000000DE
,
0x0000004E
,
0x000000CD
,
0x00000062
,
0x00000053
,
0x000000BE
,
0x000000A7
,
0x00000003
,
0x0000002F
,
0x000000B5
,
0x000000AB
,
0x00000094
,
0x000000CC
,
0x0000002E
,
0x0000001D
,
0x000000F3
,
0x00000036
,
0x00000010
,
0x000000BA
,
0x000000D7
,
0x00000013
,
0x00000035
,
0x000000E5
,
0x000000B3
,
0x00000081
,
0x0000001A
,
0x000000A0
,
0x000000E7
,
0x00000025
,
0x00000075
,
0x000000AF
,
0x00000051
,
0x00000043
,
0x0000005C
,
0x00000050
,
0x00000048
,
0x000000D8
,
0x000000A3
,
0x0000003F
,
0x00000071
,
0x0000007A
,
0x000000C7
,
0x000000C6
,
0x00000090
,
0x000000B1
,
0x000000BB
,
0x000000FA
,
0x000000DD
,
0x000000B9
,
0x000000F6
,
0x000000A9
,
0x000000B7
,
0x00000064
,
0x00000038
,
0x000000DF
,
0x000000E0
,
0x00000008
,
0x000000B2
,
0x00000077
,
0x00000033
,
0x0000005B
,
0x00000002
,
0x0000005E
,
0x00000079
,
0x00000061
,
0x00000007
,
0x00000069
,
0x00000023
,
0x00000057
,
0x0000004A
,
0x000000FD
,
0x000000C0
,
0x0000002B
,
0x000000A1
,
0x000000D1
,
0x00000028
,
0x00000009
,
0x0000006F
,
0x00000080
,
0x00000055
,
0x000000FE
,
0x00000042
,
0x000000E3
,
0x00000047
,
0x00000044
,
0x000000E1
,
0x000000FF
,
0x000000BC
,
0x0000007D
,
0x0000008B
,
0x0000009A
,
0x00000060
,
0x000000AD
,
0x00000097
,
0x000000FB
,
0x0000008D
,
0x000000D6
,
0x000000AC
,
0x0000001E
,
0x0000000F
,
0x00000045
,
0x000000EA
,
0x000000F5
,
0x0000004B
,
0x0000002D
,
0x0000003B
,
0x00000022
,
0x0000001C
,
0x0000005A
,
0x00000072
,
0x00000046
,
0x000000C3
,
0x000000E4
,
0x0000005D
,
0x000000DA
,
0x00000092
,
0x0000009B
,
0x0000000A
,
0x000000BD
,
0x00000099
,
0x00000085
,
0x00000034
,
0x00000073
,
0x000000A5
,
0x00000056
,
0x00000037
,
0x0000004C
,
0x00000016
,
0x00000084
,
0x000000A2
,
0x000000B4
,
0x0000006D
,
0x00000054
,
0x000000E6
,
0x000000C1
,
0x0000001F
,
0x00000017
,
0x0000003D
,
0x00000088
,
0x000000F7
,
0x00000015
,
0x00000058
,
0x000000EF
,
0x0000004D
,
0x000000EE
,
0x00000089
,
0x00000068
,
0x00000059
,
0x000000B8
,
0x00000020
,
0x000000E8
,
0x000000DC
,
0x000000C9
,
0x00000091
,
0x000000FC
,
0x000000D5
,
0x000000C8
,
0x00000041
,
0x0000009E
,
0x00000076
,
0x00000078
,
0x00000032
,
0x00000019
,
0x00000066
,
0x00000065
,
0x00000039
,
0x0000006B
,
0x000000C5
,
0x00000052
,
0x00000027
,
0x000000A8
,
0x00000006
,
0x0000008E
,
0x000000A6
,
0x0000000D
,
0x00000098
,
0x0000008C
,
0x000000F9
,
0x00000005
,
0x0000001B
,
0x00000040
,
0x0000008F
,
0x0000004F
,
0x0000003C
,
0x000000EB
,
0x00000070
,
0x000000D9
,
0x00000063
,
0x000000D3
,
0x000000E2
,
0x0000002C
,
0x000000F0
,
0x00000093
,
0x0000003A
,
0x000000F4
,
0x00000000
,
0x000000F2
,
0x000000AA
,
0x0000007F
,
0x0000002A
,
0x00000030
,
0x000000EC
,
0x0000006C
,
0x00000074
,
0x0000006E
,
0x000000F1
,
0x0000000E
,
0x0000003E
,
0x000000ED
,
0x00000096
,
0x000000AE
,
0x0000008A
,
0x000000CF
,
0x0000000B
,
0x0000009C
,
0x000000D4
]
v
=
[
0x83845981
,
0x34402115
,
0xFB1F53D2
,
0x547564C9
,
0x3B42FCC6
,
0x2B67FCDE
,
0x675AB09C
,
0x1D47F41A
,
0x876D3272
,
0x734D7D95
]
for
k
in
range
(
0
,
len
(v),
2
):
v[k]
=
list
(struct.pack(
"<I"
, v[k]))
for
i
in
range
(
len
(v[k])):
v[k][i]
=
b.index(v[k][i])
v[k]
=
struct.unpack(
"<I"
, bytes(v[k]))[
0
]
for
i
in
range
(
0
,
len
(v),
2
):
v[i:i
+
2
]
=
xtea_decrypt(
32
, v[i:i
+
2
], key)
str_list
=
[]
for
i
in
range
(
len
(v)):
str_list.append(struct.pack(
'<I'
, v[i]).decode())
print
(
'decrypted: %s'
%
''.join(str_list))
from
Crypto.Util.number
import
long_to_bytes
# 初始置换IP
IP
=
[
0x3A
,
0x32
,
0x2A
,
0x22
,
0x1A
,
0x12
,
0x0A
,
0x02
,
0x3C
,
0x34
,
0x2C
,
0x24
,
0x1C
,
0x14
,
0x0C
,
0x04
,
0x3E
,
0x36
,
0x2E
,
0x26
,
0x1E
,
0x16
,
0x0E
,
0x06
,
0x40
,
0x38
,
0x30
,
0x28
,
0x20
,
0x18
,
0x10
,
0x08
,
0x39
,
0x31
,
0x29
,
0x21
,
0x19
,
0x11
,
0x09
,
0x01
,
0x3B
,
0x33
,
0x2B
,
0x23
,
0x1B
,
0x13
,
0x0B
,
0x03
,
0x3D
,
0x35
,
0x2D
,
0x25
,
0x1D
,
0x15
,
0x0D
,
0x05
,
0x3F
,
0x37
,
0x2F
,
0x27
,
0x1F
,
0x17
,
0x0F
,
0x07
]
# 逆初始置换IP^-1
IP_INV
=
[
0x28
,
0x08
,
0x30
,
0x10
,
0x38
,
0x18
,
0x40
,
0x20
,
0x27
,
0x07
,
0x2F
,
0x0F
,
0x37
,
0x17
,
0x3F
,
0x1F
,
0x26
,
0x06
,
0x2E
,
0x0E
,
0x36
,
0x16
,
0x3E
,
0x1E
,
0x25
,
0x05
,
0x2D
,
0x0D
,
0x35
,
0x15
,
0x3D
,
0x1D
,
0x24
,
0x04
,
0x2C
,
0x0C
,
0x34
,
0x14
,
0x3C
,
0x1C
,
0x23
,
0x03
,
0x2B
,
0x0B
,
0x33
,
0x13
,
0x3B
,
0x1B
,
0x22
,
0x02
,
0x2A
,
0x0A
,
0x32
,
0x12
,
0x3A
,
0x1A
,
0x21
,
0x01
,
0x29
,
0x09
,
0x31
,
0x11
,
0x39
,
0x19
]
# 循环左移位数表
SHIFT_TABLE
=
[
1
,
1
,
2
,
2
,
2
,
2
,
2
,
2
,
1
,
2
,
2
,
2
,
2
,
2
,
2
,
1
]
# 初始密钥置换PC-1
'''
PC-1是用于从初始密钥中生成56位的中间密钥(C0和D0)的置换表。
它从64位的初始密钥中筛选出56位,并丢弃了8位奇偶校验位。
这个置换是DES算法中的第一步,用于准备子密钥生成。
'''
PC_1
=
[
0x39
,
0x31
,
0x29
,
0x21
,
0x19
,
0x11
,
0x09
,
0x01
,
0x3A
,
0x32
,
0x2A
,
0x22
,
0x1A
,
0x12
,
0x0A
,
0x02
,
0x3B
,
0x33
,
0x2B
,
0x23
,
0x1B
,
0x13
,
0x0B
,
0x03
,
0x3C
,
0x34
,
0x2C
,
0x24
,
0x3F
,
0x37
,
0x2F
,
0x27
,
0x1F
,
0x17
,
0x0F
,
0x07
,
0x3E
,
0x36
,
0x2E
,
0x26
,
0x1E
,
0x16
,
0x0E
,
0x06
,
0x3D
,
0x35
,
0x2D
,
0x25
,
0x1D
,
0x15
,
0x0D
,
0x05
,
0x1C
,
0x14
,
0x0C
,
0x04
]
# 子密钥置换PC-2
'''
PC-2是用于从56位中间密钥生成每一轮的48位子密钥的置换表。
在DES中,子密钥是通过对中间密钥进行轮次迭代和置换生成的。
PC-2负责选择并排列中间密钥的位,以生成48位的子密钥。
'''
PC_2
=
[
0x0E
,
0x11
,
0x0B
,
0x18
,
0x01
,
0x05
,
0x03
,
0x1C
,
0x0F
,
0x06
,
0x15
,
0x0A
,
0x17
,
0x13
,
0x0C
,
0x04
,
0x1A
,
0x08
,
0x10
,
0x07
,
0x1B
,
0x14
,
0x0D
,
0x02
,
0x29
,
0x34
,
0x1F
,
0x25
,
0x2F
,
0x37
,
0x1E
,
0x28
,
0x33
,
0x2D
,
0x21
,
0x30
,
0x2C
,
0x31
,
0x27
,
0x38
,
0x22
,
0x35
,
0x2E
,
0x2A
,
0x32
,
0x24
,
0x1D
,
0x20
]
# S-盒
S_BOX
=
[
0x06
,
0x06
,
0x04
,
0x09
,
0x06
,
0x07
,
0x04
,
0x0B
,
0x00
,
0x02
,
0x08
,
0x0C
,
0x0A
,
0x08
,
0x00
,
0x01
,
0x0C
,
0x06
,
0x09
,
0x09
,
0x03
,
0x07
,
0x0B
,
0x05
,
0x04
,
0x0D
,
0x01
,
0x03
,
0x0F
,
0x08
,
0x0A
,
0x0D
,
0x05
,
0x0D
,
0x0A
,
0x02
,
0x0C
,
0x00
,
0x0E
,
0x0D
,
0x0B
,
0x0E
,
0x05
,
0x03
,
0x02
,
0x08
,
0x0E
,
0x03
,
0x0E
,
0x04
,
0x0B
,
0x07
,
0x0F
,
0x05
,
0x01
,
0x07
,
0x01
,
0x0C
,
0x09
,
0x00
,
0x0A
,
0x02
,
0x0F
,
0x0F
,
0x0A
,
0x02
,
0x04
,
0x08
,
0x0C
,
0x0F
,
0x03
,
0x0A
,
0x04
,
0x08
,
0x03
,
0x04
,
0x0E
,
0x05
,
0x07
,
0x0F
,
0x0F
,
0x08
,
0x00
,
0x07
,
0x09
,
0x04
,
0x0D
,
0x00
,
0x05
,
0x08
,
0x0B
,
0x0E
,
0x06
,
0x02
,
0x02
,
0x06
,
0x0D
,
0x09
,
0x02
,
0x03
,
0x0A
,
0x07
,
0x01
,
0x09
,
0x05
,
0x0F
,
0x01
,
0x0B
,
0x09
,
0x0E
,
0x0D
,
0x0B
,
0x07
,
0x0C
,
0x0C
,
0x05
,
0x01
,
0x0A
,
0x0E
,
0x06
,
0x06
,
0x00
,
0x00
,
0x0C
,
0x03
,
0x01
,
0x0B
,
0x0D
,
0x0A
,
0x00
,
0x00
,
0x06
,
0x05
,
0x0D
,
0x09
,
0x0E
,
0x03
,
0x01
,
0x01
,
0x08
,
0x0D
,
0x09
,
0x08
,
0x0F
,
0x0C
,
0x07
,
0x01
,
0x03
,
0x0F
,
0x07
,
0x0B
,
0x07
,
0x05
,
0x0A
,
0x03
,
0x0A
,
0x02
,
0x06
,
0x08
,
0x0A
,
0x09
,
0x03
,
0x02
,
0x0E
,
0x0E
,
0x0B
,
0x0B
,
0x02
,
0x0D
,
0x0F
,
0x07
,
0x06
,
0x08
,
0x04
,
0x04
,
0x0C
,
0x00
,
0x01
,
0x0E
,
0x05
,
0x0C
,
0x0C
,
0x04
,
0x02
,
0x06
,
0x09
,
0x04
,
0x05
,
0x0B
,
0x0F
,
0x00
,
0x0D
,
0x06
,
0x0C
,
0x01
,
0x0B
,
0x0E
,
0x00
,
0x04
,
0x04
,
0x04
,
0x02
,
0x0F
,
0x03
,
0x03
,
0x01
,
0x01
,
0x02
,
0x08
,
0x00
,
0x09
,
0x06
,
0x00
,
0x08
,
0x0D
,
0x02
,
0x0C
,
0x03
,
0x03
,
0x0A
,
0x07
,
0x0F
,
0x0C
,
0x08
,
0x0F
,
0x0E
,
0x07
,
0x04
,
0x06
,
0x0E
,
0x01
,
0x07
,
0x07
,
0x09
,
0x06
,
0x09
,
0x0F
,
0x05
,
0x0B
,
0x00
,
0x0A
,
0x0D
,
0x0D
,
0x09
,
0x0D
,
0x05
,
0x05
,
0x0B
,
0x0C
,
0x0B
,
0x08
,
0x02
,
0x05
,
0x0A
,
0x0E
,
0x0A
,
0x05
,
0x05
,
0x07
,
0x09
,
0x09
,
0x0D
,
0x00
,
0x05
,
0x06
,
0x0B
,
0x0C
,
0x05
,
0x04
,
0x0F
,
0x00
,
0x0C
,
0x0B
,
0x0D
,
0x0D
,
0x0A
,
0x08
,
0x02
,
0x0D
,
0x03
,
0x03
,
0x0E
,
0x0E
,
0x06
,
0x09
,
0x03
,
0x00
,
0x07
,
0x0A
,
0x09
,
0x07
,
0x08
,
0x0A
,
0x02
,
0x01
,
0x00
,
0x06
,
0x0E
,
0x0F
,
0x08
,
0x0E
,
0x0F
,
0x02
,
0x01
,
0x07
,
0x06
,
0x0F
,
0x0A
,
0x03
,
0x0C
,
0x0C
,
0x04
,
0x01
,
0x08
,
0x04
,
0x0B
,
0x02
,
0x01
,
0x0B
,
0x04
,
0x0E
,
0x06
,
0x0E
,
0x06
,
0x00
,
0x0D
,
0x09
,
0x05
,
0x05
,
0x0B
,
0x00
,
0x07
,
0x02
,
0x03
,
0x00
,
0x00
,
0x03
,
0x0D
,
0x08
,
0x02
,
0x0F
,
0x09
,
0x01
,
0x07
,
0x09
,
0x01
,
0x0C
,
0x04
,
0x0A
,
0x09
,
0x08
,
0x0B
,
0x04
,
0x01
,
0x06
,
0x0F
,
0x0C
,
0x0E
,
0x0B
,
0x02
,
0x05
,
0x0E
,
0x0D
,
0x04
,
0x03
,
0x07
,
0x01
,
0x0F
,
0x0B
,
0x0A
,
0x03
,
0x07
,
0x08
,
0x08
,
0x0F
,
0x05
,
0x0C
,
0x0C
,
0x0A
,
0x0A
,
0x04
,
0x06
,
0x0D
,
0x02
,
0x0F
,
0x0E
,
0x0A
,
0x03
,
0x03
,
0x0F
,
0x0C
,
0x0E
,
0x00
,
0x02
,
0x0E
,
0x0C
,
0x08
,
0x00
,
0x05
,
0x06
,
0x0E
,
0x02
,
0x00
,
0x01
,
0x08
,
0x01
,
0x0D
,
0x04
,
0x0B
,
0x04
,
0x07
,
0x0B
,
0x09
,
0x0F
,
0x01
,
0x0C
,
0x05
,
0x00
,
0x07
,
0x0D
,
0x06
,
0x0A
,
0x06
,
0x0C
,
0x0B
,
0x06
,
0x0D
,
0x03
,
0x08
,
0x04
,
0x09
,
0x09
,
0x0D
,
0x04
,
0x02
,
0x05
,
0x01
,
0x07
,
0x09
,
0x05
,
0x07
,
0x02
,
0x08
,
0x0F
,
0x03
,
0x0A
,
0x0A
,
0x0B
,
0x04
,
0x07
,
0x04
,
0x0F
,
0x00
,
0x05
,
0x09
,
0x0E
,
0x08
,
0x0B
,
0x0D
,
0x00
,
0x07
,
0x03
,
0x01
,
0x02
,
0x01
,
0x06
,
0x07
,
0x05
,
0x0C
,
0x04
,
0x0D
,
0x0D
,
0x08
,
0x01
,
0x05
,
0x0C
,
0x0B
,
0x09
,
0x05
,
0x0B
,
0x06
,
0x0A
,
0x03
,
0x01
,
0x0F
,
0x0E
,
0x0E
,
0x0F
,
0x09
,
0x09
,
0x0F
,
0x02
,
0x0C
,
0x0C
,
0x0E
,
0x00
,
0x04
,
0x08
,
0x06
,
0x03
,
0x0B
,
0x07
,
0x03
,
0x06
,
0x0A
,
0x02
,
0x00
,
0x02
,
0x08
,
0x0A
,
0x0A
,
0x0D
]
S_BOX
=
[[[S_BOX[i
*
64
+
row
*
16
+
col]
for
col
in
range
(
16
)]
for
row
in
range
(
4
)]
for
i
in
range
(
8
)]
# 扩展置换 E置换
E
=
[
0x20
,
0x01
,
0x02
,
0x03
,
0x04
,
0x05
,
0x04
,
0x05
,
0x06
,
0x07
,
0x08
,
0x09
,
0x08
,
0x09
,
0x0A
,
0x0B
,
0x0C
,
0x0D
,
0x0C
,
0x0D
,
0x0E
,
0x0F
,
0x10
,
0x11
,
0x10
,
0x11
,
0x12
,
0x13
,
0x14
,
0x15
,
0x14
,
0x15
,
0x16
,
0x17
,
0x18
,
0x19
,
0x18
,
0x19
,
0x1A
,
0x1B
,
0x1C
,
0x1D
,
0x1C
,
0x1D
,
0x1E
,
0x1F
,
0x20
,
0x01
]
# P-盒
P
=
[
0x10
,
0x07
,
0x14
,
0x15
,
0x1D
,
0x0C
,
0x1C
,
0x11
,
0x01
,
0x0F
,
0x17
,
0x1A
,
0x05
,
0x12
,
0x1F
,
0x0A
,
0x02
,
0x08
,
0x18
,
0x0E
,
0x20
,
0x1B
,
0x03
,
0x09
,
0x13
,
0x0D
,
0x1E
,
0x06
,
0x16
,
0x0B
,
0x04
,
0x19
]
def
permute(block, table):
"""根据置换表对输入块进行置换"""
return
[block[i
-
1
]
for
i
in
table]
def
left_shift(bits, n):
"""左移n位"""
return
bits[n:]
+
bits[:n]
def
generate_subkeys(key):
"""生成16个子密钥"""
# 初始密钥置换(PC-1)
key
=
permute(key, PC_1)
# 分为左右两部分
left
=
key[:
28
]
right
=
key[
28
:]
subkeys
=
[]
for
i
in
range
(
16
):
# 左移
left
=
left_shift(left, SHIFT_TABLE[i])
right
=
left_shift(right, SHIFT_TABLE[i])
# 合并并置换(PC-2)
combined
=
left
+
right
subkey
=
permute(combined, PC_2)
subkeys.append(subkey)
return
subkeys
def
s_box_substitution(bits):
"""S盒替换"""
output
=
[]
for
i
in
range
(
8
):
# 每6位输入到S盒
row
=
(bits[i
*
6
] <<
1
)
+
bits[i
*
6
+
5
]
col
=
(bits[i
*
6
+
1
] <<
3
)
+
(bits[i
*
6
+
2
] <<
2
)
+
(bits[i
*
6
+
3
] <<
1
)
+
bits[i
*
6
+
4
]
val
=
S_BOX[i][row][col]
output.extend([
int
(bit)
for
bit
in
format
(val,
'04b'
)])
return
output
def
des_encrypt_block(block, subkeys):
"""加密一个64位的数据块"""
# 初始置换
block
=
permute(block, IP)
# 分为左右两部分
left
=
block[:
32
]
right
=
block[
32
:]
# 16轮Feistel网络
for
i
in
range
(
16
):
# 扩展置换(E)
expanded
=
permute(right, E)
# 与子密钥异或
xored
=
[expanded[j] ^ subkeys[i][j]
for
j
in
range
(
48
)]
# S盒替换
sbox_output
=
s_box_substitution(xored)
# P置换
p_output
=
permute(sbox_output, P)
# 与左半部分异或
new_right
=
[left[j] ^ p_output[j]
for
j
in
range
(
32
)]
# 更新左右部分
left
=
right
right
=
new_right
# 合并左右部分
combined
=
right
+
left
# 逆初始置换
ciphertext
=
permute(combined, IP_INV)
return
ciphertext
def
des_decrypt_block(block, subkeys):
"""解密一个64位的数据块"""
# 解密与加密过程类似,只是子密钥顺序相反
return
des_encrypt_block(block, subkeys[::
-
1
])
def
num2bin(n):
s
=
bin
(n)[
2
:]
s
=
s.zfill(
round
(
len
(s)
/
64
)
*
64
)
return
[
int
(i)
for
i
in
s]
# 示例
if
__name__
=
=
"__main__"
:
# 密钥(64位)
# key = num2bin(0x2179656B2179656B)
key
=
num2bin(
0x6b6579216b657921
)
# 生成子密钥
subkeys
=
generate_subkeys(key)
# 加密
ciphertext
=
num2bin(
0x7deae0db1bd66d55d1e9c0710c01132b
)
for
i
in
range
(
0
,
len
(ciphertext),
64
):
# 解密
decrypted_text
=
des_decrypt_block(ciphertext[i:i
+
64
], subkeys)
print
(long_to_bytes(
int
("".join([
str
(i)
for
i
in
decrypted_text]),
2
)))
b
'7d77cfe8'
b
'\x08\x08\x08\x08\x08\x08\x08\x08'
from
Crypto.Util.number
import
long_to_bytes
# 初始置换IP
IP
=
[
0x3A
,
0x32
,
0x2A
,
0x22
,
0x1A
,
0x12
,
0x0A
,
0x02
,
0x3C
,
0x34
,
0x2C
,
0x24
,
0x1C
,
0x14
,
0x0C
,
0x04
,
0x3E
,
0x36
,
0x2E
,
0x26
,
0x1E
,
0x16
,
0x0E
,
0x06
,
0x40
,
0x38
,
0x30
,
0x28
,
0x20
,
0x18
,
0x10
,
0x08
,
0x39
,
0x31
,
0x29
,
0x21
,
0x19
,
0x11
,
0x09
,
0x01
,
0x3B
,
0x33
,
0x2B
,
0x23
,
0x1B
,
0x13
,
0x0B
,
0x03
,
0x3D
,
0x35
,
0x2D
,
0x25
,
0x1D
,
0x15
,
0x0D
,
0x05
,
0x3F
,
0x37
,
0x2F
,
0x27
,
0x1F
,
0x17
,
0x0F
,
0x07
]
# 逆初始置换IP^-1
IP_INV
=
[
0x28
,
0x08
,
0x30
,
0x10
,
0x38
,
0x18
,
0x40
,
0x20
,
0x27
,
0x07
,
0x2F
,
0x0F
,
0x37
,
0x17
,
0x3F
,
0x1F
,
0x26
,
0x06
,
0x2E
,
0x0E
,
0x36
,
0x16
,
0x3E
,
0x1E
,
0x25
,
0x05
,
0x2D
,
0x0D
,
0x35
,
0x15
,
0x3D
,
0x1D
,
0x24
,
0x04
,
0x2C
,
0x0C
,
0x34
,
0x14
,
0x3C
,
0x1C
,
0x23
,
0x03
,
0x2B
,
0x0B
,
0x33
,
0x13
,
0x3B
,
0x1B
,
0x22
,
0x02
,
0x2A
,
0x0A
,
0x32
,
0x12
,
0x3A
,
0x1A
,
0x21
,
0x01
,
0x29
,
0x09
,
0x31
,
0x11
,
0x39
,
0x19
]
# 循环左移位数表
SHIFT_TABLE
=
[
1
,
1
,
2
,
2
,
2
,
2
,
2
,
2
,
1
,
2
,
2
,
2
,
2
,
2
,
2
,
1
]
# 初始密钥置换PC-1
'''
PC-1是用于从初始密钥中生成56位的中间密钥(C0和D0)的置换表。
它从64位的初始密钥中筛选出56位,并丢弃了8位奇偶校验位。
这个置换是DES算法中的第一步,用于准备子密钥生成。
'''
PC_1
=
[
0x39
,
0x31
,
0x29
,
0x21
,
0x19
,
0x11
,
0x09
,
0x01
,
0x3A
,
0x32
,
0x2A
,
0x22
,
0x1A
,
0x12
,
0x0A
,
0x02
,
0x3B
,
0x33
,
0x2B
,
0x23
,
0x1B
,
0x13
,
0x0B
,
0x03
,
0x3C
,
0x34
,
0x2C
,
0x24
,
0x3F
,
0x37
,
0x2F
,
0x27
,
0x1F
,
0x17
,
0x0F
,
0x07
,
0x3E
,
0x36
,
0x2E
,
0x26
,
0x1E
,
0x16
,
0x0E
,
0x06
,
0x3D
,
0x35
,
0x2D
,
0x25
,
0x1D
,
0x15
,
0x0D
,
0x05
,
0x1C
,
0x14
,
0x0C
,
0x04
]
# 子密钥置换PC-2
'''
PC-2是用于从56位中间密钥生成每一轮的48位子密钥的置换表。
在DES中,子密钥是通过对中间密钥进行轮次迭代和置换生成的。
PC-2负责选择并排列中间密钥的位,以生成48位的子密钥。
'''
PC_2
=
[
0x0E
,
0x11
,
0x0B
,
0x18
,
0x01
,
0x05
,
0x03
,
0x1C
,
0x0F
,
0x06
,
0x15
,
0x0A
,
0x17
,
0x13
,
0x0C
,
0x04
,
0x1A
,
0x08
,
0x10
,
0x07
,
0x1B
,
0x14
,
0x0D
,
0x02
,
0x29
,
0x34
,
0x1F
,
0x25
,
0x2F
,
0x37
,
0x1E
,
0x28
,
0x33
,
0x2D
,
0x21
,
0x30
,
0x2C
,
0x31
,
0x27
,
0x38
,
0x22
,
0x35
,
0x2E
,
0x2A
,
0x32
,
0x24
,
0x1D
,
0x20
]
# S-盒
S_BOX
=
[
0x06
,
0x06
,
0x04
,
0x09
,
0x06
,
0x07
,
0x04
,
0x0B
,
0x00
,
0x02
,
0x08
,
0x0C
,
0x0A
,
0x08
,
0x00
,
0x01
,
0x0C
,
0x06
,
0x09
,
0x09
,
0x03
,
0x07
,
0x0B
,
0x05
,
0x04
,
0x0D
,
0x01
,
0x03
,
0x0F
,
0x08
,
0x0A
,
0x0D
,
0x05
,
0x0D
,
0x0A
,
0x02
,
0x0C
,
0x00
,
0x0E
,
0x0D
,
0x0B
,
0x0E
,
0x05
,
0x03
,
0x02
,
0x08
,
0x0E
,
0x03
,
0x0E
,
0x04
,
0x0B
,
0x07
,
0x0F
,
0x05
,
0x01
,
0x07
,
0x01
,
0x0C
,
0x09
,
0x00
,
0x0A
,
0x02
,
0x0F
,
0x0F
,
0x0A
,
0x02
,
0x04
,
0x08
,
0x0C
,
0x0F
,
0x03
,
0x0A
,
0x04
,
0x08
,
0x03
,
0x04
,
0x0E
,
0x05
,
0x07
,
0x0F
,
0x0F
,
0x08
,
0x00
,
0x07
,
0x09
,
0x04
,
0x0D
,
0x00
,
0x05
,
0x08
,
0x0B
,
0x0E
,
0x06
,
0x02
,
0x02
,
0x06
,
0x0D
,
0x09
,
0x02
,
0x03
,
0x0A
,
0x07
,
0x01
,
0x09
,
0x05
,
0x0F
,
0x01
,
0x0B
,
0x09
,
0x0E
,
0x0D
,
0x0B
,
0x07
,
0x0C
,
0x0C
,
0x05
,
0x01
,
0x0A
,
0x0E
,
0x06
,
0x06
,
0x00
,
0x00
,
0x0C
,
0x03
,
0x01
,
0x0B
,
0x0D
,
0x0A
,
0x00
,
0x00
,
0x06
,
0x05
,
0x0D
,
0x09
,
0x0E
,
0x03
,
0x01
,
0x01
,
0x08
,
0x0D
,
0x09
,
0x08
,
0x0F
,
0x0C
,
0x07
,
0x01
,
0x03
,
0x0F
,
0x07
,
0x0B
,
0x07
,
0x05
,
0x0A
,
0x03
,
0x0A
,
0x02
,
0x06
,
0x08
,
0x0A
,
0x09
,
0x03
,
0x02
,
0x0E
,
0x0E
,
0x0B
,
0x0B
,
0x02
,
0x0D
,
0x0F
,
0x07
,
0x06
,
0x08
,
0x04
,
0x04
,
0x0C
,
0x00
,
0x01
,
0x0E
,
0x05
,
0x0C
,
0x0C
,
0x04
,
0x02
,
0x06
,
0x09
,
0x04
,
0x05
,
0x0B
,
0x0F
,
0x00
,
0x0D
,
0x06
,
0x0C
,
0x01
,
0x0B
,
0x0E
,
0x00
,
0x04
,
0x04
,
0x04
,
0x02
,
0x0F
,
0x03
,
0x03
,
0x01
,
0x01
,
0x02
,
0x08
,
0x00
,
0x09
,
0x06
,
0x00
,
0x08
,
0x0D
,
0x02
,
0x0C
,
0x03
,
0x03
,
0x0A
,
0x07
,
0x0F
,
0x0C
,
0x08
,
0x0F
,
0x0E
,
0x07
,
0x04
,
0x06
,
0x0E
,
0x01
,
0x07
,
0x07
,
0x09
,
0x06
,
0x09
,
0x0F
,
0x05
,
0x0B
,
0x00
,
0x0A
,
0x0D
,
0x0D
,
0x09
,
0x0D
,
0x05
,
0x05
,
0x0B
,
0x0C
,
0x0B
,
0x08
,
0x02
,
0x05
,
0x0A
,
0x0E
,
0x0A
,
0x05
,
0x05
,
0x07
,
0x09
,
0x09
,
0x0D
,
0x00
,
0x05
,
0x06
,
0x0B
,
0x0C
,
0x05
,
0x04
,
0x0F
,
0x00
,
0x0C
,
0x0B
,
0x0D
,
0x0D
,
0x0A
,
0x08
,
0x02
,
0x0D
,
0x03
,
0x03
,
0x0E
,
0x0E
,
0x06
,
0x09
,
0x03
,
0x00
,
0x07
,
0x0A
,
0x09
,
0x07
,
0x08
,
0x0A
,
0x02
,
0x01
,
0x00
,
0x06
,
0x0E
,
0x0F
,
0x08
,
0x0E
,
0x0F
,
0x02
,
0x01
,
0x07
,
0x06
,
0x0F
,
0x0A
,
0x03
,
0x0C
,
0x0C
,
0x04
,
0x01
,
0x08
,
0x04
,
0x0B
,
0x02
,
0x01
,
0x0B
,
0x04
,
0x0E
,
0x06
,
0x0E
,
0x06
,
0x00
,
0x0D
,
0x09
,
0x05
,
0x05
,
0x0B
,
0x00
,
0x07
,
0x02
,
0x03
,
0x00
,
0x00
,
0x03
,
0x0D
,
0x08
,
0x02
,
0x0F
,
0x09
,
0x01
,
0x07
,
0x09
,
0x01
,
0x0C
,
0x04
,
0x0A
,
0x09
,
0x08
,
0x0B
,
0x04
,
0x01
,
0x06
,
0x0F
,
0x0C
,
0x0E
,
0x0B
,
0x02
,
0x05
,
0x0E
,
0x0D
,
0x04
,
0x03
,
0x07
,
0x01
,
0x0F
,
0x0B
,
0x0A
,
0x03
,
0x07
,
0x08
,
0x08
,
0x0F
,
0x05
,
0x0C
,
0x0C
,
0x0A
,
0x0A
,
0x04
,
0x06
,
0x0D
,
0x02
,
0x0F
,
0x0E
,
0x0A
,
0x03
,
0x03
,
0x0F
,
0x0C
,
0x0E
,
0x00
,
0x02
,
0x0E
,
0x0C
,
0x08
,
0x00
,
0x05
,
0x06
,
0x0E
,
0x02
,
0x00
,
0x01
,
0x08
,
0x01
,
0x0D
,
0x04
,
0x0B
,
0x04
,
0x07
,
0x0B
,
0x09
,
0x0F
,
0x01
,
0x0C
,
0x05
,
0x00
,
0x07
,
0x0D
,
0x06
,
0x0A
,
0x06
,
0x0C
,
0x0B
,
0x06
,
0x0D
,
0x03
,
0x08
,
0x04
,
0x09
,
0x09
,
0x0D
,
0x04
,
0x02
,
0x05
,
0x01
,
0x07
,
0x09
,
0x05
,
0x07
,
0x02
,
0x08
,
0x0F
,
0x03
,
0x0A
,
0x0A
,
0x0B
,
0x04
,
0x07
,
0x04
,
0x0F
,
0x00
,
0x05
,
0x09
,
0x0E
,
0x08
,
0x0B
,
0x0D
,
0x00
,
0x07
,
0x03
,
0x01
,
0x02
,
0x01
,
0x06
,
0x07
,
0x05
,
0x0C
,
0x04
,
0x0D
,
0x0D
,
0x08
,
0x01
,
0x05
,
0x0C
,
0x0B
,
0x09
,
0x05
,
0x0B
,
0x06
,
0x0A
,
0x03
,
0x01
,
0x0F
,
0x0E
,
0x0E
,
0x0F
,
0x09
,
0x09
,
0x0F
,
0x02
,
0x0C
,
0x0C
,
0x0E
,
0x00
,
0x04
,
0x08
,
0x06
,
0x03
,
0x0B
,
0x07
,
0x03
,
0x06
,
0x0A
,
0x02
,
0x00
,
0x02
,
0x08
,
0x0A
,
0x0A
,
0x0D
]
S_BOX
=
[[[S_BOX[i
*
64
+
row
*
16
+
col]
for
col
in
range
(
16
)]
for
row
in
range
(
4
)]
for
i
in
range
(
8
)]
# 扩展置换 E置换
E
=
[
0x20
,
0x01
,
0x02
,
0x03
,
0x04
,
0x05
,
0x04
,
0x05
,
0x06
,
0x07
,
0x08
,
0x09
,
0x08
,
0x09
,
0x0A
,
0x0B
,
0x0C
,
0x0D
,
0x0C
,
0x0D
,
0x0E
,
0x0F
,
0x10
,
0x11
,
0x10
,
0x11
,
0x12
,
0x13
,
0x14
,
0x15
,
0x14
,
0x15
,
0x16
,
0x17
,
0x18
,
0x19
,
0x18
,
0x19
,
0x1A
,
0x1B
,
0x1C
,
0x1D
,
0x1C
,
0x1D
,
0x1E
,
0x1F
,
0x20
,
0x01
]
# P-盒
P
=
[
0x10
,
0x07
,
0x14
,
0x15
,
0x1D
,
0x0C
,
0x1C
,
0x11
,
0x01
,
0x0F
,
0x17
,
0x1A
,
0x05
,
0x12
,
0x1F
,
0x0A
,
0x02
,
0x08
,
0x18
,
0x0E
,
0x20
,
0x1B
,
0x03
,
0x09
,
0x13
,
0x0D
,
0x1E
,
0x06
,
0x16
,
0x0B
,
0x04
,
0x19
]
def
permute(block, table):
"""根据置换表对输入块进行置换"""
return
[block[i
-
1
]
for
i
in
table]
def
left_shift(bits, n):
"""左移n位"""
return
bits[n:]
+
bits[:n]
def
generate_subkeys(key):
"""生成16个子密钥"""
# 初始密钥置换(PC-1)
key
=
permute(key, PC_1)
# 分为左右两部分
left
=
key[:
28
]
right
=
key[
28
:]
subkeys
=
[]
for
i
in
range
(
16
):
# 左移
left
=
left_shift(left, SHIFT_TABLE[i])
right
=
left_shift(right, SHIFT_TABLE[i])
# 合并并置换(PC-2)
combined
=
left
+
right
subkey
=
permute(combined, PC_2)
subkeys.append(subkey)
return
subkeys
def
s_box_substitution(bits):
"""S盒替换"""
output
=
[]
for
i
in
range
(
8
):
# 每6位输入到S盒
row
=
(bits[i
*
6
] <<
1
)
+
bits[i
*
6
+
5
]
col
=
(bits[i
*
6
+
1
] <<
3
)
+
(bits[i
*
6
+
2
] <<
2
)
+
(bits[i
*
6
+
3
] <<
1
)
+
bits[i
*
6
+
4
]
val
=
S_BOX[i][row][col]
output.extend([
int
(bit)
for
bit
in
format
(val,
'04b'
)])
return
output
def
des_encrypt_block(block, subkeys):
"""加密一个64位的数据块"""
# 初始置换
block
=
permute(block, IP)
# 分为左右两部分
left
=
block[:
32
]
right
=
block[
32
:]
# 16轮Feistel网络
for
i
in
range
(
16
):
# 扩展置换(E)
expanded
=
permute(right, E)
# 与子密钥异或
xored
=
[expanded[j] ^ subkeys[i][j]
for
j
in
range
(
48
)]
# S盒替换
sbox_output
=
s_box_substitution(xored)
# P置换
p_output
=
permute(sbox_output, P)
# 与左半部分异或
new_right
=
[left[j] ^ p_output[j]
for
j
in
range
(
32
)]
# 更新左右部分
left
=
right
right
=
new_right
# 合并左右部分
combined
=
right
+
left
# 逆初始置换
ciphertext
=
permute(combined, IP_INV)
return
ciphertext
def
des_decrypt_block(block, subkeys):
"""解密一个64位的数据块"""
# 解密与加密过程类似,只是子密钥顺序相反
return
des_encrypt_block(block, subkeys[::
-
1
])
def
num2bin(n):
s
=
bin
(n)[
2
:]
s
=
s.zfill(
round
(
len
(s)
/
64
)
*
64
)
return
[
int
(i)
for
i
in
s]
# 示例
if
__name__
=
=
"__main__"
:
# 密钥(64位)
# key = num2bin(0x2179656B2179656B)
key
=
num2bin(
0x6b6579216b657921
)
# 生成子密钥
subkeys
=
generate_subkeys(key)
# 加密
ciphertext
=
num2bin(
0x7deae0db1bd66d55d1e9c0710c01132b
)
for
i
in
range
(
0
,
len
(ciphertext),
64
):
# 解密
decrypted_text
=
des_decrypt_block(ciphertext[i:i
+
64
], subkeys)
print
(long_to_bytes(
int
("".join([
str
(i)
for
i
in
decrypted_text]),
2
)))
b
'7d77cfe8'
b
'\x08\x08\x08\x08\x08\x08\x08\x08'
Java.perform(
function
() {
var
Skip32 = Java.use(
'com.ex.skip.Skip32'
);
// 保存原始FTABLE的引用
var
originalFTABLE = Skip32.FTABLE.value;
console.log(originalFTABLE);
// Hook g函数
var
gFunc = Skip32.g;
gFunc.implementation =
function
(arg3, arg4, arg5) {
// 执行原始函数
var
result =
this
.call(arg3, arg4, arg5);
// 调用后的FTABLE值
console.log(originalFTABLE);
console.log(
"g函数返回值: "
+ result);
return
result;
};
});
Java.perform(
function
() {
var
Skip32 = Java.use(
'com.ex.skip.Skip32'
);
// 保存原始FTABLE的引用
var
originalFTABLE = Skip32.FTABLE.value;
console.log(originalFTABLE);
// Hook g函数
var
gFunc = Skip32.g;
gFunc.implementation =
function
(arg3, arg4, arg5) {
// 执行原始函数
var
result =
this
.call(arg3, arg4, arg5);
// 调用后的FTABLE值
console.log(originalFTABLE);
console.log(
"g函数返回值: "
+ result);
return
result;
};
});
class
Skip32:
FTABLE
=
[
164
,
216
,
10
,
132
,
249
,
73
,
247
,
245
,
180
,
34
,
22
,
121
,
154
,
178
,
176
,
250
,
232
,
46
,
78
,
139
,
207
,
77
,
203
,
47
,
83
,
150
,
218
,
31
,
79
,
57
,
69
,
41
,
11
,
224
,
3
,
161
,
24
,
242
,
97
,
105
,
19
,
184
,
123
,
196
,
234
,
251
,
62
,
84
,
151
,
133
,
108
,
187
,
243
,
100
,
155
,
26
,
125
,
175
,
230
,
246
,
248
,
23
,
107
,
163
,
58
,
183
,
124
,
16
,
194
,
148
,
130
,
28
,
239
,
181
,
27
,
235
,
209
,
146
,
48
,
185
,
86
,
186
,
219
,
134
,
64
,
66
,
192
,
225
,
91
,
89
,
129
,
96
,
103
,
12
,
217
,
145
,
54
,
214
,
193
,
168
,
52
,
7
,
102
,
106
,
70
,
1
,
149
,
87
,
110
,
153
,
156
,
119
,
152
,
253
,
179
,
195
,
177
,
255
,
220
,
33
,
226
,
236
,
215
,
229
,
222
,
72
,
75
,
30
,
67
,
238
,
159
,
111
,
74
,
61
,
206
,
68
,
40
,
211
,
8
,
213
,
223
,
200
,
104
,
25
,
138
,
204
,
49
,
32
,
142
,
199
,
144
,
171
,
201
,
117
,
221
,
202
,
94
,
93
,
50
,
165
,
113
,
137
,
98
,
45
,
160
,
14
,
44
,
136
,
81
,
131
,
85
,
101
,
39
,
126
,
4
,
65
,
53
,
76
,
29
,
116
,
210
,
197
,
254
,
60
,
205
,
252
,
128
,
172
,
231
,
63
,
92
,
166
,
174
,
5
,
36
,
157
,
21
,
82
,
35
,
241
,
42
,
122
,
114
,
127
,
0
,
141
,
15
,
227
,
13
,
240
,
189
,
115
,
118
,
112
,
56
,
162
,
237
,
212
,
143
,
99
,
140
,
135
,
17
,
233
,
9
,
120
,
18
,
191
,
147
,
80
,
37
,
198
,
51
,
55
,
158
,
208
,
244
,
167
,
188
,
173
,
95
,
109
,
170
,
20
,
88
,
38
,
182
,
228
,
190
,
169
,
59
,
2
,
6
,
90
,
43
,
71
]
@staticmethod
def
checkpass(password, key):
target
=
[
52
,
0x8E
,
0xE2
,
0xAC
,
108
,
94
,
80
,
51
,
11
,
0xFB
,
68
,
0xA4
,
0xE7
,
6
,
0x7C
,
0xDF
,
100
,
62
,
0x74
,
70
]
password_array
=
target.copy()
# password_array = Skip32.string_to_ascii_array(password)
if
len
(password_array) !
=
20
:
return
False
for
i
in
range
(
0
,
len
(password_array),
4
):
block
=
(password_array[i] <<
24
) | (password_array[i
+
1
] <<
16
) | (password_array[i
+
2
] <<
8
) | password_array[i
+
3
]
encrypted_block
=
Skip32.eee(block, key)
password_array[i]
=
(encrypted_block >>
24
) &
0xFF
password_array[i
+
1
]
=
(encrypted_block >>
16
) &
0xFF
password_array[i
+
2
]
=
(encrypted_block >>
8
) &
0xFF
password_array[i
+
3
]
=
encrypted_block &
0xFF
print
("".join(
map
(
chr
, password_array)))
for
i
in
range
(
len
(target)):
if
target[i] !
=
password_array[i]:
return
False
return
True
@staticmethod
def
eee(value, key):
v
=
[(value >>
24
) &
0xFF
, (value >>
16
) &
0xFF
, (value >>
8
) &
0xFF
, value &
0xFF
]
Skip32.skip32(key, v,
False
)
return
(v[
0
] <<
24
) | (v[
1
] <<
16
) | (v[
2
] <<
8
) | v[
3
]
@staticmethod
def
g(key,
round
, value):
v5
=
value &
0xFF
v0
=
(value >>
8
) ^ Skip32.FTABLE[key[(
round
*
4
)
%
8
] ^ v5]
v5_1
=
v5 ^ Skip32.FTABLE[key[((
round
*
4
)
+
1
)
%
8
] ^ v0]
v0_1
=
v0 ^ Skip32.FTABLE[key[((
round
*
4
)
+
2
)
%
8
] ^ v5_1]
return
(v0_1 <<
8
) | (Skip32.FTABLE[key[((
round
*
4
)
+
3
)
%
8
] ^ v0_1] ^ v5_1)
@staticmethod
def
skip32(key, data, encrypt):
if
encrypt:
round_start, round_step
=
0
,
1
else
:
round_start, round_step
=
23
,
-
1
v3
=
(data[
0
] <<
8
) | data[
1
]
v5
=
(data[
2
] <<
8
) | data[
3
]
for
_
in
range
(
12
):
v5 ^
=
Skip32.g(key, round_start, v3) ^ round_start
round_start
+
=
round_step
v3 ^
=
Skip32.g(key, round_start, v5) ^ round_start
round_start
+
=
round_step
data[
0
]
=
(v5 >>
8
) &
0xFF
data[
1
]
=
v5 &
0xFF
data[
2
]
=
(v3 >>
8
) &
0xFF
data[
3
]
=
v3 &
0xFF
@staticmethod
def
string_to_ascii_array(s):
return
[
ord
(c)
for
c
in
s]
# 示例
if
__name__
=
=
"__main__"
:
key
=
b
"7d77cfe8"
# 8字节密钥,也就是前面的用户名8字节
password
=
"testpassword12345678"
# 20字节密码
skip32
=
Skip32()
result
=
skip32.checkpass(password, key)
class
Skip32:
FTABLE
=
[
164
,
216
,
10
,
132
,
249
,
73
,
247
,
245
,
180
,
34
,
22
,
121
,
154
,
178
,
176
,
250
,
232
,
46
,
78
,
139
,
207
,
77
,
203
,
47
,
83
,
150
,
218
,
31
,
79
,
57
,
69
,
41
,
11
,
224
,
3
,
161
,
24
,
242
,
97
,
105
,
19
,
184
,
123
,
196
,
234
,
251
,
62
,
84
,
151
,
133
,
108
,
187
,
243
,
100
,
155
,
26
,
125
,
175
,
230
,
246
,
248
,
23
,
107
,
163
,
58
,
183
,
124
,
16
,
194
,
148
,
130
,
28
,
239
,
181
,
27
,
235
,
209
,
146
,
48
,
185
,
86
,
186
,
219
,
134
,
64
,
66
,
192
,
225
,
91
,
89
,
129
,
96
,
103
,
12
,
217
,
145
,
54
,
214
,
193
,
168
,
52
,
7
,
102
,
106
,
70
,
1
,
149
,
87
,
110
,
153
,
156
,
119
,
152
,
253
,
179
,
195
,
177
,
255
,
220
,
33
,
226
,
236
,
215
,
229
,
222
,
72
,
75
,
30
,
67
,
238
,
159
,
111
,
74
,
61
,
206
,
68
,
40
,
211
,
8
,
213
,
223
,
200
,
104
,
25
,
138
,
204
,
49
,
32
,
142
,
199
,
144
,
171
,
201
,
117
,
221
,
202
,
94
,
93
,
50
,
165
,
113
,
137
,
98
,
45
,
160
,
14
,
44
,
136
,
81
,
131
,
85
,
101
,
39
,
126
,
4
,
65
,
53
,
76
,
29
,
116
,
210
,
197
,
254
,
60
,
205
,
252
,
128
,
172
,
231
,
63
,
92
,
166
,
174
,
5
,
36
,
157
,
21
,
82
,
35
,
241
,
42
,
122
,
114
,
127
,
0
,
141
,
15
,
227
,
13
,
240
,
189
,
115
,
118
,
112
,
56
,
162
,
237
,
212
,
143
,
99
,
140
,
135
,
17
,
233
,
9
,
120
,
18
,
191
,
147
,
80
,
37
,
198
,
51
,
55
,
158
,
208
,
244
,
167
,
188
,
173
,
95
,
109
,
170
,
20
,
88
,
38
,
182
,
228
,
190
,
169
,
59
,
2
,
6
,
90
,
43
,
71
]
@staticmethod
def
checkpass(password, key):
target
=
[
52
,
0x8E
,
0xE2
,
0xAC
,
108
,
94
,
80
,
51
,
11
,
0xFB
,
68
,
0xA4
,
0xE7
,
6
,
0x7C
,
0xDF
,
100
,
62
,
0x74
,
70
]
password_array
=
target.copy()
# password_array = Skip32.string_to_ascii_array(password)
if
len
(password_array) !
=
20
:
return
False
for
i
in
range
(
0
,
len
(password_array),
4
):
block
=
(password_array[i] <<
24
) | (password_array[i
+
1
] <<
16
) | (password_array[i
+
2
] <<
8
) | password_array[i
+
3
]
encrypted_block
=
Skip32.eee(block, key)
password_array[i]
=
(encrypted_block >>
24
) &
0xFF
password_array[i
+
1
]
=
(encrypted_block >>
16
) &
0xFF
password_array[i
+
2
]
=
(encrypted_block >>
8
) &
0xFF
password_array[i
+
3
]
=
encrypted_block &
0xFF
print
("".join(
map
(
chr
, password_array)))
for
i
in
range
(
len
(target)):
if
target[i] !
=
password_array[i]:
return
False
return
True
@staticmethod
def
eee(value, key):
v
=
[(value >>
24
) &
0xFF
, (value >>
16
) &
0xFF
, (value >>
8
) &
0xFF
, value &
0xFF
]
Skip32.skip32(key, v,
False
)
return
(v[
0
] <<
24
) | (v[
1
] <<
16
) | (v[
2
] <<
8
) | v[
3
]
@staticmethod
def
g(key,
round
, value):
v5
=
value &
0xFF
v0
=
(value >>
8
) ^ Skip32.FTABLE[key[(
round
*
4
)
%
8
] ^ v5]
v5_1
=
v5 ^ Skip32.FTABLE[key[((
round
*
4
)
+
1
)
%
8
] ^ v0]
v0_1
=
v0 ^ Skip32.FTABLE[key[((
round
*
4
)
+
2
)
%
8
] ^ v5_1]
return
(v0_1 <<
8
) | (Skip32.FTABLE[key[((
round
*
4
)
+
3
)
%
8
] ^ v0_1] ^ v5_1)
@staticmethod
def
skip32(key, data, encrypt):
if
encrypt:
round_start, round_step
=
0
,
1
else
:
round_start, round_step
=
23
,
-
1
v3
=
(data[
0
] <<
8
) | data[
1
]
v5
=
(data[
2
] <<
8
) | data[
3
]
for
_
in
range
(
12
):
v5 ^
=
Skip32.g(key, round_start, v3) ^ round_start
round_start
+
=
round_step
v3 ^
=
Skip32.g(key, round_start, v5) ^ round_start
round_start
+
=
round_step
data[
0
]
=
(v5 >>
8
) &
0xFF
data[
1
]
=
v5 &
0xFF
data[
2
]
=
(v3 >>
8
) &
0xFF
data[
3
]
=
v3 &
0xFF
@staticmethod
def
string_to_ascii_array(s):
return
[
ord
(c)
for
c
in
s]
# 示例
if
__name__
=
=
"__main__"
:
key
=
b
"7d77cfe8"
# 8字节密钥,也就是前面的用户名8字节
password
=
"testpassword12345678"
# 20字节密码
skip32
=
Skip32()
result
=
skip32.checkpass(password, key)
from
string
import
printable
qword
=
0xCBF29CE484222325
s
=
"08985807b541d18fd5f2d079088c0b172282110ea367087223826d0a97ceea455feb92ec9da6ccc6418727fdc0a2295bbf325bb7f6fb98b90669076ed7c9bfb3d905a4abf3eb7f225f5741aae1954e6c8f70569021c638dde77f76949e5db63a7f98a3f5e1b1e3409b7cd1e5a8dea236d3c21142b990e7b8"
def
brute(qword, i):
q
=
qword
for
c1
in
printable:
for
c2
in
printable:
q
=
qword
q
=
0x100000001B3
*
(q ^
ord
(c1)) &
0xffffffffffffffff
q
=
0x100000001B3
*
(q ^
ord
(c2)) &
0xffffffffffffffff
if
q
=
=
int
(s[
16
*
i:
16
*
i
+
16
],
16
):
return
c1
+
c2, q
flag
=
""
for
i
in
range
(
15
):
f, qword
=
brute(qword, i)
flag
+
=
f
print
(flag)
# flag{BanGDream!ItsMyRust!!!!!}
from
string
import
printable
qword
=
0xCBF29CE484222325
s
=
"08985807b541d18fd5f2d079088c0b172282110ea367087223826d0a97ceea455feb92ec9da6ccc6418727fdc0a2295bbf325bb7f6fb98b90669076ed7c9bfb3d905a4abf3eb7f225f5741aae1954e6c8f70569021c638dde77f76949e5db63a7f98a3f5e1b1e3409b7cd1e5a8dea236d3c21142b990e7b8"
def
brute(qword, i):
q
=
qword
for
c1
in
printable:
for
c2
in
printable:
q
=
qword
q
=
0x100000001B3
*
(q ^
ord
(c1)) &
0xffffffffffffffff
q
=
0x100000001B3
*
(q ^
ord
(c2)) &
0xffffffffffffffff
if
q
=
=
int
(s[
16
*
i:
16
*
i
+
16
],
16
):
return
c1
+
c2, q
flag
=
""
for
i
in
range
(
15
):
f, qword
=
brute(qword, i)
flag
+
=
f
print
(flag)
# flag{BanGDream!ItsMyRust!!!!!}
xor
=
[
0xf5138033
,
0x985a0194
,
0xb4C41B8F
,
0x8B1E6089
,
0x8DB7419B
,
0xdC6873F3
,
0x849FAA92
,
0xb0D6B47E
,
0xa3AD4395
,
0xb3EA34C7
]
cmp
=
[
0x9272EC55
,
0xa86F64EF
,
0x8CA02DED
,
0xbA2A4DEF
,
0xe99A25FA
,
0xf10B4BC2
,
0xe2A89BF4
,
0xd2E28553
,
0x909920A3
,
0xcEDD52A6
]
for
i
in
range
(
10
):
print
(
int
.to_bytes(
cmp
[i]^xor[i], byteorder
=
"little"
, length
=
4
).decode(), end
=
"")
xor
=
[
0xf5138033
,
0x985a0194
,
0xb4C41B8F
,
0x8B1E6089
,
0x8DB7419B
,
0xdC6873F3
,
0x849FAA92
,
0xb0D6B47E
,
0xa3AD4395
,
0xb3EA34C7
]
cmp
=
[
0x9272EC55
,
0xa86F64EF
,
0x8CA02DED
,
0xbA2A4DEF
,
0xe99A25FA
,
0xf10B4BC2
,
0xe2A89BF4
,
0xd2E28553
,
0x909920A3
,
0xcEDD52A6
]
for
i
in
range
(
10
):
print
(
int
.to_bytes(
cmp
[i]^xor[i], byteorder
=
"little"
, length
=
4
).decode(), end
=
"")
import
encrypt
if
encrypt.check(
input
(
"input flag:"
)):
print
(
"right flag!"
)
# python3.12才能跑起来
import
encrypt
if
encrypt.check(
input
(
"input flag:"
)):
print
(
"right flag!"
)
# python3.12才能跑起来
// write access to const memory has been detected, the output may be wrong!
__int64
__fastcall sub_180001190(
__int64
a1, _QWORD *a2)
{
//...
v2 = 0LL;
v134 = 0LL;
v3 = 0LL;
v133 = 0LL;
v4 = 0LL;
v131 = 0LL;
Item = 0LL;
v132 = 0LL;
v6 = 0LL;
v136 = 0LL;
v130 = 0LL;
v8 = PyObject_Size(a2);
if
( v8 == -1 )
{
v9 = 2;
v10 = 2575;
goto
LABEL_135;
}
if
( v8 != 40 )
//检查长度
{
result = Py_FalseStruct;
if
( Py_FalseStruct != -1 )
{
++Py_FalseStruct;
return
Py_FalseStruct;
}
return
result;
}
v12 = PyList_New(5LL);
if
( !v12 )
{
v9 = 4;
v10 = 2606;
goto
LABEL_135;
}
v13 = off_18000B668;
v14 = (_DWORD *)*((_QWORD *)off_18000B668 + 41);
// 0xfbbc7f84591ff393
if
( *v14 != -1 )
++*v14;
**(_QWORD **)(v12 + 24) = v13[41];
// 0xfbbc7f84591ff393
v15 = (_DWORD *)v13[38];
if
( *v15 != -1 )
++*v15;
*(_QWORD *)(*(_QWORD *)(v12 + 24) + 8LL) = v13[38];
// 0x360c751ee6bd9abd
v16 = (_DWORD *)v13[39];
if
( *v16 != -1 )
++*v16;
*(_QWORD *)(*(_QWORD *)(v12 + 24) + 16LL) = v13[39];
// 0x60854fc80d82350a
v17 = (_DWORD *)v13[37];
if
( *v17 != -1 )
++*v17;
*(_QWORD *)(*(_QWORD *)(v12 + 24) + 24LL) = v13[37];
// 0x139692ebf3ee3c4f
v18 = (_DWORD *)v13[40];
if
( *v18 != -1 )
++*v18;
v134 = v12;
*(_QWORD *)(*(_QWORD *)(v12 + 24) + 32LL) = v13[40];
// 0x8571b17650a42bd4
v19 = PyList_New(4LL);
if
( !v19 )
{
v9 = 5;
v10 = 2633;
goto
LABEL_135;
}
v20 = off_18000B668;
v21 = (_DWORD *)*((_QWORD *)off_18000B668 + 36);
// 4132849165
if
( *v21 != -1 )
++*v21;
**(_QWORD **)(v19 + 24) = v20[36];
v22 = (_DWORD *)v20[33];
if
( *v22 != -1 )
++*v22;
*(_QWORD *)(*(_QWORD *)(v19 + 24) + 8LL) = v20[33];
// 3658760800
v23 = (_DWORD *)v20[35];
if
( *v23 != -1 )
++*v23;
*(_QWORD *)(*(_QWORD *)(v19 + 24) + 16LL) = v20[35];
// 4008823107
v24 = (_DWORD *)v20[34];
if
( *v24 != -1 )
++*v24;
v133 = v19;
*(_QWORD *)(*(_QWORD *)(v19 + 24) + 24LL) = v20[34];
// 3828944742
v25 = (_QWORD *)PyList_New(0LL);
if
( !v25 )
{
v9 = 6;
v10 = 2658;
goto
LABEL_119;
}
v26 = a2[1];
v27 = -1LL;
v135 = -1LL;
if
( v26 == PyList_Type || v26 == PyTuple_Type )
{
Item = a2;
if
( *(_DWORD *)a2 != -1 )
++*(_DWORD *)a2;
v27 = 0LL;
}
else
{
Iter = PyObject_GetIter(a2);
Item = (_QWORD *)Iter;
if
( !Iter )
{
v9 = 6;
v10 = 2665;
goto
LABEL_119;
}
v2 = *(
__int64
(__fastcall **)(_QWORD *))(*(_QWORD *)(Iter + 8) + 224LL);
if
( !v2 )
{
v9 = 6;
v10 = 2667;
goto
LABEL_119;
}
}
v29 = Item + 3;
while
( !v2 )
// 循环,里面有ord操作
{
v30 = Item[2];
if
( Item[1] == PyList_Type )
{
if
( v27 >= v30 )
goto
LABEL_94;
v31 = *(_DWORD **)(Item[3] + 8 * v27);
if
( *v31 != -1 )
++*v31;
v29 = Item + 3;
++v27;
}
else
{
if
( v27 >= v30 )
{
LABEL_94:
v46 = 0;
v6 = 0LL;
goto
LABEL_104;
}
v31 = (_DWORD *)v29[v27];
if
( *v31 != -1 )
++*v31;
++v27;
}
LABEL_51:
v33 = v4;
v4 = v31;
if
( v33 )
{
if
( *v33 >= 0 )
{
v34 = (*(_QWORD *)v33)-- == 1LL;
if
( v34 )
Py_Dealloc(v33);
}
}
v35 = *((_QWORD *)v4 + 1);
v137 = 0LL;
v36 = *(_DWORD *)(v35 + 168);
if
( (v36 & 0x10000000) != 0 )
{
v37 = *((_QWORD *)v4 + 2);
if
( v37 != 1 )
{
PyErr_Format(
PyExc_ValueError,
"only single character unicode strings can be converted to Py_UCS4, got length %zd"
,
v37);
v40 = 0xFFFFFFFFLL;
goto
LABEL_83;
}
v38 = v4[8];
if
( (v38 & 0x1C) == 4 )
{
if
( (v38 & 0x20) != 0 )
{
if
( (v38 & 0x40) != 0 )
v39 = (unsigned
__int8
*)(v4 + 10);
else
v39 = (unsigned
__int8
*)(v4 + 14);
}
else
{
v39 = (unsigned
__int8
*)*((_QWORD *)v4 + 7);
}
LABEL_82:
v40 = *v39;
goto
LABEL_83;
}
if
( (v38 & 0x1C) == 8 )
{
if
( (v38 & 0x20) != 0 )
{
if
( (v38 & 0x40) != 0 )
v40 = *((unsigned
__int16
*)v4 + 20);
else
v40 = *((unsigned
__int16
*)v4 + 28);
}
else
{
v40 = **((unsigned
__int16
**)v4 + 7);
}
}
else
if
( (v38 & 0x20) != 0 )
{
if
( (v38 & 0x40) != 0 )
v40 = (unsigned
int
)v4[10];
else
v40 = (unsigned
int
)v4[14];
}
else
{
v40 = **((unsigned
int
**)v4 + 7);
}
}
else
{
if
( (v36 & 0x8000000) == 0 )
{
if
( v35 != PyByteArray_Type && !(unsigned
int
)PyType_IsSubtype() )
{
PyErr_Format(
PyExc_TypeError,
"ord() expected string of length 1, but %.200s found"
,
*(_QWORD *)(*((_QWORD *)v4 + 1) + 24LL));
goto
LABEL_99;
}
v41 = *((_QWORD *)v4 + 2);
if
( v41 != 1 )
{
LABEL_98:
PyErr_Format(PyExc_TypeError,
"ord() expected a character, but string of length %zd found"
, v41);
LABEL_99:
v10 = 2714;
LABEL_114:
v9 = 6;
if
( v4 )
{
if
( (
int
)*v4 >= 0 )
{
v34 = (*(_QWORD *)v4)-- == 1LL;
if
( v34 )
Py_Dealloc(v4);
}
}
v6 = (
int
*)v137;
goto
LABEL_119;
}
v39 = (unsigned
__int8
*)*((_QWORD *)v4 + 5);
goto
LABEL_82;
}
v41 = *((_QWORD *)v4 + 2);
if
( v41 != 1 )
goto
LABEL_98;
v40 = *((unsigned
__int8
*)v4 + 32);
}
LABEL_83:
if
( (_DWORD)v40 == -1 )
goto
LABEL_99;
v42 = (_DWORD *)PyLong_FromLong(v40);
v137 = (
__int64
)v42;
v43 = v42;
if
( !v42 )
{
v10 = 2715;
goto
LABEL_114;
}
v44 = v25[2];
if
( v25[4] <= v44 )
{
if
( (unsigned
int
)PyList_Append(v25, v42) )
// 这里应该是ord列表
{
v10 = 2717;
goto
LABEL_114;
}
v43 = (_DWORD *)v137;
}
else
{
v45 = *v42 + 1;
if
( v45 )
*v43 = v45;
*(_QWORD *)(v25[3] + 8 * v44) = v43;
v25[2] = v44 + 1;
}
if
( (
int
)*v43 >= 0 )
{
v34 = (*(_QWORD *)v43)-- == 1LL;
if
( v34 )
Py_Dealloc(v43);
}
}
v137 = v2(Item);
v31 = (_DWORD *)v137;
if
( v137 )
goto
LABEL_51;
v47 = PyErr_Occurred(v32);
if
( v47 )
{
if
( !(unsigned
int
)sub_1800062C0(v47, PyExc_StopIteration) )
{
v10 = 2706;
goto
LABEL_114;
}
PyErr_Clear();
}
v6 = 0LL;
v46 = 0;
LABEL_104:
if
( *(
int
*)Item >= 0 )
{
v34 = (*Item)-- == 1LL;
if
( v34 )
Py_Dealloc(Item);
}
if
( v4 )
{
if
( (
int
)*v4 >= 0 )
{
v34 = (*(_QWORD *)v4)-- == 1LL;
if
( v34 )
Py_Dealloc(v4);
}
}
v48 = (
int
*)v25;
v131 = (
__int64
)v25;
v25 = 0LL;
v49 = *((_QWORD *)v48 + 2);
// 取长度
if
( v49 == -1 )
{
v9 = 7;
v10 = 2738;
goto
LABEL_135;
}
v56 = v49 % 8;
//
v57 = 8 * ((v56 != 0) & (v56 >> 63));
if
( v56 + v57 )
{
v58 = 8 - v56 - v57;
v59 = v58;
if
( v58 < 0 )
v59 = 0LL;
v25 = (_QWORD *)PyList_New(v59);
if
( !v25 )
{
v9 = 8;
v10 = 2751;
goto
LABEL_135;
}
v60 = 0LL;
if
( v58 > 0 )
{
v61 = off_18000B668;
do
{
v62 = (_DWORD *)v61[30];
// 0
if
( *v62 != -1 )
++*v62;
*(_QWORD *)(v25[3] + 8 * v60++) = v61[30];
// 这里很明显补0
}
while
( v60 < v58 );
}
Item = (_QWORD *)PyNumber_Add(v48, v25);
if
( !Item )
{
v9 = 8;
v10 = 2760;
goto
LABEL_120;
}
if
( *(
int
*)v25 >= 0 )
{
v34 = (*v25)-- == 1LL;
if
( v34 )
Py_Dealloc(v25);
}
v63 = v48;
v131 = (
__int64
)Item;
v25 = 0LL;
v48 = (
int
*)Item;
if
( *v63 >= 0 )
{
v34 = (*(_QWORD *)v63)-- == 1LL;
if
( v34 )
Py_Dealloc(v63);
}
}
Item = (_QWORD *)PyList_New(0LL);
if
( !Item )
{
v9 = 9;
v10 = 2783;
goto
LABEL_135;
}
v64 = *((_QWORD *)v48 + 2);
if
( v64 == -1 )
{
v9 = 9;
v10 = 2785;
goto
LABEL_124;
}
for
( i = 0LL; i < v64; v25 = 0LL )
{
v66 = *((_QWORD *)off_18000B668 + 19);
v67 = *(
__int64
(__fastcall **)(_QWORD,
__int64
))(PyLong_Type[1] + 144LL);
if
( v67 )
Attr = v67(PyLong_Type[0], v66);
else
Attr = PyObject_GetAttr(PyLong_Type[0], v66);
v6 = (
int
*)Attr;
if
( !Attr )
{
v130 = 0LL;
v9 = 9;
v10 = 2789;
goto
LABEL_124;
}
v69 = *((_QWORD *)v48 + 2);
v70 = i;
v71 = i + 8;
if
( i < 0 )
{
v70 = v69 + i;
if
( v69 + i < 0 )
v70 = 0LL;
}
if
( v71 >= 0 )
{
if
( v71 > v69 )
v71 = *((_QWORD *)v48 + 2);
}
else
{
v71 += v69;
}
v72 = v71 - v70;
if
( v72 > 0 )
{
v74 = *((_QWORD *)v48 + 3) + 8 * v70;
v75 = PyList_New(v72);
v130 = (
int
*)v75;
v73 = v75;
if
( v75 )
{
v76 = *(_QWORD **)(v75 + 24);
v77 = v74 - (_QWORD)v76;
do
{
v78 = *(_DWORD **)((
char
*)v76 + v77);
*v76 = v78;
if
( *v78 != -1 )
++*v78;
++v76;
--v72;
}
while
( v72 );
}
else
{
v73 = 0LL;
v130 = 0LL;
}
v48 = (
int
*)v131;
}
else
{
v73 = PyList_New(0LL);
v130 = (
int
*)v73;
}
if
( !v73 )
{
v9 = 9;
v10 = 2791;
goto
LABEL_124;
}
v79 = 0LL;
v80 = 0;
if
( *((_QWORD *)v6 + 1) == PyMethod_Type )
{
v79 = (_DWORD *)*((_QWORD *)v6 + 3);
if
( v79 )
{
v81 = (
int
*)*((_QWORD *)v6 + 2);
if
( *v79 != -1 )
++*v79;
if
( *v81 != -1 )
++*v81;
v82 = v6;
v6 = v81;
if
( *v82 >= 0 )
{
v34 = (*(_QWORD *)v82)-- == 1LL;
if
( v34 )
{
Py_Dealloc(v82);
v73 = (
__int64
)v130;
}
}
v80 = 1;
}
}
v139[0] = v73;
v138[1] = (
__int64
)v79;
v139[1] = *((_QWORD *)off_18000B668 + 25);
v25 = (_QWORD *)sub_180004330((
__int64
)v6, &v139[-v80], (unsigned
int
)(v80 + 2));
if
( v79 )
{
if
( (
int
)*v79 >= 0 )
{
v34 = (*(_QWORD *)v79)-- == 1LL;
if
( v34 )
Py_Dealloc(v79);
}
}
if
( *v130 >= 0 )
{
v34 = (*(_QWORD *)v130)-- == 1LL;
if
( v34 )
Py_Dealloc(v130);
}
v46 = 0;
v130 = 0LL;
if
( !v25 )
{
v9 = 9;
v10 = 2812;
goto
LABEL_124;
}
if
( *v6 >= 0 )
{
v34 = (*(_QWORD *)v6)-- == 1LL;
if
( v34 )
Py_Dealloc(v6);
}
v83 = Item[2];
v6 = 0LL;
if
( Item[4] <= v83 )
{
if
( (unsigned
int
)PyList_Append(Item, v25) )
{
v9 = 9;
v10 = 2816;
goto
LABEL_120;
}
}
else
{
if
( *(_DWORD *)v25 != -1 )
++*(_DWORD *)v25;
*(_QWORD *)(Item[3] + 8 * v83) = v25;
Item[2] = v83 + 1;
}
if
( *(
int
*)v25 >= 0 )
{
v34 = (*v25)-- == 1LL;
if
( v34 )
Py_Dealloc(v25);
}
i += 8LL;
// 这里循环操作是每八个一组加到了item
}
v84 = Item;
v131 = (
__int64
)Item;
if
( *v48 >= 0 )
{
v34 = (*(_QWORD *)v48)-- == 1LL;
if
( v34 )
Py_Dealloc(v48);
}
v85 = Item[2];
if
( v85 == -1 )
{
v9 = 10;
v10 = 2830;
goto
LABEL_135;
}
v86 = 0LL;
if
( v85 <= 0 )
goto
LABEL_311;
while
( 2 )
{
v87 = v86;
if
( v86 < 0 )
v87 = v86 + v84[2];
if
( v87 >= v84[2] )
{
v88 = PyLong_FromSsize_t(v86);
// 下标,后面还有个判断范围
v89 = (
int
*)v88;
if
( v88 )
{
Item = (_QWORD *)PyObject_GetItem(v84, v88);
// 从前面的新数组里取出
if
( *v89 >= 0 )
{
v34 = (*(_QWORD *)v89)-- == 1LL;
if
( v34 )
Py_Dealloc(v89);
}
}
else
{
Item = 0LL;
}
}
else
{
Item = *(_QWORD **)(v84[3] + 8 * v87);
if
( *(_DWORD *)Item != -1 )
++*(_DWORD *)Item;
}
if
( !Item )
{
v9 = 11;
v10 = 2842;
goto
LABEL_119;
}
v90 = v3;
v3 = (
int
*)Item;
if
( v90 )
{
if
( *v90 >= 0 )
{
v34 = (*(_QWORD *)v90)-- == 1LL;
if
( v34 )
Py_Dealloc(v90);
}
}
v91 = 0;
while
( 2 )
{
v92 = PyLong_FromLong((unsigned
int
)v91);
Item = (_QWORD *)v92;
if
( !v92 )
{
v9 = 12;
v10 = 2855;
goto
LABEL_119;
}
v94 = v132;
v132 = (
int
*)v92;
if
( v94 )
{
if
( *v94 >= 0 )
{
v34 = (*(_QWORD *)v94)-- == 1LL;
if
( v34 )
Py_Dealloc(v94);
}
}
v95 = *((_QWORD *)off_18000B668 + 32);
// 62
if
( *((_QWORD *)v3 + 1) != PyLong_Type[0] )
{
v97 = PyNumber_Rshift(v3, *((_QWORD *)off_18000B668 + 32));
// 取出的值右移62位,等于只有前2位
LABEL_254:
Item = (_QWORD *)v97;
goto
LABEL_255;
}
v96 = *((_QWORD *)v3 + 2);
if
( (v96 & 1) == 0 )
{
if
( v96 >= 0x10 )
{
switch
( (v96 >> 3) * (1 - (*((_QWORD *)v3 + 2) & 3LL)) )
{
case
0xFFFFFFFFFFFFFFFEuLL:
v97 = PyLong_FromLongLong(
-(
__int64
)((unsigned
int
)v3[6] | ((unsigned
__int64
)(unsigned
int
)v3[7] << 30)) >> 62,
0x180000000uLL,
v93,
v95);
break
;
case
2uLL:
v97 = PyLong_FromLongLong(
(
__int64
)((unsigned
__int64
)(unsigned
int
)v3[7] << 30) >> 62,
0x180000000uLL,
v93,
v95);
break
;
default
:
v97 = (*(
__int64
(__fastcall **)(
int
*, _QWORD))(PyLong_Type[12] + 96LL))(
v3,
*((_QWORD *)off_18000B668 + 32));
// 62
break
;
}
}
else
{
v97 = PyLong_FromLong((unsigned
int
)((
int
)(v3[6] * (1 - (v96 & 3))) >> 31));
}
goto
LABEL_254;
}
if
( *v3 != -1 )
++*v3;
Item = v3;
LABEL_255:
if
( !Item )
// 上面右移完正常直接跳转到这里
{
v9 = 13;
v10 = 2867;
goto
LABEL_119;
}
v98 = v136;
v99 = (
__int64
)Item;
v136 = (
int
*)Item;
if
( v98 )
{
if
( *v98 >= 0 )
{
v34 = (*(_QWORD *)v98)-- == 1LL;
if
( v34 )
Py_Dealloc(v98);
}
}
v100 = *((_QWORD *)off_18000B668 + 31);
// 2
if
( *((_QWORD *)v3 + 1) != PyLong_Type[0] )
goto
LABEL_276;
// 类似上面要跳转的
v101 = *((_QWORD *)v3 + 2);
if
( (v101 & 1) == 0 )
{
if
( v101 >= 0x10 )
{
switch
( (v101 >> 3) * (1 - (*((_QWORD *)v3 + 2) & 3LL)) )
{
case
0xFFFFFFFFFFFFFFFEuLL:
v103 = -(
__int64
)((unsigned
int
)v3[6] | ((unsigned
__int64
)(unsigned
int
)v3[7] << 30));
goto
LABEL_273;
case
2uLL:
v103 = (unsigned
int
)v3[6] | ((unsigned
__int64
)(unsigned
int
)v3[7] << 30);
goto
LABEL_273;
default
:
v104 = (*(
__int64
(__fastcall **)(
int
*, _QWORD))(PyLong_Type[12] + 88LL))(
v3,
*((_QWORD *)off_18000B668 + 31));
break
;
}
goto
LABEL_277;
}
v102 = v3[6] * (1 - (v101 & 3));
if
( v102 == (4 * v102) >> 2 || !v102 )
{
v104 = PyLong_FromLong((unsigned
int
)(4 * v102));
LABEL_277:
Item = (_QWORD *)v104;
// 左移2位后到这
goto
LABEL_278;
}
v103 = v102;
LABEL_273:
if
( v103 == (
__int64
)(4 * v103) >> 2 )
{
v104 = PyLong_FromLongLong(4 * v103, v103, v93, v100);
goto
LABEL_277;
}
LABEL_276:
v104 = PyNumber_InPlaceLshift(v3, *((_QWORD *)off_18000B668 + 31));
// 左移2位
goto
LABEL_277;
}
if
( *v3 != -1 )
++*v3;
Item = v3;
LABEL_278:
if
( !Item )
// 左移2位到那边再到这
{
v9 = 14;
v10 = 2879;
goto
LABEL_119;
}
v105 = v3;
v3 = (
int
*)Item;
// 把原始数据改了
if
( *v105 >= 0 )
{
v34 = (*(_QWORD *)v105)-- == 1LL;
if
( v34 )
Py_Dealloc(v105);
}
v106 = PyNumber_InPlaceAnd(Item, *((_QWORD *)off_18000B668 + 42), v93, v100);
// &0xffffffffffffffff
Item = (_QWORD *)v106;
if
( !v106 )
{
v9 = 15;
v10 = 2891;
goto
LABEL_119;
}
v107 = v3;
v3 = (
int
*)v106;
// 再次修改值
if
( *v107 >= 0 )
{
v34 = (*(_QWORD *)v107)-- == 1LL;
if
( v34 )
Py_Dealloc(v107);
}
v108 = sub_180004660(v133, v99);
// 取出值,v133数组正好是前面那个长度为4的列表
Item = (_QWORD *)v108;
// v99正好是上面8字节右移62位后的结果,相当于根据不同下标值取值
if
( !v108 )
{
v9 = 16;
v10 = 2903;
goto
LABEL_119;
}
v109 = PyNumber_InPlaceXor(v3, v108);
// 做了异或
if
( !v109 )
{
v9 = 16;
v10 = 2905;
goto
LABEL_124;
}
if
( *(
int
*)Item >= 0 )
{
v34 = (*Item)-- == 1LL;
if
( v34 )
Py_Dealloc(Item);
}
v110 = v3;
v3 = (
int
*)v109;
// 再次修改
if
( *v110 >= 0 )
{
v34 = (*(_QWORD *)v110)-- == 1LL;
if
( v34 )
Py_Dealloc(v110);
}
v46 = 0;
++v91;
v25 = 0LL;
if
( v91 < 32 )
// 这里知道了循环32次,且发现v3没有做下标变化,等于一直在加密
continue
;
break
;
}
v84 = (_QWORD *)v131;
if
( v86 < 0 )
v111 = v86 + *(_QWORD *)(v131 + 16);
else
v111 = v86;
if
( v111 >= *(_QWORD *)(v131 + 16) )
{
v113 = PyLong_FromSsize_t(v86);
v114 = (
int
*)v113;
if
( !v113 )
goto
LABEL_313;
v115 = PyObject_SetItem(v131, v113, v3);
if
( *v114 >= 0 )
{
v34 = (*(_QWORD *)v114)-- == 1LL;
if
( v34 )
Py_Dealloc(v114);
}
if
( v115 < 0 )
{
LABEL_313:
v9 = 17;
v10 = 2919;
goto
LABEL_135;
}
v46 = 0;
}
else
{
v112 = *(
int
**)(8 * v111 + *(_QWORD *)(v131 + 24));
if
( *v3 != -1 )
++*v3;
*(_QWORD *)(8 * v111 + *(_QWORD *)(v131 + 24)) = v3;
if
( *v112 >= 0 )
{
v34 = (*(_QWORD *)v112)-- == 1LL;
if
( v34 )
Py_Dealloc(v112);
}
}
if
( ++v86 < v85 )
// 判断是否超出新数组长度
continue
;
break
;
}
LABEL_311:
v116 = v84[2];
if
( v116 == -1 )
{
v9 = 18;
v10 = 2929;
goto
LABEL_135;
}
v117 = PyLong_FromSsize_t(v116);
v25 = (_QWORD *)v117;
if
( !v117 )
{
v9 = 18;
v10 = 2930;
goto
LABEL_135;
}
v138[0] = v117;
Item = (_QWORD *)sub_180004330(qword_18000BE08, v138, 0x8000000000000001uLL);
if
( !Item )
{
v9 = 18;
v10 = 2932;
goto
LABEL_120;
}
if
( *(
int
*)v25 >= 0 )
{
v34 = (*v25)-- == 1LL;
if
( v34 )
Py_Dealloc(v25);
}
v118 = Item[1];
if
( v118 == PyList_Type || v118 == PyTuple_Type )
{
v25 = Item;
if
( *(_DWORD *)Item != -1 )
++*(_DWORD *)Item;
v121 = 0LL;
v135 = 0LL;
v120 = 0LL;
}
else
{
v119 = PyObject_GetIter(Item);
v25 = (_QWORD *)v119;
if
( !v119 )
{
v9 = 18;
v10 = 2940;
goto
LABEL_124;
}
v120 = *(
__int64
(__fastcall **)(_QWORD *))(*(_QWORD *)(v119 + 8) + 224LL);
if
( !v120 )
{
v9 = 18;
v10 = 2942;
goto
LABEL_120;
}
v121 = -1LL;
}
if
( *(
int
*)Item >= 0 )
{
v34 = (*Item)-- == 1LL;
if
( v34 )
Py_Dealloc(Item);
}
v122 = v25 + 3;
while
( 2 )
{
if
( !v120 )
{
if
( v121 >= v25[2] )
goto
LABEL_383;
if
( v25[1] == PyList_Type )
{
v122 = v25 + 3;
Item = *(_QWORD **)(v25[3] + 8 * v121);
}
else
{
Item = (_QWORD *)v122[v121];
}
if
( *(_DWORD *)Item != -1 )
++*(_DWORD *)Item;
v135 = v121 + 1;
LABEL_351:
v124 = v132;
v125 = (
__int64
)Item;
v132 = (
int
*)Item;
if
( v124 )
{
if
( *v124 >= 0 )
{
v34 = (*(_QWORD *)v124)-- == 1LL;
if
( v34 )
Py_Dealloc(v124);
}
}
Item = (_QWORD *)sub_180004660(v131, (
__int64
)Item);
// 取出
if
( !Item )
{
v9 = 19;
v10 = 2998;
goto
LABEL_119;
}
v126 = sub_180004660(v134, v125);
v6 = (
int
*)v126;
if
( !v126 )
{
v9 = 19;
v10 = 3000;
goto
LABEL_119;
}
v130 = (
int
*)PyObject_RichCompare(Item, v126, 3LL);
// 比较
v127 = v130;
if
( !v130 )
{
v9 = 19;
v10 = 3002;
goto
LABEL_119;
}
if
( *(
int
*)Item >= 0 )
{
v34 = (*Item)-- == 1LL;
if
( v34 )
{
Py_Dealloc(Item);
v127 = v130;
}
}
Item = 0LL;
if
( *v6 >= 0 )
{
v34 = (*(_QWORD *)v6)-- == 1LL;
if
( v34 )
{
Py_Dealloc(v6);
v127 = v130;
}
}
v6 = 0LL;
LOBYTE(v46) = v127 == (
int
*)Py_TrueStruct;
if
( !(v46 | (v127 == (
int
*)Py_FalseStruct || v127 == (
int
*)Py_NoneStruct)) )
{
IsTrue = PyObject_IsTrue(v127);
v127 = v130;
v46 = IsTrue;
}
if
( v46 < 0 )
{
v9 = 19;
v10 = 3005;
goto
LABEL_119;
}
if
( *v127 >= 0 )
{
v34 = (*(_QWORD *)v127)-- == 1LL;
if
( v34 )
Py_Dealloc(v127);
}
v34 = v46 == 0;
v130 = 0LL;
v46 = 0;
v121 = v135;
if
( !v34 )
{
if
( Py_FalseStruct != -1 )
++Py_FalseStruct;
v53 = Py_FalseStruct;
if
( *(
int
*)v25 >= 0 )
{
v34 = (*v25)-- == 1LL;
if
( v34 )
Py_Dealloc(v25);
}
LABEL_389:
v52 = (
int
*)v134;
v54 = (
int
*)v133;
v55 = v132;
v50 = v136;
v51 = (
int
*)v131;
goto
LABEL_390;
}
continue
;
}
break
;
}
Item = (_QWORD *)v120(v25);
if
( Item )
goto
LABEL_351;
v129 = PyErr_Occurred(v123);
if
( !v129 )
goto
LABEL_383;
if
( (unsigned
int
)sub_1800062C0(v129, PyExc_StopIteration) )
{
PyErr_Clear();
LABEL_383:
if
( *(
int
*)v25 >= 0 )
{
v34 = (*v25)-- == 1LL;
if
( v34 )
Py_Dealloc(v25);
}
if
( Py_TrueStruct != -1 )
++Py_TrueStruct;
v53 = Py_TrueStruct;
// 这是返回值
goto
LABEL_389;
}
v9 = 18;
v10 = 2982;
LABEL_119:
if
( v25 )
{
LABEL_120:
if
( *(
int
*)v25 >= 0 )
{
v34 = (*v25)-- == 1LL;
if
( v34 )
Py_Dealloc(v25);
}
}
if
( Item )
{
LABEL_124:
if
( *(
int
*)Item >= 0 )
{
v34 = (*Item)-- == 1LL;
if
( v34 )
Py_Dealloc(Item);
}
}
if
( v6 )
{
if
( *v6 >= 0 )
{
v34 = (*(_QWORD *)v6)-- == 1LL;
if
( v34 )
Py_Dealloc(v6);
}
}
if
( v130 )
{
if
( *v130 >= 0 )
{
v34 = (*(_QWORD *)v130)-- == 1LL;
if
( v34 )
Py_Dealloc(v130);
}
}
LABEL_135:
v50 = v136;
v51 = (
int
*)v131;
sub_180005DE0(
"encrypt.check"
, v10, v9, (
__int64
)
"encrypt.py"
);
v52 = (
int
*)v134;
v53 = 0LL;
v54 = (
int
*)v133;
v55 = v132;
if
( v134 )
{
LABEL_390:
if
( *v52 >= 0 )
{
v34 = (*(_QWORD *)v52)-- == 1LL;
if
( v34 )
Py_Dealloc(v52);
}
}
if
( v54 )
{
if
( *v54 >= 0 )
{
v34 = (*(_QWORD *)v54)-- == 1LL;
if
( v34 )
Py_Dealloc(v54);
}
}
if
( v51 )
{
if
( *v51 >= 0 )
{
v34 = (*(_QWORD *)v51)-- == 1LL;
if
( v34 )
Py_Dealloc(v51);
}
}
if
( v3 )
{
if
( *v3 >= 0 )
{
v34 = (*(_QWORD *)v3)-- == 1LL;
if
( v34 )
Py_Dealloc(v3);
}
}
if
( v55 )
{
if
( *v55 >= 0 )
{
v34 = (*(_QWORD *)v55)-- == 1LL;
if
( v34 )
Py_Dealloc(v55);
}
}
if
( v50 && *v50 >= 0 )
{
v34 = (*(_QWORD *)v50)-- == 1LL;
if
( v34 )
Py_Dealloc(v50);
}
return
v53;
}
// write access to const memory has been detected, the output may be wrong!
__int64
__fastcall sub_180001190(
__int64
a1, _QWORD *a2)
{
//...
v2 = 0LL;
v134 = 0LL;
v3 = 0LL;
v133 = 0LL;
v4 = 0LL;
v131 = 0LL;
Item = 0LL;
v132 = 0LL;
v6 = 0LL;
v136 = 0LL;
v130 = 0LL;
v8 = PyObject_Size(a2);
if
( v8 == -1 )
{
v9 = 2;
v10 = 2575;
goto
LABEL_135;
}
if
( v8 != 40 )
//检查长度
{
result = Py_FalseStruct;
if
( Py_FalseStruct != -1 )
{
++Py_FalseStruct;
return
Py_FalseStruct;
}
return
result;
}
v12 = PyList_New(5LL);
if
( !v12 )
{
v9 = 4;
v10 = 2606;
goto
LABEL_135;
}
v13 = off_18000B668;
v14 = (_DWORD *)*((_QWORD *)off_18000B668 + 41);
// 0xfbbc7f84591ff393
if
( *v14 != -1 )
++*v14;
**(_QWORD **)(v12 + 24) = v13[41];
// 0xfbbc7f84591ff393
v15 = (_DWORD *)v13[38];
if
( *v15 != -1 )
++*v15;
*(_QWORD *)(*(_QWORD *)(v12 + 24) + 8LL) = v13[38];
// 0x360c751ee6bd9abd
v16 = (_DWORD *)v13[39];
if
( *v16 != -1 )
++*v16;
*(_QWORD *)(*(_QWORD *)(v12 + 24) + 16LL) = v13[39];
// 0x60854fc80d82350a
v17 = (_DWORD *)v13[37];
if
( *v17 != -1 )
++*v17;
*(_QWORD *)(*(_QWORD *)(v12 + 24) + 24LL) = v13[37];
// 0x139692ebf3ee3c4f
v18 = (_DWORD *)v13[40];
if
( *v18 != -1 )
++*v18;
v134 = v12;
*(_QWORD *)(*(_QWORD *)(v12 + 24) + 32LL) = v13[40];
// 0x8571b17650a42bd4
v19 = PyList_New(4LL);
if
( !v19 )
{
v9 = 5;
v10 = 2633;
goto
LABEL_135;
}
v20 = off_18000B668;
v21 = (_DWORD *)*((_QWORD *)off_18000B668 + 36);
// 4132849165
if
( *v21 != -1 )
++*v21;
**(_QWORD **)(v19 + 24) = v20[36];
v22 = (_DWORD *)v20[33];
if
( *v22 != -1 )
++*v22;
*(_QWORD *)(*(_QWORD *)(v19 + 24) + 8LL) = v20[33];
// 3658760800
v23 = (_DWORD *)v20[35];
if
( *v23 != -1 )
++*v23;
*(_QWORD *)(*(_QWORD *)(v19 + 24) + 16LL) = v20[35];
// 4008823107
v24 = (_DWORD *)v20[34];
if
( *v24 != -1 )
++*v24;
v133 = v19;
*(_QWORD *)(*(_QWORD *)(v19 + 24) + 24LL) = v20[34];
// 3828944742
v25 = (_QWORD *)PyList_New(0LL);
if
( !v25 )
{
v9 = 6;
v10 = 2658;
goto
LABEL_119;
}
v26 = a2[1];
v27 = -1LL;
v135 = -1LL;
if
( v26 == PyList_Type || v26 == PyTuple_Type )
{
Item = a2;
if
( *(_DWORD *)a2 != -1 )
++*(_DWORD *)a2;
v27 = 0LL;
}
else
{
Iter = PyObject_GetIter(a2);
Item = (_QWORD *)Iter;
if
( !Iter )
{
v9 = 6;
v10 = 2665;
goto
LABEL_119;
}
v2 = *(
__int64
(__fastcall **)(_QWORD *))(*(_QWORD *)(Iter + 8) + 224LL);
if
( !v2 )
{
v9 = 6;
v10 = 2667;
goto
LABEL_119;
}
}
v29 = Item + 3;
while
( !v2 )
// 循环,里面有ord操作
{
v30 = Item[2];
if
( Item[1] == PyList_Type )
{
if
( v27 >= v30 )
goto
LABEL_94;
v31 = *(_DWORD **)(Item[3] + 8 * v27);
if
( *v31 != -1 )
++*v31;
v29 = Item + 3;
++v27;
}
else
{
if
( v27 >= v30 )
{
LABEL_94:
v46 = 0;
v6 = 0LL;
goto
LABEL_104;
}
v31 = (_DWORD *)v29[v27];
if
( *v31 != -1 )
++*v31;
++v27;
}
LABEL_51:
v33 = v4;
v4 = v31;
if
( v33 )
{
if
( *v33 >= 0 )
{
v34 = (*(_QWORD *)v33)-- == 1LL;
if
( v34 )
Py_Dealloc(v33);
}
}
v35 = *((_QWORD *)v4 + 1);
v137 = 0LL;
v36 = *(_DWORD *)(v35 + 168);
if
( (v36 & 0x10000000) != 0 )
{
v37 = *((_QWORD *)v4 + 2);
if
( v37 != 1 )
{
PyErr_Format(
PyExc_ValueError,
"only single character unicode strings can be converted to Py_UCS4, got length %zd"
,
v37);
v40 = 0xFFFFFFFFLL;
goto
LABEL_83;
}
v38 = v4[8];
if
( (v38 & 0x1C) == 4 )
{
if
( (v38 & 0x20) != 0 )
{
if
( (v38 & 0x40) != 0 )
v39 = (unsigned
__int8
*)(v4 + 10);
else
v39 = (unsigned
__int8
*)(v4 + 14);
}
else
{
v39 = (unsigned
__int8
*)*((_QWORD *)v4 + 7);
}
LABEL_82:
v40 = *v39;
goto
LABEL_83;
}
if
( (v38 & 0x1C) == 8 )
{
if
( (v38 & 0x20) != 0 )
{
if
( (v38 & 0x40) != 0 )
v40 = *((unsigned
__int16
*)v4 + 20);
else
v40 = *((unsigned
__int16
*)v4 + 28);
}
else
{
v40 = **((unsigned
__int16
**)v4 + 7);
}
}
else
if
( (v38 & 0x20) != 0 )
{
if
( (v38 & 0x40) != 0 )
v40 = (unsigned
int
)v4[10];
else
v40 = (unsigned
int
)v4[14];
}
else
{
v40 = **((unsigned
int
**)v4 + 7);
}
}
else
{
if
( (v36 & 0x8000000) == 0 )
{
if
( v35 != PyByteArray_Type && !(unsigned
int
)PyType_IsSubtype() )
{
PyErr_Format(
PyExc_TypeError,
"ord() expected string of length 1, but %.200s found"
,
*(_QWORD *)(*((_QWORD *)v4 + 1) + 24LL));
goto
LABEL_99;
}
v41 = *((_QWORD *)v4 + 2);
if
( v41 != 1 )
{
LABEL_98:
PyErr_Format(PyExc_TypeError,
"ord() expected a character, but string of length %zd found"
, v41);
LABEL_99:
v10 = 2714;
LABEL_114:
v9 = 6;
if
( v4 )
{
if
( (
int
)*v4 >= 0 )
{
v34 = (*(_QWORD *)v4)-- == 1LL;
if
( v34 )
Py_Dealloc(v4);
}
}
v6 = (
int
*)v137;
goto
LABEL_119;
}
v39 = (unsigned
__int8
*)*((_QWORD *)v4 + 5);
goto
LABEL_82;
}
v41 = *((_QWORD *)v4 + 2);
if
( v41 != 1 )
goto
LABEL_98;
v40 = *((unsigned
__int8
*)v4 + 32);
}
LABEL_83:
if
( (_DWORD)v40 == -1 )
goto
LABEL_99;
v42 = (_DWORD *)PyLong_FromLong(v40);
v137 = (
__int64
)v42;
v43 = v42;
if
( !v42 )
{
v10 = 2715;
goto
LABEL_114;
}
v44 = v25[2];
if
( v25[4] <= v44 )
{
if
( (unsigned
int
)PyList_Append(v25, v42) )
// 这里应该是ord列表
{
v10 = 2717;
goto
LABEL_114;
}
v43 = (_DWORD *)v137;
}
else
{
v45 = *v42 + 1;
if
( v45 )
*v43 = v45;
*(_QWORD *)(v25[3] + 8 * v44) = v43;
v25[2] = v44 + 1;
}
if
( (
int
)*v43 >= 0 )
{
v34 = (*(_QWORD *)v43)-- == 1LL;
if
( v34 )
Py_Dealloc(v43);
}
}
v137 = v2(Item);
v31 = (_DWORD *)v137;
if
( v137 )
goto
LABEL_51;
v47 = PyErr_Occurred(v32);
if
( v47 )
{
if
( !(unsigned
int
)sub_1800062C0(v47, PyExc_StopIteration) )
{
v10 = 2706;
goto
LABEL_114;
}
PyErr_Clear();
}
v6 = 0LL;
v46 = 0;
LABEL_104:
if
( *(
int
*)Item >= 0 )
{
v34 = (*Item)-- == 1LL;
if
( v34 )
Py_Dealloc(Item);
}
if
( v4 )
{
if
( (
int
)*v4 >= 0 )
{
v34 = (*(_QWORD *)v4)-- == 1LL;
if
( v34 )
Py_Dealloc(v4);
}
}
v48 = (
int
*)v25;
v131 = (
__int64
)v25;
v25 = 0LL;
v49 = *((_QWORD *)v48 + 2);
// 取长度
if
( v49 == -1 )
{
v9 = 7;
v10 = 2738;
goto
LABEL_135;
}
v56 = v49 % 8;
//
v57 = 8 * ((v56 != 0) & (v56 >> 63));
if
( v56 + v57 )
{
v58 = 8 - v56 - v57;
v59 = v58;
if
( v58 < 0 )
v59 = 0LL;
v25 = (_QWORD *)PyList_New(v59);
if
( !v25 )
{
v9 = 8;
v10 = 2751;
goto
LABEL_135;
}
v60 = 0LL;
if
( v58 > 0 )
{
v61 = off_18000B668;
do
{
v62 = (_DWORD *)v61[30];
// 0
if
( *v62 != -1 )
++*v62;
*(_QWORD *)(v25[3] + 8 * v60++) = v61[30];
// 这里很明显补0
}
while
( v60 < v58 );
}
Item = (_QWORD *)PyNumber_Add(v48, v25);
if
( !Item )
{
v9 = 8;
v10 = 2760;
goto
LABEL_120;
}
if
( *(
int
*)v25 >= 0 )
{
v34 = (*v25)-- == 1LL;
if
( v34 )
Py_Dealloc(v25);
}
v63 = v48;
v131 = (
__int64
)Item;
v25 = 0LL;
v48 = (
int
*)Item;
if
( *v63 >= 0 )
{
v34 = (*(_QWORD *)v63)-- == 1LL;
if
( v34 )
Py_Dealloc(v63);
}
}
Item = (_QWORD *)PyList_New(0LL);
if
( !Item )
{
v9 = 9;
v10 = 2783;
goto
LABEL_135;
}
v64 = *((_QWORD *)v48 + 2);
if
( v64 == -1 )
{
v9 = 9;
v10 = 2785;
goto
LABEL_124;
}
for
( i = 0LL; i < v64; v25 = 0LL )
{
v66 = *((_QWORD *)off_18000B668 + 19);
v67 = *(
__int64
(__fastcall **)(_QWORD,
__int64
))(PyLong_Type[1] + 144LL);
if
( v67 )
Attr = v67(PyLong_Type[0], v66);
else
Attr = PyObject_GetAttr(PyLong_Type[0], v66);
v6 = (
int
*)Attr;
if
( !Attr )
{
v130 = 0LL;
v9 = 9;
v10 = 2789;
goto
LABEL_124;
}
v69 = *((_QWORD *)v48 + 2);
v70 = i;
v71 = i + 8;
if
( i < 0 )
{
v70 = v69 + i;
if
( v69 + i < 0 )
v70 = 0LL;
}
if
( v71 >= 0 )
{
if
( v71 > v69 )
v71 = *((_QWORD *)v48 + 2);
}
else
{
v71 += v69;
}
v72 = v71 - v70;
if
( v72 > 0 )
{
v74 = *((_QWORD *)v48 + 3) + 8 * v70;
v75 = PyList_New(v72);
v130 = (
int
*)v75;
v73 = v75;
if
( v75 )
{
v76 = *(_QWORD **)(v75 + 24);
v77 = v74 - (_QWORD)v76;
do
{
v78 = *(_DWORD **)((
char
*)v76 + v77);
*v76 = v78;
if
( *v78 != -1 )
++*v78;
++v76;
--v72;
}
while
( v72 );
}
else
{
v73 = 0LL;
v130 = 0LL;
}
v48 = (
int
*)v131;
}
else
{
v73 = PyList_New(0LL);
v130 = (
int
*)v73;
}
if
( !v73 )
{
v9 = 9;
v10 = 2791;
goto
LABEL_124;
}
v79 = 0LL;
v80 = 0;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课