吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12802|回复: 363
上一主题 下一主题
收起左侧

[原创工具] 任意文件转PNG

    [复制链接]
跳转到指定楼层
楼主
tgguan 发表于 2024-5-28 13:44 回帖奖励
本帖最后由 tgguan 于 2024-6-4 09:18 编辑

程序很简单,就是把文件的二进制变成png无损图片。

可以将png放到任意地方,很安全,很方便,还可以免杀。

就是一个简单的想法,抛砖引玉了~

补充一下应用场景:把自己的注册机、破解补丁压个包,然后传到网上就可以跟别人任意分享了,因为转换后是纯图片,不会被任何安全软件查杀。
另外就是,网上可以存图片的地方很多,完全可以白嫖。
比如一刻、以及各种网盘的图片同步功能,这些都限制了图片格式,png完全可以扔进去。


已更新3.0,增加批量和防水印,支持2G大文件。(但是我真的觉得没必要,没意义。软件的目的是白嫖图床进行传播,不是用来加密的。)


↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

https://vvip6.lanzouq.com/iHWTW20r230f

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
源码:https://vvip6.lanzouq.com/i8YEh20r2qdg

修改了几个地方,一个是转换过程中会保留原始文件名和文件类型,将自动还原。
把重复的黑色像素只保留1个,黑色像素代表文件二进制全部是0,我认为填充的都是无用数据,这样还能清理一下源文件的垃圾信息。但是我没找到测试用例,请大家自行测试。








3.0版本带防水印功能的
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

output.png (176.17 KB, 下载次数: 11)

output.png

output.png (167.9 KB, 下载次数: 6)

output.png

output.png (3.25 KB, 下载次数: 124)

output.png

免费评分

