IDA–pthon学习–函数变量去混淆

简介

IDA python在2004年被开发出来,其目的是为了将python语言的简洁强大和IDA支持的IDC语言结合起来。

IDA python其实主要用到的如下三个模块:

1
2
3
1. idc:这是兼容idc函数的模块  
2. idautils:大多数处理都是需要依托于这个模块
3. idaapi:允许使用者通过类的形式,访问更多底层的数据

常用函数

1
2
3
4
5
6
7
8
9
10
for func in idautils.Functions():#遍历函数
idaapi.get_func(func_addr)#解析函数
idc.GetMnem(start)#获取指令操作码
idc.print_operand(start, 0)#可以理解为目的操作数
idc.get_operand_value(start, 1)#可以理解为源操作数
idc.get_item_size(start)#获取指令长度
idc.GetFunctionName(func)#获取函数名称
idc.GetDisasm(start)#获取反汇编
idc.SegName()#获取数据段名称
idc.GetOpType(ea,n)#可以判断操作数类型如普通寄存器

实战

尝试编写脚本去除函数局部变量混淆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import idaapi
import idautils
import idc


def findstrings(func_addr):
stackvars = {}
print hex(func_addr), idc.GetFunctionName(func_addr)
func = idaapi.get_func(func_addr)
start = func.startEA
end = func.endEA
while(start < end):
if( (idc.GetMnem(start) == 'mov') and ( 'ebp+var_' in idc.print_operand(start, 0))):
stackvars [str(idc.print_operand(start, 0))] = chr(idc.get_operand_value(start, 1))

start += idc.get_item_size(start)

return stackvars

print ("*********************************")
print ("**********FIND_STRING***********")
print ("*********************************")
li = []
str1 = []
for func in idautils.Functions():
stackvars = findstrings(func)
for key in stackvars.keys():
li.append(key)
li.sort(reverse = True)
for ke in li:
if stackvars[ke].isalnum():
str1.append(stackvars[ke])
else:
str1.append('_')
print ''.join(str1)

总结

IDApython主要就三大模块,实际使用起来和使用反汇编引擎类似,给定地址反汇编,根据需求进行更改或者注释即可