花指令存在是因为ida的每一项都会识别,所以可以实现程序跳过了脏东西,但是ida静态识别的时候就会识别错报错
最典型的jz与jnz实现永真
例:

jz与jnz使得jmp始终被跳过,但ida会识别到jmp,以至于jmp未被执行
而jmp本身是一个“脏东西”,它会导致系统报错(这里他不被执行,但ida认为存在便合理)
解决方法便出现了
将jmp “nop”掉,使得脏东西消失,再变回代码最后函数即可
call系列
首先要熟悉,call xxx指令其实是相当于
push %eip
mov xxx,%eip
所以在函数里,刚进入函数时栈内保存的时eip(原先程序位置)的地址
第一种

此时观察,call loc_414E11这条指令执行前,eip的值是0414E0B,也就是说call后,栈内的值为0414E0B(esp),再看loc_414E11函数,db 36h,这个没意义,后面某个位置的东西+8

动调看到这里面就是eip本来返回的地址C24E10,但是让它+8,就是C24E18 ,观察发现,17后就是1F,所以说xrelease mov dword ptr [ebp-8], 0这条指令,肯定有问题

按’u’转换为无定义,然后知道ret以后会运行到E18,所以之前的就没用了,nop掉,因为它存在会影响ida反汇编的意义

最终结果如上图,从逻辑上来讲如下图顺序,在根据前文分析,很明显从1对用的call开始到后面mov之间都是没用的,但是如果留着retn这个指令,ida会认为前面是一个函数,所以说最好把没用的都nop
nop后去标红方法如下


就解决了
第二种

与前面大差不差,在函数里,对esp+4(前面入栈了ebp所以需要+4)加12,结果是419DB3,,所以前面也是没用的,nop掉

但是函数定义分析错了,所以还是用

选择函数(重置它,就去除完毕了
立即数
_emit
ida_python去花
1 | from idc import * |