从出题角度浅层实现代码混淆1---花指令
什么是花指令?
花指令(也称为乱序执行指令)是计算机体系结构中的概念,它描述了处理器在执行指令时可能发生的一种现象。
在现代处理器中,为了提高性能,处理器通常采用乱序执行(out-of-order execution)的方式执行指令。这意味着处理器可以以任意顺序执行指令,并且在保持程序语义正确的前提下,尽可能地并行执行多个指令。
然而,由于某些指令之间存在数据依赖关系,即后续指令需要等待前面的指令完成才能执行,因此处理器需要进行指令重排序(instruction reordering)。在指令重排序的过程中,处理器可能会将一些后续指令提前执行,而不必等待前面的指令完成。这样的指令重排序和乱序执行可以提高处理器的效率和吞吐量。
然而,有些指令之间存在控制依赖关系,即后续指令的执行取决于前面的分支(如条件语句)的结果。在这种情况下,处理器可能会进行分支预测(branch prediction)来猜测分支的结果,并且在猜测正确的情况下继续执行后续指令。如果猜测错误,处理器需要将之前已执行的指令丢弃,并重新执行正确的指令路径。
总的来说,花指令就是一堆垃圾代码,虽然会增加cpu运行的负担,但是会误导ida的正常识别,从而达到混淆的目的,一般做题的解决方法就是通过汇编代码读取出junkcode,然后nop掉一些没必要的指令并且在不影响程序正常运行的前提下。
出题实验
实验原来的代码:
1 |
|
实验环境:
一定是x86,64位不支持不支持不支持!!!内联汇编
(之前一直在拿64位的跑一直出问题…….0000)
内联汇编代码
1 | __asm { |
这是一段比较简单常见的内联汇编花指令,使用后的效果如下:
双击到添加花指令的函数时:
看汇编界面就是很经典的jz,jnz无条件跳转:
解决方案:
读一读汇编代码,nop掉没有用的就好了
push ebx
: 将ebx
寄存器的值压入栈中,保存它的值。xor ebx, ebx
: 将ebx
寄存器与自身进行异或操作,实际上是将ebx
寄存器的值设置为0。jnz sub1
: 检查ebx
寄存器的值是否为零(即上一条指令将其设置为零)。如果不为零,则跳转到标记为sub1
的位置继续执行。jz sub2
: 如果ebx
寄存器的值为零,即上一条指令将其设置为零,则跳转到标记为sub2
的位置继续执行。sub1:
: 这是一个标记,用于标识一个代码块的起始位置。在这个例子中,它标识了一个名为sub1
的代码块的开始位置。_emit 0xe8
: 这是一个特殊的指令,用于在内联汇编中生成字节码。在这个例子中,它生成一个字节0xe8
,具体的含义取决于上下文。sub2:
: 这是另一个标记,标识了一个名为sub2
的代码块的开始位置。pop ebx
: 弹出之前保存在栈中的值,恢复ebx
寄存器的原始值。
nop掉这些代码,然后ucp就可以了
可以正常分析了
当然以上只是一个简单的例子,后续的如果还有我出到了其他样式的题目,我也会继续写下面的。
完整代码:
1 |
|