编程语言: Nodejs
知识要点: 文件的16进制解析
木马我们见得多, 以前多数会以EXE可执行文件形式出现
后来, 开始在Web上出现, 主要侵扰Web页面, 给正常的html/ASP等加上木马代码
再后来, 开始直接在图片内部出现, 让人防不胜防
比如下面2张图(文件名:demo.jpg)
这是张正常的图片:demo.jpg
这是张含非法代码(无害)的图片:demo-2.jpg
相信从表面上没人看得出来区别是什么
透过表面, 我们来看看这2张图的本质
借助Notepad先打开正常的图片(demo.jpg)
我们看到的是一堆乱码,
选择菜单"插件 -> HEX-Editor -> View in HEX"(无此插件的可以先搜索安装)
首先我们要先知道, 所有的文件头几个节字可以区分出文件格式
像JPG文件的文件头2个字节是16进制 FFD8
利用这点,可以判定它确实是JPG文件,这个比用文件扩展名判断靠谱得多
然后再来看看文件尾
查资料可以得知, JPG文件尾的2个字节应该是FFD9或者是FFD8
看得出来这个demo.jpg文件是正常的;
再来用同样的方法看看demo-2.jpg的文件尾(文件头已查证是正常)
明显的, 在最后FFD9后面多出了一些"不寻常"的东西, 右侧可以看到疑似脚本的东西
本文我们讨论的是如何识别被伪装的图片, 至于图片中如何植入木马及如何让它发作不在讨论范围
问题和现象讲清楚了
然后我们来说说在代码级别怎么防范
先上效果
分别扫描2个文件, 得到上图结果
怎么实现呢, 我们用Nodejs来举例
const fs = require('fs')
let fpath = 'd:/demo.jpg';
let packSize = 2; //定义数据包大小(2字节)
let buf = new Buffer.alloc(packSize); //对象用于表示固定长度的字节序列
let fd = fs.openSync(fpath, 'r');
fs.readSync(fd, buf, 0, buf.length, null);
console.log(fpath, ">>>>>head:", buf.toString('hex')); //16进制方式打印
这样就可以提取出图片文件的文件头
d:/demo.jpg >>>>>head: ffd8
接下来取文件尾2字节
let fileInfo = fs.statSync(fpath); //取得文件信息
let fileSize = fileInfo.size; //文件长度
buf = new Buffer.alloc(packSize); //定义缓冲区
fs.readSync(fd, buf, 0, buf.length, (fileSize - fel)); //取出文件尾2字节
console.log(fpath, ">>>>>end:", buf.toString('hex')); //16进制方式打印
结果:
d:/demo.jpg >>>>>end: ffd9
接下来只要收集各种不同文件需要校验的文件头和文件尾标志
加上自己做个校验算法就可以达到扫描文件安全的目的
算起来可以当成一个最简版的查毒(木马)工具呢
收工
这期就酱,下期再见
复杂的问题简单化
每次只关注一个知识点
对技术有兴趣的小伙伴可以关注我, 我经常分享各种奇奇怪怪的技术知识