参与人数 86吾爱币 +82 热心值 +80 收起 理由
hbwr123 + 1 + 1 我很赞同!
submariner + 1 报告bug,png或jpg等文件处理后哈希变了,文件损坏,望修复
fviewer + 1 + 1 热心回复!
icer233 + 1 我很赞同!
catoo1 + 1 我很赞同!
HanXinchen + 1 + 1 我很赞同!
liuzhihuicz + 1 用心讨论,共获提升!
zzzxcv + 1 + 1 热心回复!
2255 + 1 + 1 用心讨论,共获提升!
zuiqiang1124 + 1 + 1 谢谢@Thanks!
mikezhql + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
alxir + 1 + 1 我很赞同!
鼠年大吉 + 1 + 1 谢谢@Thanks!
ZZZ88888888 + 1 + 1 太牛了!!!!!
WXJYXLWMH + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Zed丶小灰狼 + 1 热心回复!
riverianbow + 1 谢谢@Thanks!
kingtod + 1 + 1 谢谢@Thanks!
huanzhiyiran + 1 + 1 我很赞同!
skyhx + 1 我很赞同!
Fiftyisnt100 + 1 + 1 谢谢@Thanks!
confiant + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
smjn5886 + 1 + 1 说实话,这个不是一般牛,我这个老牌计算机专业的也佩服你,能不能自动叠加.
weixiaoguancai + 1 + 1 我很赞同!
柒點 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
guoruihotel + 1 + 1 谢谢@Thanks!
晓风☆残月 + 1 + 1 谢谢@Thanks!
nojon + 1 + 1 谢谢@Thanks!
竹轩 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lyslxx + 1 + 1 我很赞同!
山人来也 + 1 + 1 谢谢@Thanks!
yxpp + 1 热心回复!
wbzb + 1 + 1 热心回复!
iTMZhang + 1 用心讨论,共获提升!
abaaba2333 + 1 + 1 热心回复!
caixiaocai8 + 1 + 1 我很赞同!
收集是一种爱好 + 1 + 1 谢谢@Thanks!
jsyczxyh + 1 用心讨论,共获提升!
weiwei321 + 1 + 1 我很赞同!
dhwl9899 + 1 + 1 谢谢@Thanks!
Koardor + 1 我很赞同!
ixcw52 + 1 + 1 妳他娘的还真是一个人才!
tocabd + 1 + 1 谢谢@Thanks!
江南如春 + 1 + 1 谢谢@Thanks!
Hegemonism + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lxf0356 + 1 + 1 谢谢@Thanks!
fanhui412 + 1 + 1 我很赞同!
IT_K + 1 + 1 谢谢@Thanks!
lyricsaya + 1 + 1 谢谢@Thanks!
CYF369 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
wang82530 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
a1067709136 + 1 + 1 谢谢@Thanks!
xyftcgr + 1 + 1 我很赞同!
Natu + 1 + 1 谢谢@Thanks!
grrr_zhao + 1 + 1 谢谢@Thanks!
新空气 + 1 + 1 我很赞同!
qq5030789 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
763742228 + 1 + 1 谢谢@Thanks!
孤王 + 1 + 1 谢谢@Thanks!
ming_2794 + 1 谢谢@Thanks!
江米小枣 + 1 + 1 谢谢@Thanks!
wtslh + 1 + 1 谢谢@Thanks!
皮这一下很开心 + 1 谢谢@Thanks!
aatonghua + 1 用心讨论,共获提升!
Freedom_XY_ + 1 + 1 切片,图床
劉某人 + 1 + 1 感谢分享,试用一下
ccc1215325 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
心脏 + 1 + 1 我很赞同!
虚竹1001 + 1 + 1 谢谢@Thanks!
a85401234 + 1 + 1 谢谢@Thanks!
dbsyxq + 1 + 1 谢谢@Thanks!
总有bug想害朕 + 2 + 1 谢谢@Thanks!
cvxxdfxdfdf + 1 + 1 谢谢@Thanks!
shuiangao + 1 热心回复!
oledbadapter + 1 + 1 有点意思
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
PanelJ + 1 + 1 我很赞同!
15235109295 + 1 + 1 谢谢@Thanks!
zcyp0314 + 1 + 1 谢谢@Thanks!
tsyhome + 1 + 1 我很赞同!
dyshjl + 1 + 1 谢谢@Thanks!
yanglinman + 1 谢谢@Thanks!
powehi + 1 + 1 谢谢@Thanks!
HakureiYuyuko + 1 + 1 谢谢@Thanks!
0adsl + 1 + 1 有点意思
wblxok + 1 + 1 不错的创意

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

