如何正确模拟恶意软件的滑动窗口数值篡改行为

本文详解如何准确实现 malware 分析题中描述的滑动窗口规则:根据固定偏移 `tl`(左参考位,`x-3`)和 `tr`(右参考位,`x+4`),在**仅基于原始数组值进行判断的前提下**,批量标记并置零满足条件的 `x` 位置。

题目中给出的模式 Tl, -, -, X, -, -, -, Tr 明确指出了各元素的相对位置关系:从 Tl 开始,经过两个占位符(-),到达中心 X,再经过三个占位符后抵达 Tr。我们来数一下索引偏移:

索引:   i-3   i-2   i-1    i    i+1   i+2   i+3   i+4
元素:   Tl    -     -     X     -     -     -     Tr

因此,Tl 位于 X 左侧第 3 位(即 i - 3),Tr 位于 X 右侧第 4 位(即 i + 4)——这正是原代码中 i-2 和 i+3 的根本性错误。

此外,题目强调关键约束:所有判断必须基于原始 entries 数组,且所有应置零的位置需先识别、再统一赋值。这意味着不能边遍历边修改 result 并用它参与后续比较(虽然本例中 result 是副本,但逻辑上仍须确保比较值恒为初始值);而原实现虽用了 entries[i] 比较,却因偏移错误导致逻辑失效。

以下是修正后的完整实现:

def simulate(entries):
    n = len(entries)
    result = entries.copy()  # 创建结果副本,避免修改原数组

    for i in range(n):
      

# 检查 Tl: 位于 i-3,需确保不越界 tl_idx = i - 3 if tl_idx >= 0: if entries[tl_idx] >= entries[i]: result[i] = 0 # 检查 Tr: 位于 i+4,需确保不越界 tr_idx = i + 4 if tr_idx < n: if entries[tr_idx] >= entries[i]: result[i] = 0 return result

验证示例输入:

records = [1, 2, 0, 5, 0, 2, 4, 3, 3, 3]
print(simulate(records))  # 输出: [1, 0, 0, 5, 0, 0, 0, 3, 3, 0]

✅ 与期望输出完全一致。

关键注意事项:

  • 偏移计算务必严格按模式字符位置逐位计数,切勿凭直觉简化;
  • 边界检查(tl_idx >= 0 和 tr_idx
  • 所有比较必须使用 entries[i](原始值),而非 result[i](避免隐式依赖中间状态);
  • 调试建议:在循环内添加 print(f"i={i}, X={entries[i]}, Tl={entries.get(tl_idx, 'N/A')}, Tr={entries.get(tr_idx, 'N/A')}") 快速定位逻辑偏差。

掌握此类偏移建模能力,是逆向分析与安全算法实现的基础功。