1.2.下载附件,用Exeinfo PE软件查壳,发现是加了upx壳
2.对exe文件进行upx脱壳(为了防止出现文件,对文件重命名去除空格)
3.对代码进行分析
4.显然,我们需要获取v5的值和对v5进行解码:
4.1获取v5的值,(懒得手动了删了,直接用re获取)
import re
s='''
v5[0] = 100;
v5[1] = 121;
v5[2] = 110;
v5[3] = 118;
v5[4] = 70;
v5[5] = 85;
v5[6] = 123;
v5[7] = 109;
v5[8] = 64;
v5[9] = 94;
v5[10] = 109;
v5[11] = 99;
v5[12] = 116;
v5[13] = 81;
v5[14] = 109;
v5[15] = 86;
v5[16] = 83;
v5[17] = 126;
v5[18] = 119;
v5[19] = 101;
v5[20] = 110;
v5[21] = 114;
'''
b=re.findall(r'.*= (.*?);',s)
#b的值就是我们需要的v5的值了,但是这个时候还是字符串,使用的时候要int转换为数字才是v5的值
4.2写解码过程,这个就是解码脚本了,过程分析请看5
b=['100', '121', '110', '118', '70', '85', '123', '109', '64', '94', '109', '99', '116', '81', '109', '86', '83', '126', '119', '101', '110', '114']
#用上面那段代码获取,打印一下就是b了
l=len(b)
c=''
v8,v9=1,1 #对应反编译代码里面的v8v9对代码进行一个逆向的计算
for i in range(l):
if i&1==0:
v8+=v9
for j in range(64,127):
v4 = (v8 + j + i) & 0x3F
if int(b[i])==(v4+64) :c+=chr(j)
else:
v9+=v8
for j in range(64,127):
v4 = (v9 + j + i) & 0x3F
if int(b[i])==(v4+64) :c+=chr(j)
print(c)
5.解码过程分析
5.1编码分析
观察得知,索引奇数和偶数进行了不同的操作,但下标为奇数和偶数操作相似,只是对v8和v9进行了个交换而已,所以,我们只要得到奇数的解码,然后把v8和v9互换,就得到了偶数的解码
5.2
j和v8是已知的,需要求的是原来的字符,v3%64+64以后,v3的值介于64-127,所以而ASCII码的范围是0-127,所以,我们可以从64-127爆破得到字符的值,爆破得到的值是脚本中的j,脚本中的j的值与输入的值相同的时候,得到我们的爆破值
v8,v9=1,1 #对应反编译代码里面的v8v9对代码进行一个逆向的计算
for i in range(l):
if i&1==0:
v8+=v9
for j in range(64,127):#从64-127爆破
v4 = (v8 + j + i) & 0x3F #等效于(v8 + j + i)%64
if int(b[i])==(v4+64) :c+=chr(j)#可以直接加个break加快运行速度,但是没必要