int
__cdecl main(
int
argc, const char
*
*
argv, const char
*
*
envp)
{
char
*
v3;
/
/
rdx
int
v4;
/
/
ecx
unsigned
int
v5;
/
/
eax
char
*
input_1;
/
/
r15
char
*
v8;
/
/
rdi
int
*
cmp_addr;
/
/
r12
char
*
cmp_dest;
/
/
r14
int
*
input_dest;
/
/
rbx
int
*
v12;
/
/
r13
int
hex_data;
/
/
eax
__int64 tmp;
/
/
rax
int
data_len;
/
/
edx
int
v16;
/
/
eax
__int64 cmp_data_len;
/
/
rax
int
cmp_data_len_1;
/
/
edx
int
v19;
/
/
ecx
int
v20;
/
/
eax
__int64 v21;
/
/
rax
char v22;
/
/
dl
char
input
[
80
];
/
/
[rsp
+
30h
] [rbp
-
3F8h
] BYREF
int
input_dest_1[
18
];
/
/
[rsp
+
80h
] [rbp
-
3A8h
] BYREF
int
v25[
18
];
/
/
[rsp
+
C8h] [rbp
-
360h
] BYREF
int
v26[
18
];
/
/
[rsp
+
110h
] [rbp
-
318h
] BYREF
int
v27[
18
];
/
/
[rsp
+
158h
] [rbp
-
2D0h
] BYREF
int
key[
9
];
/
/
[rsp
+
1A0h
] [rbp
-
288h
] BYREF
int
v29;
/
/
[rsp
+
1C4h
] [rbp
-
264h
] BYREF
__int64 v30;
/
/
[rsp
+
1E8h
] [rbp
-
240h
] BYREF
int
v31;
/
/
[rsp
+
20Ch
] [rbp
-
21Ch
] BYREF
char v32[
360
];
/
/
[rsp
+
2C0h
] [rbp
-
168h
] BYREF
sub_40CC40(argc, argv, envp);
memset(
input
,
0
, sizeof(
input
));
std::operator<<<std::char_traits<char>>((std::ostream
*
)off_4A68E0,
"Input Your Key:"
);
std::operator>><char,std::char_traits<char>>((std::istream
*
)&addr,
input
);
v3
=
input
;
do
{
v4
=
*
(_DWORD
*
)v3;
v3
+
=
4
;
v5
=
~v4 & (v4
-
0x1010101
) &
0x80808080
;
}
while
( !v5 );
if
( (~v4 & (v4
-
0x1010101
) &
0x8080
)
=
=
0
)
v5 >>
=
16
;
if
( (~v4 & (v4
-
0x1010101
) &
0x8080
)
=
=
0
)
v3
+
=
2
;
if
( &v3[
-
__CFADD__((_BYTE)v5, (_BYTE)v5)
-
3
]
-
input
=
=
64
)
/
/
strlen()
=
=
64
{
input_1
=
input
;
v8
=
v32;
cmp_addr
=
&cmp_data;
cmp_dest
=
v32;
std::operator<<<std::char_traits<char>>((std::ostream
*
)off_4A68E0,
"Are You Sure You Want To Keep Waiting...\n"
);
input_dest
=
input_dest_1;
v12
=
input_dest_1;
do
{
hex_data
=
take_eight_to_hex(input_1,
8
);
/
/
取
8
个字节当作
16
进制数据
*
((_BYTE
*
)input_dest
+
8
)
=
0
;
input_dest[
1
]
=
hex_data;
tmp
=
4i64
;
/
/
判断总共有多少个有效
16
进制数据
while
(
1
)
{
data_len
=
tmp;
if
(
*
((_BYTE
*
)input_dest
+
tmp
+
3
) )
break
;
if
( !
-
-
tmp )
{
data_len
=
0
;
break
;
}
}
*
input_dest
=
data_len;
v16
=
*
cmp_addr;
cmp_dest[
8
]
=
0
;
*
((_DWORD
*
)cmp_dest
+
1
)
=
v16;
cmp_data_len
=
4i64
;
while
(
1
)
{
cmp_data_len_1
=
cmp_data_len;
if
( cmp_dest[cmp_data_len
+
3
] )
break
;
if
( !
-
-
cmp_data_len )
{
cmp_data_len_1
=
0
;
break
;
}
}
input_1
+
=
8
;
/
/
输入字符串的地址偏移
8
字节
*
(_DWORD
*
)cmp_dest
=
cmp_data_len_1;
input_dest
+
=
9
;
cmp_dest
+
=
36
;
+
+
cmp_addr;
}
while
( input_1 !
=
&
input
[
64
] );
/
/
循环
8
次,将对应数据按格式存储
create((__int64)key,
13i64
);
create((__int64)&v29,
14i64
);
create((__int64)&v30,
15i64
);
create((__int64)&v31,
16i64
);
/
/
根据第二个参数传入的值,生成一个数并判断其
hex
共多少字节
/
/
传入
13
,
14
,
15
,
16
生成对应的四个key
xtea(input_dest_1, key);
xtea(v25, key);
tea(v26, key);
tea(v27, key);
v19
=
0
;
while
(
1
)
{
v20
=
*
v12;
if
(
*
v12 !
=
*
(_DWORD
*
)v8 )
break
;
if
( v20
-
1
>
=
0
)
{
if
( v32[
36
*
v19
-
573
+
v20] !
=
v32[
36
*
v19
+
3
+
v20] )
break
;
v21
=
v20
-
2
;
while
( (
int
)v21 >
=
0
)
{
v22
=
*
((_BYTE
*
)v12
+
v21
-
-
+
4
);
if
( v22 !
=
v8[v21
+
5
] )
goto LABEL_8;
}
}
+
+
v19;
v12
+
=
9
;
v8
+
=
36
;
if
( v19
=
=
8
)
{
printf_0(
"QWB{%s}\n"
,
input
);
return
0
;
}
}
}
LABEL_8:
printf_0(
"sorry\n"
);
return
0
;
}