REVERSE
- sum
- Poisoned_tea_CHELL
- BWBA
- Pytrans
- Emoji Connect
- OldSymbolicCode
浅浅写一下RE的WP~
sum
根据代码,可以看出程序只能输入数字,判断matrix数组对应下标的值是否为0,如果为0,则可以输入一个字符,根据代码逻辑,可以把matrix数组看成一个 9 * 9 的二维数组,将matrix数组提取出来看看
转换成 9 * 9 矩阵
5 3 0 0 7 0 0 0 0
6 0 0 1 9 5 0 0 0
0 9 8 0 0 0 0 6 0
8 0 0 0 6 0 0 0 3
4 0 0 8 0 3 0 0 1
7 0 0 0 2 0 0 0 6
0 6 0 0 0 0 2 8 0
0 0 0 4 1 9 0 0 5
0 0 0 0 8 0 0 7 9
然后verify()函数对数组进行检查,可以发现这是个数独游戏,可以用在线网站一把梭
https://shudu.gwalker.cn/
将填上的数字依次输入即得flag
Poisoned_tea_CHELL
从名字可以猜到是个tea算法
在程序中也找到了相应的tea算法,
但是数据不知道,所以动调看看
先在ubuntu里运行linux_server64,再运行程序,记得要用root权限,不然可能会有问题
这里用的是 Debugger->Attach->Remote Linux debugger方法动调
选择对应的进程即可调试
在程序里输入2后,狂按F8半分钟左右,来到一处call函数,程序会让输入flag
查看函数,这下数据也有了
脚本一把梭,这里有个坑,加密轮数为36轮
#include<stdio.h>
#include<stdlib.h>void encode(unsigned int *a1, unsigned int *a2)
{int x;unsigned __int64 i; // [rsp+8h] [rbp-18h]unsigned int v4; // [rsp+14h] [rbp-Ch]unsigned int v5; // [rsp+18h] [rbp-8h]unsigned int v6;int n=0;for(x=0;x<=5;x++){v6 = *(a1+x*2);v5 = *(a1+x*2+1);v4 = 0;i=0;do{i++;v6 += (((v5 >> 5) ^ 16 * v5) + v5) ^ (*((v4 & 3) + a2) + v4);v4 -= 0x41104111;v5 += (((v6 >> 5) ^ 16 * v6) + v6) ^ (*(((v4 >> 11) & 3) + a2) + v4);}while(i<36);*(a1+x*2) = v6;*(a1+x*2+1) = v5;
// printf("\n0x%X\n",v4);}
} void decode(unsigned int *a1, unsigned int *a2)
{int x;unsigned __int64 i; // [rsp+8h] [rbp-18h]unsigned int v4; // [rsp+14h] [rbp-Ch]unsigned int v5; // [rsp+18h] [rbp-8h]unsigned int v6;for(x=5;x>=0;x--){v6 = *(a1+x*2);v5 = *(a1+x*2+1);v4 = 0xD9B6D99C;i=0;do{i++;v5 -= (((v6 >> 5) ^ 16 * v6) + v6) ^ (*(((v4 >> 11) & 3) + a2) + v4);v4 += 0x41104111;v6 -= (((v5 >> 5) ^ 16 * v5) + v5) ^ (*((v4 & 3) + a2) + v4);}while(i<36);*(a1+x*2) = v6;*(a1+x*2+1) = v5;
// printf("\n0x%X\n",v4);}
} int main()
{unsigned int v[12]={0xECFDA301,0x61BECDF5,0xB89E6C7D,0xCE36DC68,0x4B6E539E,0x642EB504,0x54F9D33C,0x6D06E365,0xEA873D53,0xA4618507,0xD7B18E30,0xC45B4042};unsigned int key[4]={5,2,9,7};int i;decode(v,key);for(i=0;i<12;i++){printf("%c",v[i]&0xff);printf("%c",(v[i]&0xff00)%0xff);printf("%c",(v[i]&0xff0000)%0xffff);printf("%c",(v[i]&0xff000000)%0xffffff);//Thisisflag{cdfec405-3f4b-457e-92fe-f6446098ee2e}}printf("\n");for(i=0;i<12;i++){printf("0x%.8X ",v[i]);}printf("\n");encode(v,key);for(i=0;i<12;i++){printf("0x%.8X ",v[i]);}system("pause");return 0;
}
BWBA
main->encrypt()函数
主要加密代码
可以发现这是个DCT离散余弦变换
用python的cv2库可以直接解
import numpy as np
import cv2x = np.array([370.75,234.362,-58.0834,59.8212,88.8221,-30.2406,21.8316,49.9781,-33.5259,2.69675,43.5386,-30.2925,-28.0754,27.593,-2.53962,-27.1883,-5.60777,-0.263937,6.80326,8.03022,-6.34681,-0.89506,-6.80685,-13.6088,27.0958,29.8439,-21.7688,-20.6925,-13.2155,-37.0994,2.23679,37.6699,-3.5,9.85188,57.2806,13.5715,-20.7184,8.6816,3.59369,-4.5302,4.22203,-28.8166,-23.695,31.2268,6.58823,-39.9966,-20.7877,-19.7624,-22.031,16.3285,2.07557,-26.2521,16.1914,18.3976,-26.9295,3.03769,41.0412,20.2598,14.991,6.99392,-22.3752,-7.24466,8.96299,-10.4874], dtype=np.float64)
x = cv2.idct(x)
x = x.ravel()
flag=''for i in range(len(x)):flag+=chr(round(x[i]))
print(flag)#flag{9ab488a7-5b11-1b15-04f2-c230704ecf72}
Pytrans
根据题目可知这是个python打包的程序
用 python3.8,pyinstxtractor.py 解包
用uncompyle6反编译run.pyc
关键代码
主要逻辑,首先输入十个数,然后调用mylib.so文件里的check函数
用z3解一下
from z3 import *a1 = [BitVec('u%d' % i, 16) for i in range(0, 10)]
solver = Solver()solver.add(-27 * a1[7]+ -11 * a1[6]+ 16 * a1[5]+ a1[0]+ 2 * a1[1]- a1[2]+ 8 * a1[3]- 14 * a1[4]+ 26 * a1[8]+ 17 * a1[9] == 0x387E)
solver.add(-30 * a1[8] + 13 * a1[5] + a1[3] + a1[1] + 2 * a1[0] - 15 * a1[4] - 24 * a1[6] + 16 * a1[7] + 36 * a1[9] == -2591)
solver.add(16 * a1[6]+ -21 * a1[5]+ 7 * a1[3]+ 3 * a1[1]- a1[0]- a1[2]+ 12 * a1[4]- 23 * a1[7]+ 25 * a1[8]- 18 * a1[9] == 2517)
solver.add(-6 * a1[6] + 2 * a1[2] - a1[1] + 2 * a1[5] + 9 * a1[7] + 2 * a1[8] - 5 * a1[9] == 203)
solver.add(-5 * a1[8] + 6 * a1[7] + 3 * a1[1] - a1[3] - a1[5] + a1[6] + 5 * a1[9] == 3547)
solver.add(-9 * a1[8] + a1[4] + a1[2] + a1[7] - 5 * a1[9] == -7609)
solver.add(2 * a1[5] + -a1[3] - a1[4] + a1[8] + 6 * a1[9] == 4884)
solver.add(a1[6] - a1[7] + 2 * a1[8] == 1618)
solver.add(a1[4] - a1[6] + 2 * a1[9] == 1096)
solver.add(a1[8] + a1[4] + a1[3] + a1[2] + a1[1] + a1[0] - a1[5] - a1[6] - a1[7] - a1[9] == 711)
solver.add(2 * (2 * a1[4] + a1[3]) + 5 * a1[5] == 7151)if solver.check()==sat:result = solver.model()print(result)
得到十个数
511 112 821 949 517 637 897 575 648 738
输入这十个数后,发现后面还有东西
于是回去看看代码
decoded_data = base64.b64decode(scrambled_code_string)
uncompressed_data = zlib.decompress(decoded_data)
exec(__import__('marshal').loads(uncompressed_data))
这段代码可以执行一个经过混淆的 Python 代码字符串,它包含了编码后的字符串,使用 base64 进行解码,然后使用 zlib 进行解压缩。解压缩的结果是一个经过 Python 自带的 marshal 库序列化后的对象。最后,使用 exec 进行执行。
加两行代码将uncompressed_data的数据输出看看
decoded_data = base64.b64decode(scrambled_code_string)
uncompressed_data = zlib.decompress(decoded_data)
for i in uncompressed_data:print(hex(i)[2:].rjust(2,'0'),end='')
exec(__import__('marshal').loads(uncompressed_data))
将十六进制数复制出来,放入010Editor查看下
可以发现是个缺少文件头的pyc文件
将run.pyc的文件头复制过来
uncompyle6 反编译看看,代码
footprint = '3qzqns4hj6\neeaxc!4a-%\nd735_@4l6g\nf1gd1v7hdm\n1+$-953}81\na^21vbnm3!\n-#*f-e1d8_\n2ty9uipok-\n6r1802f7d1\n9wez1c-f{0'
xx0000 = []
footprintlist = footprint.split('\n')
for i in range(len(footprintlist)):xx0000.append(list(footprintlist[i]))
else:def xxxx000x0(num):xx000000 = format(num, '010b')return xx000000oxooxxxxxoooo = []xx0000000 = input("Please enter the previous 10 digits again and ending with '\\n': ").split(' ')if len(xx0000000) == 10:try:for i in xx0000000:oxooxxxxxoooo.append(int(i))except:print('err input!')exit(-1)else:print('err input!')exit(-1)for i in range(len(oxooxxxxxoooo)):oxooxxxxxoooo[i] = list(xxxx000x0(oxooxxxxxoooo[i]))else:xx0000x000 = oxooxxxxxoooox, o = (0, 0)xx00x00x0xxx00 = [(x, o)]xx00x00x0xxx00input = list(input('input maze path:'))count = 0while (x, o) != (9, 9):if count < len(xx00x00x0xxx00input):xx0000x0xxx00 = xx00x00x0xxx00input[count]if xx0000x0xxx00 == 'a':if o > 0 and xx0000x000[x][o - 1] == '0':o -= 1count += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)elif xx0000x0xxx00 == 'd':if o < 9 and xx0000x000[x][o + 1] == '0':count += 1o += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:if xx0000x0xxx00 == 'w':if x > 0 and xx0000x000[x - 1][o] == '0':count += 1x -= 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:if xx0000x0xxx00 == 's':if x < 9 and xx0000x000[x + 1][o] == '0':count += 1x += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:print('wrong!')exit(-1)else:print('wrong!')exit(-1)print('right! you maybe got it,flag is flag{the footprint of the maze path}')
可以发现是个迷宫题,根据输入的数字生成对应的迷宫,添加两行代码打印迷宫
迷宫为:
['0', '1', '1', '1', '1', '1', '1', '1', '1', '1']
['0', '0', '0', '1', '1', '1', '0', '0', '0', '0']
['1', '1', '0', '0', '1', '1', '0', '1', '0', '1']
['1', '1', '1', '0', '1', '1', '0', '1', '0', '1']
['1', '0', '0', '0', '0', '0', '0', '1', '0', '1']
['1', '0', '0', '1', '1', '1', '1', '1', '0', '1']
['1', '1', '1', '0', '0', '0', '0', '0', '0', '1']
['1', '0', '0', '0', '1', '1', '1', '1', '1', '1']
['1', '0', '1', '0', '0', '0', '1', '0', '0', '0']
['1', '0', '1', '1', '1', '0', '0', '0', '1', '0']
从[0,0]走到[9,9]则通过,路径为
sddsdssdddwwwddsssssaaaaassddsddwdds
直接修改源代码,按照路径,输出footprint经过的字符
footprint = '3qzqns4hj6\neeaxc!4a-%\nd735_@4l6g\nf1gd1v7hdm\n1+$-953}81\na^21vbnm3!\n-#*f-e1d8_\n2ty9uipok-\n6r1802f7d1\n9wez1c-f{0'
xx0000 = []
footprintlist = footprint.split('\n')
for i in range(len(footprintlist)):xx0000.append(list(footprintlist[i]))
else:def xxxx000x0(num):xx000000 = format(num, '010b')return xx000000for i in xx0000:print(i)print('----------------------------------------------------')oxooxxxxxoooo = []# xx0000000 = input("Please enter the previous 10 digits again and ending with '\\n': ").split(' ')#511 112 821 949 517 637 897 575 648 738xx0000000 = '511 112 821 949 517 637 897 575 648 738'.split(' ')if len(xx0000000) == 10:try:for i in xx0000000:oxooxxxxxoooo.append(int(i))except:print('err input!')exit(-1)else:print('err input!')exit(-1)for i in range(len(oxooxxxxxoooo)):oxooxxxxxoooo[i] = list(xxxx000x0(oxooxxxxxoooo[i]))else:xx0000x000 = oxooxxxxxoooofor i in xx0000x000:print(i)x, o = (0, 0)xx00x00x0xxx00 = [(x, o)]# xx00x00x0xxx00input = list(input('input maze path:'))xx00x00x0xxx00input = list('sddsdssdddwwwddsssssaaaaassddsddwdds')count = 0while (x, o) != (9, 9):if count < len(xx00x00x0xxx00input):xx0000x0xxx00 = xx00x00x0xxx00input[count]if xx0000x0xxx00 == 'a':if o > 0 and xx0000x000[x][o - 1] == '0':o -= 1count += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)elif xx0000x0xxx00 == 'd':if o < 9 and xx0000x000[x][o + 1] == '0':count += 1o += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:if xx0000x0xxx00 == 'w':if x > 0 and xx0000x000[x - 1][o] == '0':count += 1x -= 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:if xx0000x0xxx00 == 's':if x < 9 and xx0000x000[x + 1][o] == '0':count += 1x += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:print('wrong!')exit(-1)else:print('wrong!')exit(-1)print('right! you maybe got it,flag is flag{the footprint of the maze path}')#sddsdssdddwwwddsssssaaaaassddsddwddsflag=''for i in range(len(xx00x00x0xxx00)):flag+=xx0000[xx00x00x0xxx00[i][0]][xx00x00x0xxx00[i][1]]print('flag{'+flag+'}')
Emoji Connect
用dnSpy反编译dll文件
关键代码
代码有点长(看不懂,直接问gpt~
一段一段问,果然效率比自己看高得多
chatgpt答复:
这段代码是用C#语言编写的,用于在Microsoft Office Excel中创建新的工作表,并将一个48 x 48的数组的值写入到其中。以下是代码中主要的步骤:使用app对象打开Excel并显示该应用程序。
获取当前活动的工作簿并将其赋值给wb对象。
通过调用Sheets属性获取工作簿的第一个工作表,并将其赋值给sheet1对象。
使用双重循环,从数组中取出每个元素并将其写入到工作表中,使用Cells属性和指定的行列来访问单元格,使用SetMember方法将单元格的值设置为数组元素的值。
对范围“A1”到“Y50”应用水平居中对齐。
为工作表的SelectionChange事件添加一个处理程序,该处理程序被称为Select_Unit。
请注意,该代码中还有一些使用Lambda表达式的技巧,以及在静态类中使用的匿名类型。此外,代码还使用了Interop技术,这是一种允许.NET应用程序与COM组件进行交互的方法。
这段代码是在前面的代码中注册的SelectionChange事件的处理程序。当用户选择一个或多个单元格时,将会调用该方法。首先,代码创建一个列表对象,并使用foreach循环将Target参数中的每个单元格添加到列表中。接下来,代码检查所选单元格的数量是否为2,如果是,则使用动态绑定调用一个委托来更改一个名为obj2的对象的值。如果所选单元格的数量不是2,则直接将flag变量赋值给obj2。整段代码复杂度比较高,使用了大量的动态绑定 (dynamic binding) 技术,这是一种在运行时确定调用哪个方法或访问哪个属性的技术。
继续上面的代码,这部分应该是在处理前面的代码中通过动态绑定创建的obj2对象。如果obj2的值为false,则调用Game.<>o__6.<>p__3委托并使用二元逻辑运算 (Logical AND) 将其与list[1].get_Value(Type.Missing)的比较结果进行 AND 操作,然后将结果赋值给obj4。否则,obj4的值等于obj3。整段代码中的目的是跟踪用户选择的单元格是否跨越了两个单元格,如果两个单元格都被选中,则采取一些特殊的操作。由于代码中使用了大量的动态绑定技术,因此可读性不是很好。这也是建议在代码编写过程中尽量避免使用动态绑定的原因之一。
这段代码继续处理前面的代码中通过动态绑定创建的obj4对象。如果obj4的值为false,则调用Game.<>o__6.<>p__6委托并使用二元逻辑运算 (Logical AND) 将其与指定的字符串 “\ud83d\udca5” 进行比较,并将结果赋值给obj6。无论obj4的值是什么,最终的结果都将保存在obj6中。
这段代码继续处理前面的代码中通过动态绑定创建的obj6对象。如果obj6的值为false,则调用Game.<>o__6.<>p__9委托并使用二元逻辑运算 (Logical AND) 将其与指定的字符串 “\ud83d\udca5” 进行比较,并将结果赋值给arg5。无论obj6的值是什么,最终的结果都将保存在arg5中。
这段代码判断用户选择的单元格中是否有两个单元格被同时选中,且这两个单元格中是否都有指定的字符串 “\ud83d\udca5”,如果满足条件,则将这两个单元格中的值交换,并且计算单元格中数字的总和。首先,代码调用先前为true/false操作创建的动态绑定委托,并使用逻辑AND运算符检查arg5的值。如果arg5的值为true,则继续执行后面的操作。然后,代码创建一个表示两个字符Unicode码点的数组,并使用LINQ查询语句将其值设置为list[1].get_Value()中字符的Unicode码点。接下来,代码计算这两个字符所表示的Unicode码点。接下来,代码使用已计算出的Unicode码点,从number数组中减去这两个单元格的行和列的乘积。最后,代码使用交换法将两个单元格中的值互换,并调用check方法重新计算单元格中数字的总和。总的来说,这段代码的主要作用是处理用户在Excel中选择单元格时所做的操作,并将它们转换为对应的计算步骤和结果。
这段代码的主要功能是检查单元格中的数字是否符合要求,并根据结果显示消息框。代码中使用两层循环访问名为sheet1的Excel工作表中的48×48个单元格。然后,代码创建两个动态绑定委托,将单元格的值与指定的字符串 “\ud83d\udca5” 进行比较。如果两个字符相等,则返回。如果所有单元格中都不包含字符串 “\ud83d\udca5”,则显示一个消息框。该消息框将number数组中存储的数字数组转换为ASCII码,并显示在消息框中。总的来说,这段代码的主要作用是检查Excel中的单元格是否符合要求,并在单元格中放置了正确的字符和数字,以帮助用户完成谜题。
这里的 array[0] 和 array[1] 是一个长度为2的整数数组,它存储了一个 Unicode 字符的 UTF-16 编码,以便将其转换为 Unicode 码点。在 UTF-16 编码中,基本多文种平面(BMP)中的每个字符由两个 16 位编码(也称为编码点)表示。第一个编码点使用高位编码(high surrogate),其范围为 0xD800~0xDBFF,第二个编码点使用低位编码(low surrogate),其范围为 0xDC00~0xDFFF。这意味着一个字符的 UTF-16 编码可以表示为两个 16 位编码的组合,这两个编码分别存储在数组中。因此,代码中的 array[0] 存储高位编码,array[1] 存储低位编码。
list[0] 和 list[1] 分别代表 Excel 表格中的两个单元格。 list[0] 表示第一个单元格,list[1] 表示第二个单元格。
总的来说,我的理解是这段代码的作用类似于连连看,一样的数据才能消掉,然后根据消掉的数据进行计算,主要代码
num = (array[0] - 55296) * 1024 + array[1] - 56320 + 65536 - 128512;
this.number[num] -= (list[1].Row - 1) * (list[1].Column - 1);
this.number[num] -= (list[0].Row - 1) * (list[0].Column - 1);
数据太长了,就不放了,可以自己转一下
array=[]
for i in range(48):array.append([0]*48)array[0][0] = "d83dde08";
array[0][1] = "d83dde11";
'''......'''
array[47][46] = "d83dde0f";
array[47][47] = "d83dde25";
number=[25588, 31114, 28727, 26722, 24948, 25135, 25480, 29029, 23025, 25775, 15411, 25423, 25202, 30031, 27380, 30734, 25054, 25109, 20741, 28568, 28802, 24591, 26063, 30940, 30375, 19411, 29573, 20845, 27232, 26743, 25779, 24986, 31498, 30978, 22945, 26563, 35012, 29994, 27016, 29535, 21342, 26573, 27569, 25408, 31567, 25503, 21385, 27207]for i in range(48):for j in range(48):x=int(array[i][j][:4],16)y=int(array[i][j][4:],16)num = (x - 55296) * 1024 + y - 56320 + 65536 - 128512number[num]-=i*jprint(bytes(number))
print(b'flag{'+bytes(number)[6:-6]+b'}')
OldSymbolicCode
第一眼看到这样的东西,以为做不了
直到看到是MS-DOS的应用程序,于是试着用DOSBox运行一下,还真的能运行,果然还是认识的太少了
安装的话,可以看这篇博客
DOSBox安装
如果要debug的话,记得把debug.exe放到asm文件夹里
然后开始debug硬调
常用命令
根据调试,代码主要逻辑为
输入一串字符串
判断长度是否等于36,不等于则Try Again!
主要逻辑为:rc4加密,tea加密可以根据以下指令调试
g 02cb
g 02ce
g fffb
g 0177,输出Hello!Your flag is:
g 01a8,输入flag
g 01f3
g 01fb,rc4加密函数
g 01fe,rc4加密后
g 028c,准备tea加密
g 0294,此处存放密文rc4:密钥
hex:30 6c 64 43 6f 6d 70 75 74 65 72 53 65 63 72 65 74
key:0ldComputerSecrettea:
round:32si=e9de di=a554
mov ax,di
mov cl,04
shl ax,cl 左移四位
mov dx,di
mov cl,05
shr dx,cl 右移五位
xor ax,dx判断是tea算法加密sum=0x9e35
key=[0x4e21,0x7065,0x656e,0x2170]si+=di做运算
sum+=0x9e35
di+=si做运算
先解tea,再rc4解密
#include<stdio.h>
#include<stdlib.h>void encode(unsigned int *a1, unsigned int *a2)
{int x;unsigned __int16 i; // [rsp+8h] [rbp-18h]unsigned __int16 v4; // [rsp+14h] [rbp-Ch]unsigned __int16 v5; // [rsp+18h] [rbp-8h]unsigned __int16 v6;for(x=0;x<=16;x++){v6 = *(a1+x*2);v5 = *(a1+x*2+1);v4 = 0;i=0;do{i++;v6 += (((v5 >> 5) ^ 16 * v5) + v5) ^ (*((v4 & 3) + a2) + v4);v4 += 0x9E35;v5 += (((v6 >> 5) ^ 16 * v6) + v6) ^ (*(((v4 >> 11) & 3) + a2) + v4);}while(i<32);*(a1+x*2) = v6;*(a1+x*2+1) = v5;
// printf("\n0x%X\n",v4);}
} void decode(unsigned int *a1, unsigned int *a2)
{int x;unsigned __int16 i; // [rsp+8h] [rbp-18h]unsigned __int16 v4; // [rsp+14h] [rbp-Ch]unsigned __int16 v5; // [rsp+18h] [rbp-8h]unsigned __int16 v6;for(x=0;x<=16;x++){v6 = *(a1+x*2);v5 = *(a1+x*2+1);v4 = 0xC6A0;i=0;do{i++;v5 -= (((v6 >> 5) ^ 16 * v6) + v6) ^ (*(((v4 >> 11) & 3) + a2) + v4);v4 -= 0x9E35;v6 -= (((v5 >> 5) ^ 16 * v5) + v5) ^ (*((v4 & 3) + a2) + v4);}while(i<32);*(a1+x*2) = v6;*(a1+x*2+1) = v5;
// printf("\n0x%X\n",v4);}
} int main()
{unsigned int v[18]={0xE3D8,0x97AD,0x0DB4,0xA0A5,0x63E3,0x439C,0x9BC9,0x2685,0x2DEA,0xDF95,0xB288,0x6F18,0x80F3,0xD2CA,0xFF0D,0x5B9B,0x8B65,0xEBAF};unsigned int key[4]={0x4e21,0x7065,0x656e,0x2170};int i;decode(v,key);for(i=0;i<18;i++){printf("%.2x",v[i]&0xff);printf("%.2x",(v[i]&0xff00)/0x100);//dee954a5162e2effe4ad030cbd49c0cd6f495c9822e094767e74da6457b4ef4105a23439,最后rc4解密 }printf("\n");for(i=0;i<18;i++){printf("0x%.4X ",v[i]);}printf("\n");encode(v,key);for(i=0;i<18;i++){printf("0x%.4X ",v[i]);}system("pause");return 0;
}