1.前言
在逆向破解中,我们有时需要利用IDA脚本来帮助我们分析程序,ida脚本语言可看成是一种查询语言,它能够以编程的方式访问ida数据库的内容,ida使用两种不同的语言来编写脚本,那么我今天要分享的是使用python脚本来获取对内存进行操作的汇编代码。
2.操作部分
2.1接下来我要对名为analyse.exe的程序进行分析,我先运行一下。
2.2接下来,我把该程序拖到ida中。在ida中打开该程序,显示的情况如下:
图1
图2
2.3在图1中,可以看到一个双循环,循环结构中有一个名为c的二维数组,了解背包算法的人应该都能看出,该双循环实现的是背包算法,在图2中,我们同样又看到了一个名为swapc的二维数组。
2.4在OD中打开analyse.exe程序,首先找到main函数,然后往下拖发现了第一个双循环结构也就是图1对应的双循环。
图3
图4
图5
2.5我在双循环结束的下一行汇编代码下断,运行到此处,在图5和图4中我们看到了一个为4c6020的地址,在OD窗口中查看该地址内容及以下内容,可以看出该二维数组始于4c6020,终止于4c63bc。
2.6接下来使用脚本idapython.py找出对二维数组所在的内存区域进行操作的汇编代码并生成code1.txt文件。
2.7接下来分析swapc二维数组,该部分跟上部分差不多,我这里就不讲了。
3.idapython.py代码分析
3.1代码如下,关键语句都加了注释。
[Python] 纯文本查看 复制代码
#-*- coding:utf-8 -*-
import os #os模块用于提供系统级别的操作。
import sys #sys模块用于提供对解释器相关的操作
def getasm(ea_from,ea_to,range1,range2):
fp=open("code1.txt",'w')
opcode=0
for start_a in Heads(ea_from,ea_to): #遍历指令地址
if isCode(GetFlags(start_a)): #判断是否为指令
cmd=GetMnem(start_a) #获取指令名称
if cmd=='mov' or cmd=="lea":
opcode=Dword(NextNotTail(start_a)-4) #获取指令操作内存的内存地址
if opcode <0:
#处理mov eax,[ebp-8]指令时,[ebp-8]需要转换成[ebp+8]
opcode=(~opcode+1)
Message("-->%08x %08x \n"%(start_a,opcode))
if range1<=opcode<=range2:
offset_a=opcode-range1 #偏移量
MakeComm(start_a,"//offset: 0x%04x "%offset_a) #添加注释
fp.write("%08X %s \n"%(start_a,GetDisasm(start_a)))
fp.close()
Message("ok")
ea=ScreenEA()
for seg in Segments(): #遍历所有的段
if SegName(seg)=='.text':
getasm(seg,SegEnd(seg),0x4c6020,0x4c63bc) #把代码段的起始地址和结束地址传入
3.2算法思路:
1.首先遍历所有的段找到代码段并把地址作为参数传入
2.遍历所有对内存进行操作的mov和lea汇编指令
3.找到汇编指令后,计算偏移量
4.最后进行写入操作
|