吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11875|回复: 364
上一主题 下一主题
收起左侧

[原创工具] 任意文件转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, 下载次数: 122)

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 不错的创意

查看全部评分

本帖被以下淘专辑推荐:

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

来自 221#
刺心 发表于 2024-5-31 17:13
我来优化一下代码吧。把内存流替换为文件流
[C#] 纯文本查看 复制代码
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 我很赞同!

查看全部评分

来自 237#
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
这个地方完全可以完成纠错。
但是如果变动的位置比较关键,或者正好差得有点多,就会出现问题。
不过对于一张很大的图,一点点数据影响不大。
3#
gdfs59310 发表于 2024-5-28 13:46
什么应用场景?
5#
42328669425 发表于 2024-5-28 13:50
感谢分享。
6#
nizsm123 发表于 2024-5-28 13:53
问问是图片格式的转为PNG能查看不?
7#
 楼主| tgguan 发表于 2024-5-28 13:59 |楼主
nizsm123 发表于 2024-5-28 13:53
问问是图片格式的转为PNG能查看不?

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

本版积分规则

返回列表

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

GMT+8, 2024-11-22 20:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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