花指令简析_call near ptr-CSDN博客

花指令存在是因为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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from idc import *
from ida_bytes import *

s = 0x1865
z = 0x2B26
pattern = [
0x0F, 0x85, 0x07, 0x00, 0x00, 0x00,
0x0F, 0x84, 0x01, 0x00, 0x00, 0x00,
0xE9,
]

length = len(pattern)
for addr in range(s, z - length + 1):
bytes_here = [get_wide_byte(addr + i) for i in range(length)]
if bytes_here == pattern:
patch_byte(addr + 12, 0x90)