跳转至

会被执行和不会被执行

正常的汇编指令, 运行后不会改变原来的程序的堆栈/寄存器, 起到干扰静态分析的作用 - 利用堆栈操作 - 利用call和jmp指令 主要是通过NOP来改掉无关的代码, 注意修改函数的结束地址, 重定义函数

C
#include <stdio.h>
int main() {
  _asm {
    xor eax,eax;
    jz s;
    add esp , 0x11;
  s;
  }
  printf("%s\n","hello world");
}
// 不会执行, 全部NOP

可以通过修改call所压入的返回地址, 配合retn跳到别的位置

C
int main2() {
  _asm {
    call xxx;
  xxx:
    add[esp], 0x7;
    retn
    _emit 0x12
    _emit 0x34
  }
  printf("%s\n", "hello world");
}

C
int main3() {
  _asm {
    xor eax,eax;
    jz xxx;
    _emit 0x11;
    _emit 0x22;
    _emit 0x33;
    xxx:
  }
  printf("%s\n", "hello world");
}
// 0x33导致指令解析错误