前言
最近整了一个MRP下载站点直达
但是,对于应用这东西总该有图标吧。。
搞了几张冒泡V5图标,加密(压缩?)了,没找到解码方法临时放弃;
过几天,群成员@无尽时空☆
发了一些图标,是他一个个用软件处理的(在此感谢)。
我突然想到可不可以反编译处理软件,来获取处理逻辑,实际实践可行,于是记录。
相关软件
处理图片的软件是MRP编辑器(由Space大佬于2011年编写的1.7.6.3版本)
用到的编译软件是我前段时间无意中发现的dnSpy ,并且这玩意儿是开源的
dnSpy反编译效果:
感觉真不错的 #(真棒) #(受虐滑稽) 。
重点来了 #(太开心)
-
那….那反编译后的代码这么多,这么找到想要的部分呢?
-
哈,我想到了!这个图片的头部一定是特殊的(别问我为什么。。)
使用MiniHex 查看图片文件,发现前四个字节是固定SKBM
,
于是在dnSpy 中搜索SKBM
,
没结果 #(疑问) 一定是我的搜索方式不对。。 #(受虐滑稽)
更改搜索类型为 数字/字符串 GET!!
代码分析(直接贴注释了):
在63行分配内存,并且填入部分数据,在77行之后又销毁了,因此中间应该对图像进行处理,
而明显69行处理的关键部分,于是转到定义:
观察不难发现,18行创建了一个bitmap
变量,对其进行一系列处理后塞给了pctMrp.Image
基本上可以确定是解密部分了。
编写PHP代码(这玩意儿简单,而且电脑上正好有环境 #(cos滑稽) )
说实话这就是翻译的事儿。。。没什么挑战性。。
<?php /** * 冒泡V5图标解密代码 * * 移植于:2020年3月5日15点35分 * 移植者:祭夜 * * @description: 处理过程源代码来自于反编译后的 MRP编辑器1.7.6.3(由space编写) * * 通过本次编写,我意识到,斯凯处理图片有两种方式: * 1.游戏图标加密(不可直接解密,需要手动调整图片宽度与高度) * 2.冒泡V5图标加密(可直接解密) * */ // 获取冒泡V5图片 $file = file_get_contents('test/icon/9JKK.ico'); // 获取图片高度值 $width = hexdec(bin2hex(substr($file, 4, 1))); //"40" // 获取图片宽度值 $height = hexdec(bin2hex(substr($file, 6, 1))); //"" // 似乎没什么用处,但似乎又有用处??? $newImg = substr($file, 8, strlen($file) - 8); // 处理图片 $ret = WidthChange($newImg, $width, $height, false); // 保存图片到路径 imagebmp($ret, 'test/icon/1.bmp'); function WidthChange($file, $width, $height, $IsSPR) { $num = strlen($file) / 2 / $width; $height = $num; $newImg = imagecreatetruecolor($width, $height); //创建画布 imagesavealpha($newImg, true); //背景透明 $background = imagecolorallocatealpha($newImg, 255, 255, 255, 127); imagefill($newImg, 0, 0, $background); //背景透明 // 处理图片 $num2 = 1; if ($IsSPR) { $num2 = 0; } $num3 = 0; $num4 = $height - 1; $num5 = $num3; for (;;) { $num6 = $num5; $num7 = $num4; if ($num6 > $num7) { break; } $num8 = 0; $num9 = $width - 1; $num10 = $num8; for (;;) { $num11 = $num10; $num7 = $num9; if ($num11 > $num7) { break; } $num12 = ($num5 * $width + $num10) * 2; // $b = Bytes[$num12 + $num2]; $b = hexdec(bin2hex(substr($file, $num12 + $num2, 1))); // $b2 = Bytes[$num12 + 1 - $num2]; $b2 = hexdec(bin2hex(substr($file, $num12 + 1 - $num2, 1))); // 计算RGB $red = $b - $b % 8; $green = $b % 8 * 32 + $b2 / 32 * 4; $blue = $b2 % 32 * 8; // 根据RGBA生成颜色值 $color = imagecolorallocatealpha($newImg, $red, $green, $blue, 0); // 将颜色值填充进画布 imagesetpixel($newImg, $num10, $num5, $color); $num10++; } $num5++; } return $newImg; }
接下来就可以批量处理图片了 #(太开心)
完— #(真棒)