来自 #
刺心 发表于 2024-5-31 17:13
我来优化一下代码吧。把内存流替换为文件流
[C#] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
using System;
using System.Drawing;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Linq;
 
namespace file2jpg
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        // 按钮1点击事件,选择文件并转换为图片
        private void button1_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog1 = new OpenFileDialog())
            {
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    string inputFilePath = openFileDialog1.FileName;
                    ConvertFileToImage(inputFilePath);
                }
            }
        }
 
        // 将文件转换为图片
        private void ConvertFileToImage(string inputFilePath)
        {
            string outputImagePath = Path.Combine(Path.GetDirectoryName(inputFilePath), "output.png");
            byte[] fileBytes = File.ReadAllBytes(inputFilePath);
            int totalPixels = (fileBytes.Length * 8 + 23) / 24; // 计算所需的总像素数
            int width = (int)Math.Ceiling(Math.Sqrt(totalPixels)); // 计算图片宽度
            int height = (int)Math.Ceiling((double)totalPixels / width); // 计算图片高度
 
            using (Bitmap bitmap = new Bitmap(width, height))
            {
                int byteIndex = 0;
                int bitOffset = 0;
 
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        if (byteIndex >= fileBytes.Length)
                        {
                            bitmap.SetPixel(x, y, Color.Black); // 如果文件读取完毕,设置像素为黑色
                            continue;
                        }
 
                        int r = GetNextByte(fileBytes, ref byteIndex, ref bitOffset);
                        int g = GetNextByte(fileBytes, ref byteIndex, ref bitOffset);
                        int b = GetNextByte(fileBytes, ref byteIndex, ref bitOffset);
 
                        Color color = Color.FromArgb(r, g, b);
                        bitmap.SetPixel(x, y, color); // 设置像素颜色
                    }
                }
 
                bitmap.Save(outputImagePath, System.Drawing.Imaging.ImageFormat.Png); // 保存图片
            }
 
            MessageBox.Show("图片已保存为 " + outputImagePath);
        }
 
        // 获取下一个字节
        private int GetNextByte(byte[] bytes, ref int byteIndex, ref int bitOffset)
        {
            int value = 0;
            for (int i = 0; i < 8; i++)
            {
                if (byteIndex >= bytes.Length)
                    break;
 
                int bit = (bytes[byteIndex] >> (7 - bitOffset)) & 1;
                value = (value << 1) | bit;
 
                bitOffset++;
                if (bitOffset == 8)
                {
                    bitOffset = 0;
                    byteIndex++;
                }
            }
            return value;
        }
 
        // 按钮2点击事件,选择图片并恢复为文件
        private void button2_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog2 = new OpenFileDialog())
            {
                openFileDialog2.Filter = "PNG Image|*.png";
                if (openFileDialog2.ShowDialog() == DialogResult.OK)
                {
                    string pngFilePath = openFileDialog2.FileName;
                    RestoreImageToFile(pngFilePath);
                }
            }
        }
 
        // 从图片恢复文件
        private void RestoreImageToFile(string pngFilePath)
        {
            string outputDirectory = Path.GetDirectoryName(pngFilePath);
            string outputFilePath = Path.Combine(outputDirectory, "restored_file");
 
            using (Bitmap bitmap = new Bitmap(pngFilePath))
            {
                int width = bitmap.Width;
                int height = bitmap.Height;
 
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    for (int y = 0; y < height; y++)
                    {
                        for (int x = 0; x < width; x++)
                        {
                            Color color = bitmap.GetPixel(x, y);
                            memoryStream.WriteByte(color.R);
                            memoryStream.WriteByte(color.G);
                            memoryStream.WriteByte(color.B);
                        }
                    }
 
                    byte[] fileBytes = memoryStream.ToArray();
 
                    int index = Array.IndexOf(fileBytes, (byte)'5');
                    if (index != -1 && index <= fileBytes.Length - 4 && fileBytes[index + 1] == (byte)'2' && fileBytes[index + 2] == (byte)'P' && fileBytes[index + 3] == (byte)'J')
                    {
                        string fileNameWithExtension = System.Text.Encoding.Default.GetString(fileBytes, index, fileBytes.Length - index);
                        string originalFileName = fileNameWithExtension.Substring(0, fileNameWithExtension.Length - 4);
                        string originalExtension = Path.GetExtension(originalFileName);
 
                        originalFileName = originalFileName.Substring(0, originalFileName.Length - originalExtension.Length);
                        string restoredFilePath = Path.Combine(outputDirectory, originalFileName + originalExtension);
 
                        int count = 1;
                        while (File.Exists(restoredFilePath))
                        {
                            restoredFilePath = Path.Combine(outputDirectory, $"{originalFileName} ({count++}){originalExtension}");
                        }
 
                        File.WriteAllBytes(restoredFilePath, fileBytes.Take(index).ToArray());
                        MessageBox.Show("文件已恢复为 " + restoredFilePath);
                    }
                    else
                    {
                        File.WriteAllBytes(outputFilePath, fileBytes);
                        MessageBox.Show("未找到加密文件名,文件已恢复为 " + outputFilePath);
                    }
                }
            }
        }
    }
}

免费评分

参与人数 4吾爱币 +4 热心值 +4 收起 理由
skun92 + 1 + 1 热心回复!
内瑟斯 + 1 + 1 热心回复!
tgguan + 1 + 1 热心回复!
lccccccc + 1 + 1 我很赞同!

