-
-
[原创]十六进制修改文件字节,伪装损坏进而达到加密 目的。
-
发表于: 16小时前 127
-
一、密码学,路走歪了
我花了大量时间学习密码学知识。AES、RSA、椭圆曲线,对称加密、非对称加密、数字签名、密钥交换……一路学下来,我发现了一个致命的问题。
他们的应用范围太窄了,而且想法从根本上就是错的。
错在哪里?
他们所有的精力,都花在“算法”上。把一个文件当成一个整体,用一个复杂的数学函数去搅乱它,让它变成另一串谁也看不懂的0和1。靠的是算法复杂度,赌的是别人的算力不够。
但他们从来没想过一个问题:我们为什么不对文件本身动手?
文件是什么?文件在计算机眼里,就是一堆0和1。图片是0和1,视频是0和1,文档也是0和1。这是文件的本质。不管你在上层给它起什么名字、用什么图标,在硬盘里,在内存里,它就是一串长长的二进制序列。
既然文件本身就是0和1,为什么不直接在0和1这一层动手脚?
我不想搅乱整体。我只想在这串0和1里,挑几个位置,动点小手术。
二、每个文件都有“骨头”
用十六进制编辑器打开任何一个文件,你会发现,它不是完全随机的一串数字。它有骨架,有规律。
最明显的规律,在文件最开头。这个开头,叫文件头,也叫魔数。每一种类型的文件,都有自己固定的魔数:
文件类型
后缀
十六进制文件头
JPEG图片
.jpg
FF D8 FF E0
PNG图片
.png
89 50 4E 47
MP3音频
.mp3
FF FB 或 ID3
MP4视频
.mp4
00 00 00 18 66 74 79 70
WAV音频
.wav
52 49 46 46
ZIP压缩包
.zip
50 4B 03 04
TXT文本
.txt
没有固定魔数,直接存字符编码
这不是偶然,这是所有文件的身份证。操作系统靠它识别类型,播放器靠它解码。把它改了,文件就“不认识自己了”。
三、关键发现:改不同位置,效果完全不同
这是我的探索过程中最核心的发现。不是随便改一个地方都会导致文件“坏掉”。改哪里,决定了它“坏”成什么样。
3.1 视频文件和音频文件
音视频文件的结构是分段的:
[文件头] [数据流] [索引/尾部]
修改文件头:播放器直接报“无法打开”,一丁点内容都看不到。伪装效果最好。
修改中间部位:文件能打开,也能从头开始播,但播到被改的地方,画面花屏、声音卡顿。撑过这一段,后面又恢复正常。看起来就像一个“偶然损坏的文件”。
修改尾部:最隐蔽。播放器读到数据流结束就停了,根本不管尾部还有什么。只改尾部,文件照样完整播放,完全看不出任何问题。这个位置,几乎没人在乎。
修改索引区(仅视频):视频能打开,但进度条拖不动,一拖就崩。或者画面黑屏、只有声音。这是最像“真坏了”的状态,但所有数据其实都在。
3.2 文本文件
文本文件的规律和音视频完全不同。
TXT没有固定的文件头,直接存的就是字符编码。你改掉其中几个字节,对应的位置就是几个乱码,比如“我今天很开心”变成“我今□很开□”。
但关键是:乱码之外的内容,完全可读。
一个被改了十处的TXT文件,依然能看出大概意思,只是可读性变差。这和音视频的“花屏就看不到画面”完全不同。文本的抗损坏能力,天生就比音视频强。
四、从伪装到加密:异或和种子随机
光伪装还不够。如果我想让别人即使猜到这是伪装的,也恢复不了原文件,怎么办?
这就引入了两个技术:异或运算和种子随机。
4.1 异或:最简单的“锁”
异或,逻辑极其简单:相同为0,不同为1。
你有一串原始数据 1010,设定一个密钥 1100。把它们逐位异或,得到一串谁也看不懂的乱码。接收方拿到乱码,再和同一个密钥 1100 逐位异或,乱码就瞬间变回了 1010。
加密和解密,是完全对称的同一个操作。 运算量几乎为零。不需要RSA那种大数分解,不需要CPU算得发烫。就是简简单单的“异或”一下,一瞬间的事。
4.2 种子随机:让“坏的地方”满天星一样散开
光用异或还有个问题。如果每次都异或同一个固定的数,别人猜到这个数,整个文件就被解开了。
怎么让它更难猜?用种子随机。
设定一个“种子”,比如 12345。然后用一个伪随机数生成器,根据这个种子,生成一串长长的、看起来完全随机的序列。
加密的时候,不用一个固定的数去异或,而是用这串随机序列,依次和文件的每个字节去异或。文件头用第1个随机数,第2个字节用第2个随机数……以此类推。
这样,文件中被修改的位置,不是整齐的一整块,而是像满天星一样,随机地散落在文件的各个角落。 而且每一次修改的值都不同,毫无规律可循。
但只要知道那个种子 12345,就能重新生成一模一样的那串随机序列。再用这个序列去和密文异或一遍,文件就毫发无损地回来了。
4.3 这意味着什么?
这意味着,我拥有了一套加密系统。 它不依赖数学难题,不依赖密钥长度,不依赖任何复杂的算法。它的核心,就是我最初那个天真的想法:把文件弄坏,再把它修好。
异或,就是“弄坏”和“修好”的动作。
种子随机,就是“坏在哪里”和“坏成什么样”的图纸。
而这两样东西,一个小学文化的人,用十六进制编辑器和几行简单的脚本,就能完全掌握。解密过程的计算量,忽略不计。
五、实际操作:用手机MT管理器完成一切
以上说的所有操作,都不是纸上谈兵。我已经在手机上,用最普通的工具,全部实操完成。
工具就是 MT管理器。一个在安卓手机上就能用的文件管理App,自带十六进制编辑器。
操作步骤极其简单:
打开MT管理器,找到你要处理的文件。
选择“十六进制编辑”模式。
屏幕上直接显示出一排一排的十六进制数字。文件头、数据区、尾部,一目了然。
找到文件头的魔数,手动改掉几个字节。保存。
找到文件中间或尾部的某几个字节,随手改掉。保存。
把文件发给另一台设备。
另一台设备收到后,用同样的MT管理器,把改过的字节原样改回去,或者用约定的种子重新生成随机序列异或回去。保存。
文件恢复,正常打开。
全程在手机上完成。不需要电脑,不需要装任何编程环境,不需要懂命令行。一个文件管理器,一个十六进制编辑器,一双手,就足够了。
有兴趣的,可以自己去下载一个MT管理器,亲手试试。拿一张不重要的图片,或者一段随手录的视频,照着上面的步骤操作一遍。你会在五分钟之内,亲眼看到一个文件在你手里“坏掉”,又在另一台手机上“复活”。
这种感觉,比看任何密码学论文都来得直接。
六、全自动化脚本与真随机规则
以上操作,手动在MT管理器里改几个字节,是最基础的玩法。但你完全可以把它全自动化。
6.1 一个可运行在任何设备上的脚本
下面这段脚本,不依赖任何第三方库,可以在任何安装了浏览器的设备上运行。你用手机、平板、电脑,打开浏览器,复制进去,就能用。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>文件伪装加密器</title>
</head>
<body>
文件伪装加密器
选择文件,输入种子,点击"加密"。再点一次"解密"即可恢复。
<input type="file" id="fileInput"> <label>种子:</label> <input type="number" id="seed" value="12345"> <button onclick="processFile()">加密 / 解密</button> <script> function processFile() { const file = document.getElementById('fileInput').files[0]; const seed = parseInt(document.getElementById('seed').value); if (!file) return alert('请先选择文件');const reader = new FileReader();
reader.onload = function(e) {
const bytes = new Uint8Array(e.target.result);
// 伪随机数生成器(Mulberry32)
function mulberry32(a) {
return function() {
a |= 0; a = a + 0x6D2B79F5 | 0;
let t = Math.imul(a ^ a >>> 15, 1 | a);
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
return ((t ^ t >>> 14) >>> 0) / 4294967296;
};
}
const rng = mulberry32(seed);
// 生成和文件一样长的随机序列并异或
const result = new Uint8Array(bytes.length);
for (let i = 0; i < bytes.length; i++) {
const randByte = Math.floor(rng() * 256);
result[i] = bytes[i] ^ randByte;
}
// 触发下载
const blob = new Blob([result], {type: 'application/octet-stream'});
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = file.name + '.locked';
a.click();
URL.revokeObjectURL(url);
};
reader.readAsArrayBuffer(file);
}
</script>
</body>
</html>
6.2 1000条规则,10000条规则,真随机
上面这个脚本,用的是伪随机——种子一样,生成的序列就一样。这是为了可以解密。
但如果你不想解密呢?如果你只想把文件永久变成谁也恢复不了的乱码,那你根本不需要种子,直接上真随机。
你可以写一个脚本,内置1000条规则,甚至10000条规则。每一条规则,对应一个不同的修改位置和修改值。规则之间可以叠加、可以交叉、可以随机组合。
比如:
规则1:文件头第1-4字节,异或 0x7B
规则2:文件中间第1024字节,替换为 0x00
规则3:文件尾部最后8个字节,全部清零
规则4:每隔256个字节,异或一个随机数
规则5:仅在视频文件的索引区,随机打乱其中的某几个字节
……以此类推,写到10000条。
加密的时候,随机从这10000条规则里抽取几百条,组合执行。每一层都修改一点点,叠加在一起,文件就变成了一个彻彻底底的“破烂”。但只要你记录下这次抽取了哪些规则,解密的时候反向操作,就能恢复。
真随机,意味着连你自己都不知道这次用的是什么规则。 一旦你把记录弄丢了,这个文件就永远恢复不了。这是比任何算法都彻底的“不可破解”——因为连加密者自己都不知道怎么解。
七、其他细节说明
本文只探讨到文件伪装与加密的核心思想和基本实操。还有一些相关的技术细节,本文不展开讨论。
譬如,对文件的某些特定位置进行修改,有可能造成不可逆的损毁。这种情况需要用专业的恢复软件来处理。
哪些修改是可逆的,哪些是不可逆的?这需要大量的实验。
我本人已经用专业恢复软件做过一些测试,但远未穷尽所有文件类型和所有修改位置。如果你是做数据恢复相关工作的,或者对此有深入研究,可以联系我,告诉我具体的文件类型、修改位置和恢复结果。我们一起把这个方案的可逆性边界彻底摸清楚。十分感谢。
八、写在最后
我在这个折腾文件的过程中,突然想明白了一件事。这件事可能是那些搞了十几年密码学的专家,从来没有认真想过的。
现代密码学,路走歪了。
现在的加密,全是靠算法复杂度。AES、RSA、椭圆曲线——无一例外,都是用数学上的“难解问题”来保证安全。但这有个致命的软肋:算法是公开的,密钥是固定的,暴力破解只是算力和时间的问题。
我用的办法,没有任何复杂算法。我只是进到了文件的内部,动了它的骨头。
把一个MP4的文件头改成MP3,它就“变”成了一个打不开的音频文件。把索引目录抹掉几段,视频还能播,但进度条废了。把中间的几帧关键数据异或一下,播到那里就花屏,谁看了都觉得是文件坏了。
一个文件坏了,没人会怀疑它是加密的。
你看到一堆乱码,你会想到“这是密文,得破解”。但如果你看到一个损坏的视频,你只会骂一句“这文件真垃圾”,然后删掉,或者找工具去修复。你不会想到,这个“损坏”是故意制造出来保护数据的。你甚至根本不会往“加密”两个字上想。
这才是最高级的伪装——让加密的行为,看起来根本不像加密。
现代密码学花了多少年,去研究怎么让密文看起来更随机、更无规律?而我这条路,直接让密文披上了“损坏文件”的外衣。它混在几万个真正的损坏文件里,你找都找不出来。
而且,解密过程的计算量,可以忽略不计。
AES、RSA,解密的时候要算得CPU发烫。我这种“加密”,解密的时候只需要把改过的字节原样改回去。如果只改了文件尾部,甚至什么都不用干,文件本来就是能正常播放的。解密计算量为零。
你们还在堆砌盔甲,我直接让城堡隐形了。
你们还在造更坚固的锁,我直接让所有人都以为这扇门从来就没锁过。
最安全的锁,不是那把最难撬开的锁。而是那把放在门上、但所有人都以为它已经坏掉的锁。没人会去撬一把坏锁。
而这把坏锁,从“锁上”到“打开”,耗费的计算量,几乎为零。
九、免责声明
本文仅作技术探讨。
文中所描述的文件伪装、加密、修改、恢复等方法,仅供学习和研究文件格式、数据恢复、密码学原理之用。
请勿将文中技术用于任何非法行为。任何未经授权修改他人文件、绕过安全审查、传输非法内容的行为,均与本作者无关。
技术无罪,善恶在人。
[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。