buzhifou01 发表于 2019-11-22 20:59

用ida脚本定位程序中对内存进行操作的汇编代码

1.前言
   在逆向破解中,我们有时需要利用ida脚本来帮助我们分析程序,ida脚本语言可看成是一种查询语言,它能够以编程的方式访问ida数据库的内容,ida使用两种不同的语言来编写脚本,那么我今天要分享的是使用python脚本来获取对内存进行操作的汇编代码。
2.操作部分
2.1接下来我要对名为analyse.exe的程序进行分析,我先运行一下。



2.2接下来,我把该程序拖到ida中。在ida中打开该程序,显示的情况如下:



2.3在图1中,可以看到一个双循环,循环结构中有一个名为c的二维数组,了解背包算法的人应该都能看出,该双循环实现的是背包算法,在图2中,我们同样又看到了一个名为swapc的二维数组。
2.4在OD中打开analyse.exe程序,首先找到main函数,然后往下拖发现了第一个双循环结构也就是图1对应的双循环。





2.5我在双循环结束的下一行汇编代码下断,运行到此处,在图5和图4中我们看到了一个为4c6020的地址,在OD窗口中查看该地址内容及以下内容,可以看出该二维数组始于4c6020,终止于4c63bc。







2.6接下来使用脚本idapython.py找出对二维数组所在的内存区域进行操作的汇编代码并生成code1.txt文件。




2.7接下来分析swapc二维数组,该部分跟上部分差不多,我这里就不讲了。
3.idapython.py代码分析
3.1代码如下,关键语句都加了注释。

#-*- 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,指令时,需要转换成
                                        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.最后进行写入操作


buzhifou01 发表于 2019-11-27 11:07

柘月十七 发表于 2019-11-25 09:06
请问是用什么编译器写的汇编代码?

上面的汇编代码是用ida工具逆向分析出来

小木曾雪菜 发表于 2019-11-23 01:19

这个不错。可以熟悉一下ida脚本的操作。话说ida 7.0 python只能用2.7吗?

dutyzqly 发表于 2019-11-23 08:05

感谢分享

orcate 发表于 2019-11-23 08:53

谢谢大佬分享

easelong12 发表于 2019-11-23 18:26

谢谢大佬分享

观山海 发表于 2019-11-23 21:24

谢谢大佬分享

我的信仰 发表于 2019-11-23 22:18

点赞,向大佬低头:lol:lol

q74330 发表于 2019-11-23 23:28

熟悉一下ida脚本的操作

2Burhero 发表于 2019-11-23 23:42

哼哼哼行间距

jw188 发表于 2019-11-24 22:29

对于这个,我是一点也看不懂
页: [1] 2
查看完整版本: 用ida脚本定位程序中对内存进行操作的汇编代码