查看全部评分

来自 #
kongk856 发表于 2024-6-1 03:02
tgguan 发表于 2024-5-29 18:18
没做内存优化,能支持多大文件,取决于你的空余内存。程序会把整个文件加载到内存里。

主要是下面这个语句的int变量溢出了了,不然理论上应该是支持6G左右的文件加密。
int totalPixels = (fileBytes.Length * 8 + 23) / 24;

int 最大值 2147483647,fileBytes.Length * 8的这两个int值相乘的时候如果大于2147483647,就会变成负值,即文件大于256MB就会溢出。
改成下面这样,理论上就能支持6g左右的文件,如果把totalPixels也改成long类型,还能更大。
int totalPixels = ((long)fileBytes.Length * 8 + 23) / 24;
但是后续代码中用了Bitmap方法限制了width,height只能用int,所以文件大小还是有限制的。不过这嘛大的文件搞起来太慢了,也比较少。大文件还是用普通的伪装快一点。
推荐
 楼主| tgguan 发表于 2024-5-28 13:44 |楼主
本帖最后由 tgguan 于 2024-6-4 09:20 编辑

https://vvip6.lanzouq.com/i8YEh20r2qdg
源码

免费评分

参与人数 3吾爱币 +2 热心值 +3 收起 理由
官方账号 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
jayvzh + 1 谢谢@Thanks!
grrr_zhao + 1 + 1 谢谢@Thanks!

查看全部评分

推荐
 楼主| tgguan 发表于 2024-5-28 13:49 |楼主

存放和分享一些敏感信息,比如破解补丁啥的。
或者本地一些文件备份,比如btc钱包文件,注册机免杀等等。

免费评分

参与人数 1热心值 +1 收起 理由
gdfs59310 + 1 我很赞同!

查看全部评分

推荐
zch11230 发表于 2024-5-28 14:17
挺不错的创意,但为啥加了水印还能还原?
推荐
ThemanRonin 发表于 2024-5-28 14:14
还挺酷

推荐
刺心 发表于 2024-6-6 16:20
劉某人 发表于 2024-6-3 10:18
大锅,可以帮忙打下包么,没用过C#,搞整了一下各种问题解决不了

楼主更新了。你直接用塔最新的即可
推荐
china-ray 发表于 2024-5-28 15:19
如果不记得原来的文件类型,如何知道原有的文件类型哪?
推荐
 楼主| tgguan 发表于 2024-5-30 12:23 |楼主
grazed 发表于 2024-5-30 08:31
很厉害啊,感谢分享,就是有一点想不明白水印是为什么不会影响到完整性

有影响的,只不过影响的概率看情况。
一个像素代表24bits的二进制数据,如果水印为白色,最大的影响就是原来的
000000000000000000000000
变成了
111111111111111111111111
如果源数据介于其中,对其影响就更小了,比如
100111101110111011101101
变成了
111111111111111111111111
这个地方完全可以完成纠错。
但是如果变动的位置比较关键,或者正好差得有点多,就会出现问题。
不过对于一张很大的图,一点点数据影响不大。
5#
gdfs59310 发表于 2024-5-28 13:46
什么应用场景?
6#
42328669425 发表于 2024-5-28 13:50
感谢分享。
7#
nizsm123 发表于 2024-5-28 13:53
问问是图片格式的转为PNG能查看不?
8#
 楼主| tgguan 发表于 2024-5-28 13:59 |楼主
nizsm123 发表于 2024-5-28 13:53
问问是图片格式的转为PNG能查看不?

可以正常查看和引用,直接右键保存就行了,比如我帖子里最后那张图片。些微水印对文件完整度影响不大。
9#
lizooo 发表于 2024-5-28 14:04
功夫?熊猫?厉害,居然加了水印依然能够还原!
10#
mt808a 发表于 2024-5-28 14:12
谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-2-3 14:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表