You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:06:29