利用QR技术隐写shellcode

admin 2026-03-18 18:40:06 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了一种利用QR码隐写技术分离shellcode的方法,旨在提高免杀与隐蔽性。核心流程包括将shellcode分块封装为数据包,利用ZXing库生成高容错的QR码图片,以及在loader端扫描解码并重组数据。该技术为绕过流量检测提供了新思路,文中附带了编码与解码的C++实现代码及源码地址,具有较高实战参考价值。 综合评分: 83 文章分类: 红队,免杀,安全工具,实战经验


解码

解码逻辑可直接集成到loader的ReadFile流程中,核心是读取指定目录下的QR码文件,解码提取数据包,按顺序重组数据,最终恢复原始shellcode,具体步骤如下:

QR码文件扫描:批量扫描指定输入目录下所有以“Qr*.png”命名的QR码文件,筛选出有效待解码文件。

QR码解码:逐个加载QR码图像,解码后提取出二进制数据包,跳过解码失败的文件。

数据包解析:从解码后的数据包中,提取总块数、块索引、原始文件大小、文件名、数据块等关键信息,验证数据包合法性。

数据块排序:根据提取的块索引,对所有有效数据块进行排序,确保按原始文件的分块顺序重组。

文件重组:将排序后的所有数据块拼接整合,按照原始文件大小和文件名,恢复出原始shellcode文件,完成解码流程。

代码如下:

void&nbsp;Decoder::decodeFiles(const&nbsp;string& inputDir)&nbsp;{&nbsp; &nbsp;&nbsp;// 查找输入目录下所有符合规范的Qr*.png文件&nbsp; &nbsp; vector<string> qrFiles =&nbsp;findQRFiles(inputDir);&nbsp; &nbsp;&nbsp;if&nbsp;(qrFiles.empty()) {&nbsp; &nbsp; &nbsp; &nbsp; cout <<&nbsp;"No QR code files found in "&nbsp;<< inputDir << endl;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return;&nbsp; &nbsp; }
&nbsp; &nbsp;&nbsp;// 存储解码后的所有数据块(键:块索引,值:数据块内容)&nbsp; &nbsp; vector<pair<size_t, vector<uint8_t>>> chunks;&nbsp; &nbsp;&nbsp;size_t&nbsp;totalChunks =&nbsp;0;&nbsp; &nbsp;&nbsp;size_t&nbsp;origSize =&nbsp;0;&nbsp; &nbsp; string fileName;
&nbsp; &nbsp;&nbsp;// 逐个解码QR码文件,提取数据包&nbsp; &nbsp;&nbsp;for&nbsp;(const&nbsp;string& filePath : qrFiles) {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 解码当前QR码,获取二进制数据包&nbsp; &nbsp; &nbsp; &nbsp; vector<uint8_t> packet =&nbsp;decodeQRCode(filePath);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;if&nbsp;(packet.empty()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cout <<&nbsp;"Failed to decode "&nbsp;<< filePath << endl;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;continue;&nbsp; &nbsp; &nbsp; &nbsp; }
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 解析数据包,提取关键信息&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;size_t&nbsp;chunkIndex;&nbsp; &nbsp; &nbsp; &nbsp; vector<uint8_t> payload;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;parsePacket(packet, totalChunks, chunkIndex, origSize, fileName, payload);
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 存储当前数据块及其索引&nbsp; &nbsp; &nbsp; &nbsp; chunks.emplace_back(chunkIndex, payload);&nbsp; &nbsp; &nbsp; &nbsp; cout <<&nbsp;"Decoded chunk "&nbsp;<< chunkIndex <<&nbsp;" from "&nbsp;<< filePath << endl;&nbsp; &nbsp; }
&nbsp; &nbsp;&nbsp;// 按块索引排序,确保重组顺序正确&nbsp; &nbsp;&nbsp;sort(chunks.begin(), chunks.end(), [](const&nbsp;auto& a,&nbsp;const&nbsp;auto& b) {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;a.first < b.first;&nbsp; &nbsp; });
&nbsp; &nbsp;&nbsp;// 重组原始文件并保存&nbsp; &nbsp;&nbsp;if&nbsp;(!chunks.empty()) {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;reassembleFile(chunks, origSize, fileName);&nbsp; &nbsp; &nbsp; &nbsp; cout <<&nbsp;"Decoding completed. Reassembled file: "&nbsp;<< fileName << endl;&nbsp; &nbsp; }&nbsp;else&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; cout <<&nbsp;"No valid chunks decoded."&nbsp;<< endl;&nbsp; &nbsp; }}

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:DeepDark Sec 明天 明天《利用QR技术隐写shellcode》

评论:0   参与:  0