基于python3.x IDAPython第二讲 段 函数 汇编指令等操作

摘要:
目录IDAPython汇编指令、段、函数I、简介II、汇编III中的指令操作、IDA IV中的段操作、IDAPythin汇编指令中的函数操作、段、功能I、简介在IDA中,我们通常看到的是汇编、段、交叉引用。让我们谈谈组装说明和分段操作。上一篇文章的导航[第一个地址操作字节操作][https://www.cnblogs.com/iBinary/p/14642662.html]II。装配中的指令操作
目录
IDA Python 之 汇编指令丶 段丶 函数

一丶简介

​ 在IDA中我们常见的就是汇编. 段. 交叉引用. 这一讲我们就介绍一下汇编指令与段操作.
前面文章导航
[第一讲地址操作字节操作][https://www.cnblogs.com/iBinary/p/14642662.html]

二丶汇编中的指令操作

首先如下图所示:

基于python3.x IDAPython第二讲 段 函数 汇编指令等操作第1张

我们现在要分别获取 movups , xmmword ptr,xmm0 等类似汇编的操作.

那么看一下对应函数分别是那些吧.

指令使用以及作用高版本替代函数
idc.GetDisasm(addr)获取地址处的汇编语句 如: mov ebp,esp无替代
idc.GetDisasmEx(addr,flags)更高级的获取.带有标志. 一般是给一个0 高版本已经被替代idc.generate_disasm_line(addr,flags)
idc.GetOpnd(addr,index)获取指定地址位置的操作数.参数1是地址.参数2是操作数索引.如 mov ebp,esp ebp是操作数1 esp是操作数2 mov则是汇编指令不是操作数idc.print_operand(addr,index)
idc.GetMnem(addr)操作汇编指令 mov ebp,esp 获取movidc.print_insn_mnem(addr)
idaapi.get_imagebase()获取基地址
idc.GetOpType(ea,index)获取操作数的类型idc.get_operand_type(addr,index)
idc.GetOperandValue(addr,index)获取指定索引操作数中的值: 如 calll 0x00402004 对应汇编为: FF 15 04 20 40 00 FF15=Call 而操作数的值则为04 20 40 00 (小端) 使用函数之后获取则为地址 00402004get_operand_value(addr,index)
idc.NextHead获取下一行汇编idc.next_head(ea)
idc.PrevHead获取上一行汇编idc.PrevHead(ea)

实战:

import idc
import idaapi
import idautils

ea = idc.here();
print("当前模块基址为: {}".format(hex(idaapi.get_imagebase())))
print("当前的汇编语句为: {}".format(idc.GetDisasm(ea)))
print("当前的汇编指令为: {}".format(idc.print_insn_mnem(ea)))
print("当前的操作数为: {}".format(idc.print_operand(ea,0)))
print("当前的操作数值为: {}".format(idc.get_operand_value(ea,0)))

基于python3.x IDAPython第二讲 段 函数 汇编指令等操作第2张

三丶IDA中的段操作

对于一个段最直观的介绍就是他的名字 起始地址 结束地址等.

那么介绍一下段操作中的函数吧.

指令作用新函数
idc.SegName(addr)获取段的名字idc.get_segm_name(addr)
idc.SegStart(addr)获取段的开始地址idc.get_segm_start(addr)
idc.SegEnd(addr)获取段的结束地址idc.get_segm_end(addr)
idautil.Segments()返回一个列表记录所有段的地址
idc.FirstSeg()获取第一个段idc.get_first_seg(addr)
idc.NextSeg(addr)获取下一个段 参数是当前段的地址 返回的是下一个段的地址idc.get_next_seg(addr)

上述返回值如果是获取地址的函数 获取不到都会返回 0xFFFFFFF 也就是 BADADDR

利用上述函数则可以遍历一个段输出其内容

脚本如下:

import idc
import idaapi
import idautils

for seg in idautils.Segments():
    segname = idc.get_segm_name(seg)
    segstart = idc.get_segm_start(seg)
    segend   = idc.get_segm_end(seg)
    print("段名 = {} 起始地址= {} 结束地址 = {} ".format(segname,hex(segstart),hex(segend)));
    

基于python3.x IDAPython第二讲 段 函数 汇编指令等操作第3张

四丶IDA中的函数操作

IDA 关于函数也有很多常见功能. 比如可以获取所有函数 函数参数 函数名.函数属性 以及谁调用了函数.

老函数作用新函数
Functions(startaddr,endaddr)获取指定地址之间的所有函数
idc.GetFunctionName(addr)获取指定地址的函数名idc.get_func_name(addr)
idc.GetFunctionCmt获取函数的注释get_func_cmt(ea, repeatable) 1是地址 2是0或1 1是获取重复注释 0是获取常规注释
idc.SetFunctionCmt设置函数注释set_func_cmt(ea, cmt, repeatable)
idc.ChooseFunction(title)弹出框框要求用户进行选择 参数则是信息idc.choose_func(title)
idc.GetFuncOffset(addr)返回: addr 距离函数的偏移形式idc.get_func_off_str(addr)
idc.FindFuncEnd(addr)寻找函数结尾,如果函数存在则返回结尾地址,否则返回BADADDRidc.find_func_end(addr)
idc.SetFunctionEnd(addr,newendaddr)设置函数结尾ida_funcs.set_func_end
ida_funcs.func_setstart(addr,newstartaddr)设置函数开头ida_funcs.set_func_start(addr, newstart)
idc.MakeName(addr, name) 与之同名了还有Ex函数设置地址处的名字idc.set_name(ea, name, SN_CHECK) Ex函数也使用set_name
idc.PrevFunction获取首个函数idc.get_prev_func
idc.NextFunction获取下一个函数idc.get_next_func

下面请看函数使用例子:

脚本:

import idc
import idaapi
import idautils

for seg in idautils.Segments():
    segname = idc.get_segm_name(seg)
    segstart = idc.get_segm_start(seg)
    segend   = idc.get_segm_end(seg)
    print("段名 = {} 起始地址= {} 结束地址 = {} ".format(segname,hex(segstart),hex(segend)));
    if (segname == '.text'):
        for funcaddr in Functions(segstart,segend):
            funname = idc.get_func_name(funcaddr)
            funend =  idc.find_func_end(funcaddr)
            funnext = idc.get_next_func(funcaddr)
            funnextname = idc.get_func_name(funnext)
            print("当前函数名 = {} 当前结束地址 = {} 下一个函数地址 = {} 下一个函数名= {}  ".format(funname,hex(funend),hex(funnext),funnextname))
            

ea = idc.get_screen_ea()
funnextoffset = idc.get_func_off_str(ea)
print("当前选择地址距离当前函数的偏移为: {} ".format(funnextoffset))

基于python3.x IDAPython第二讲 段 函数 汇编指令等操作第4张

免责声明:文章转载自《基于python3.x IDAPython第二讲 段 函数 汇编指令等操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JDBC 基础入门rollup 使用babel7版本的插件rollup-plugin-babel,rollup-plugin-babel使用报错解决办法。下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python学习笔记(20)pymysql模块

一、pymysql模块 pymysql模块是python中连接数据库的一个常用第三方库 2.1 pymysql.connect() 通过该方法连接数据库 import pymysql # 打开数据库连接 db = pymysql.connect(host="XX.XXX.XXX.XXX",user='testuser',passwd:'test123',"...

django程序在windows服务器上发布

django程序在windows服务器上发布 参考文献:https://www.cnblogs.com/djangocn/p/10227006.html 1.安装 IIS 和 GCI 打开服务器管理器,选择添加角色和功能,选择要添加的服务器角色(WEB服务器IIS),然后安装 IIS安装成功之后,然后安装CGI,再次选择添加角色和功能,找到之前安装的...

python中的快速排序

       在工程实际中,经常需要将python代码转化成c++代码,为了获得一样的结果,需要保证算法的一致性。最近在目标检测的算法中,发现python默认排序算法为改进版的快速排序,描述如下: * Quick sort is usually the fastest, but the worst case scenario is O(N^2) so *...

pycharm上传文件目录到Linux

前言:相信不少学Python或者正在编写项目的Python爱好者都在用pycharm,有时候要上传文件目录到Linux服务器,比较麻烦,但是Pycharm已经有这个功能了,详细实现如下 1、打开Pycharm编辑器,选择选项Tools-Deployment-Configuration 2、填写命名,这个可以随便起,选择Type为SFTP 3、填写服务...

scrapyd-deploy 把scrapy项目打包上传部署到scrapyd服务端报错 Deploy failed (500)

Outline 在把scrapy任务部署到scrapyd服务上时,遇到问题一直不成功: 报错如下: (Deploy failed (500):,部署失败) scrapyd-deploy muji_data_python_spider -p muji_data_python_spider Packing version 1617328541 scrapyd...

Python入门教程(2)

人生苦短,我玩蛇0.0!   Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU General Public License)协议。Python语法简洁而清晰,具有丰富和强大的类库。...