C语言实现间隔N字节插入1字节对应的按序移除字节逆功能
问题说明
我是一名安全研究人员,当前在处理文件字节操作相关需求:现有AddByte函数可实现每隔指定数量字节插入1个字节的逻辑(传入inc_every参数为4时即每4字节插入1字节),需要编写对应功能函数,按照字节被添加的顺序移除所有插入的额外字节,实现上述插入操作的逆过程。
参考字节插入实现代码
原插入逻辑的C语言实现如下:
int AddByte(BYTE* bIn, BYTE* bOut, DWORD dwSize, int inc_every) { int increased = 0; for (int i = 0; i < dwSize; i++) { *(bOut + increased) = *(bIn + i); increased++; if (i % inc_every == 0) increased += 1; } return increased; }
逻辑说明:遍历原始输入字节流,每写入1个原始字节后,判断当前原始字节的索引如果是
inc_every的整数倍,就将输出指针后移1位预留插入位,最终返回插入字节后的总长度。
逆向移除函数实现
根据插入逻辑的规律,逆向操作时遍历带插入字节的输入流,逐字节拷贝有效原始字节,每当拷贝完符合插入触发条件位置的原始字节后,跳过紧随其后的1个插入字节即可,实现代码如下:
int RemoveByte(BYTE* bIn, BYTE* bOut, DWORD dwInSize, int inc_every) { int original_len = 0; int src_idx = 0; int copied_count = 0; while (src_idx < dwInSize) { // 拷贝当前位置的有效原始字节 *(bOut + original_len) = *(bIn + src_idx); original_len++; src_idx++; copied_count++; // 匹配插入规则:原字节索引为inc_every整数倍时,后续紧跟1个插入字节,直接跳过 if ((copied_count - 1) % inc_every == 0 && src_idx < dwInSize) { src_idx++; } } return original_len; }
使用注意事项
- 逆向操作时传入的
inc_every参数必须和插入阶段使用的参数完全一致,否则无法正确还原原始字节流 - 函数内置边界判断,即使插入后的数据末尾存在预留插入位,也不会出现内存越界读取问题
- 传入的
bOut缓冲区需要提前分配足够空间,最小可分配长度为插入前原始数据的长度,可通过公式插入字节数 = (原始数据长度 + inc_every - 1) / inc_every提前计算插入的总字节数,反推原始数据长度
内容的提问来源于stack exchange,提问作者Travis
相关产品推荐
相关产品推荐

