逆向分析工具:如何将3D可视化纹理缓冲区保存为文本文件?
如何将OpenGL纹理缓冲区数据保存为文本文件用于外部分析
完全可行,纹理缓冲区databuf_中的数据就是原始输入文件的字节拷贝,只要正确读取缓冲区内容并格式化输出,就能导出可用于外部分析的文本文件。
你之前的问题分析
- 保存
data时,代码fprintf(fp, "%d, %x\n", size,getData());仅输出了数据大小和getData()返回的指针地址,并没有写入实际的字节内容,这是导致你没得到有效数据的原因。 - 尝试保存
databuf_时,直接调用file.write(databuf_)是错误的——databuf_是QOpenGLBuffer对象指针,不是原始数据缓冲区,write方法需要传入实际的字节数据指针。
正确的实现方案
你可以通过映射OpenGL缓冲区内存的方式读取databuf_中的数据,再将其格式化为文本写入文件。以下是修改后的代码示例:
在databuf_->allocate(data, size);之后添加保存逻辑:
// 读取并保存纹理缓冲区数据 databuf_->bind(); // 映射缓冲区为只读模式,获取数据指针 uint8_t* bufferData = static_cast<uint8_t*>(databuf_->map(QOpenGLBuffer::ReadOnly)); if (bufferData) { FILE* fp = fopen("/home/isfet/outputs/texture_buffer_data.txt", "w"); if (fp) { for (int i = 0; i < size; ++i) { // 以两位十六进制格式输出每个字节,空格分隔 fprintf(fp, "%02x ", bufferData[i]); // 每16个字节换行,提升可读性 if ((i + 1) % 16 == 0) { fprintf(fp, "\n"); } } fclose(fp); } // 取消缓冲区映射 databuf_->unmap(); } databuf_->release();
可选格式调整
如果需要十进制格式或逗号分隔的数值(方便导入Excel、Python等工具分析),可以修改输出逻辑:
// 十进制格式示例 fprintf(fp, "%d, ", bufferData[i]); // 或用QTextStream更简洁处理 QFile file("/home/isfet/outputs/texture_buffer_data.txt"); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&file); for (int i = 0; i < size; ++i) { out << bufferData[i] << ","; if ((i + 1) % 16 == 0) out << "\n"; } }
注意事项
- 必须在缓冲区绑定(
bind())后才能映射内存,操作完成后务必调用unmap()和release()释放资源。 - 若处理大文件,直接写入文本可能效率较低,可先保存为二进制文件,再通过脚本批量转换为文本格式。
内容的提问来源于stack exchange,提问作者isf3t
相关产品推荐
相关产品推荐

