参考文章:
汉信码识读技术研究
2020网鼎AreUSerialz、虚幻2 | BTIS’s blog
图片很小,没有隐藏信息,PS打开:
每个像素点的RGB的三个通道都是255/0:
红R色通道:
绿G通道:
蓝B通道:
像二维码,但拼接之后啥都没有。处理思路:
-
分通道按行拼接,读的时候是 B-G-R,拼接的时候是 R-G-B,图像且大小为36*36
-
注意看G通道,上下沿的两边都是长黑线,一般是二维码的边沿
-
而我们还观察到到一般二维码的四角都会有空白的一行,但最两边是黑色:
-
观察到R通道对应像素行是白色的:
-
而B通道符合二维码的特征,所以把它放在G后面
-
结合经验,那么就可以发现R-G-B 可以拼出二维码
import cv2 import numpy as np from PIL import Image img=cv2.imread('file.png') image1=np.hstack((img[:,:,2],img[:,:,1],img[:,:,0])).reshape(36,36) #RGB Image.fromarray(image1).save('res.png')-
cv2.imread读文件,读出来是个三维数组(numpy.ndarray) :3(B:G:R)*36(列数)*12(行数)
-
img[:,:,0] 抽出B通道:(B)*36(列数)*12(行数)
-
np.hstack 依次读取每个通道数组的行,连在一起:(36+36+36)*12
-
reshape(36,36) 分割最低位维,分割后的数组规格为:36*36
- 分割过程大致就是砍断长的一维向量,把截出来的向量直接紧挨着放到下面(不理解的话可以自己尝试或者上网查询)
-
Image.fromarray 实现ndarray到image的转换
-
-
这时候我们确认这是个汉信码,但是发现校正折线位置不对,正常的:
-
加上图像反转
import cv2 import numpy as np from PIL import Image img=cv2.imread('file.png') image1=np.hstack((img[:,:,2],img[:,:,1],img[:,:,0])).reshape(36,36) #RGB image1=np.flipud(image1) Image.fromarray(image1).save('res.png') -
左下定位码也反了,将左下定位码反转180度
import cv2 import numpy as np from PIL import Image img=cv2.imread('file.png') image1=np.hstack((img[:,:,2],img[:,:,1],img[:,:,0])).reshape(36,36) image1=np.flipud(image1) image1[24:33,3:10]=np.rot90(image1[24:33,3:10],2) Image.fromarray(image1).save('res.png')- rot90(array,2)将数组旋转180度
- rot90(array,2)将数组旋转180度
-
放进http://www.efittech.com/hxdec.html或用中国编码APP都读不出来,题目中提示暴力修补,而汉信码设计是有纠错能力的,一般使用要选择L2及以上的纠错等级:
-
L2的纠错容量可达到15%,足够用了我们随便在那块空白的地方划两下哈哈:
- 也可以专业一点:补全辅助矫正位,并另填一个像素点辅助汉信码识别系统识别辅助矫正位:
image1[17,33],image1[15,31]=0,0
- 都可以扫得到flag
flag{eed70c7d-e530-49ba-ad45-80fdb7872e0a}


![[网鼎杯 2020 青龙组]虚幻2 详解 (python脚本) [网鼎杯 2020 青龙组]虚幻2 详解 (python脚本)](http://www.mshxw.com/aiimages/31/901708.png)
