专栏首页逆向技术基于python3.x IDAPython第二讲 段 函数 汇编指令等操作

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

目录

IDA Python 之 汇编指令丶 段丶 函数

一丶简介

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

二丶汇编中的指令操作

首先如下图所示:

我们现在要分别获取 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 获取mov

idc.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 (小端) 使用函数之后获取则为地址 00402004

get_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)))

三丶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)));

四丶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)

寻找函数结尾,如果函数存在则返回结尾地址,否则返回BADADDR

idc.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))

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • IDAPython入门教程 基于IDA7.5_Python3 第一讲 简介与地址获取

    IDAPython是很强大的功能. 但是在7.5支持python3之后很多函数都改变了. 所以从头开始学一下.

    IBinary
  • IDAPython精彩编程(1)

    IDAPython是运行于交互式反汇编器IDA的插件,用于实现IDA的Python编程接口。IDA在逆向工程领域具有广泛的应用,尤其是二进制文件静态分析...

    Python小屋屋主
  • IDAPython第三讲 搜索功能 与交叉引用功能

    ​ 在IDAPython中如果我们想查询某些 数据 代码 二进制 都可以用都搜索函数.

    IBinary
  • CS-Shellcode分析系列 第一课

    本文是CS的shellcode分析的第一篇文章,该系列文章旨在帮助具有一定二进制基础的朋友看懂cs的shellcode的生成方式,进而可以达到对shellcod...

    WgpSec
  • 计算机相关专业“Python程序设计”教学大纲(参考)

    适用专业:计算机科学与技术、软件工程、网络工程、通信工程、数字媒体技术大数据应用技术及其他工科专业

    Python小屋屋主
  • Mirai新变体Mukashi分析

    CVE-2020-9054 PoC于上个月公开发布后立即被用来感染Zyxel NAS设备。Mirai新变体Mukashi暴力使用不同组合的默认凭据强制登录,将登...

    FB客服
  • go语言调度器源代码情景分析之五:汇编指令

    汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运行原理都具有非常重要的作用,所以建议有兴趣...

    阿波张
  • 【学员笔记分享】0基础学逆向笔记精整理(一)

    进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)...

    Ms08067安全实验室
  • Python3入门学习一.md

    在Linux中安装Python3命令,在官网下载 https://www.python.org/downloads/source/

    WeiyiGeek
  • 从零开始学习PYTHON3讲义(十)自己做一个“电子记事本”

    截至上一讲,我们已经完成了Python语言的基本部分。我们用了三讲来讨论Python语言的控制结构,用了两讲来介绍Python的基本数据类型。可以说仅就语法和语...

    俺踏月色而来
  • 16位汇编第一讲简介

                     汇编第一讲 汇编简介 一.什么是汇编   汇编语言他是计算机语言,计算机语言通俗点说就是人类和计算机(也就是CPU)沟通的...

    IBinary
  • 深入理解计算机系统(3.2)------程序编码以及数据格式

      在进行本章的讲解之前,我们先说明讲解的机器语言型号。上一篇汇编语言和机器语言我们讲过,机器语言是直接面向处理器(Processor:CPU)的程序设计语言,...

    IT可乐
  • [golang]golang 汇编

    在某些场景下,我们需要进行一些特殊优化,因此我们可能需要用到golang汇编,golang汇编源于plan9,此方面的 介绍很多,就不进行展开了。我们WHY和H...

    landv
  • Python基础--Python3基础语

    默认情况下,Python3源码文件以UTF-8编码,所有字符串都是Unicode字符串。当然也可以为源码文件指定不同的编码,例如:

    py3study
  • 你了解 Python 字节码的原理吗?

    如果你曾经写过或者用过 Python,你可能已经习惯了看到 Python 源代码文件;它们的名称以.Py 结尾。你可能还见过另一种类型的文件是 .pyc 结尾的...

    崔庆才
  • 逆向分析神器BinNavi开源了

    得益于IDA pro十分开放的架构,Gergely Erdelyi和Ero Carrera在2004年基于IDA pro发布了IDAPython,逆向工程师能够...

    FB客服
  • 深入理解计算机系统(3.7)------过程(函数的调用原理)

      上篇博客我们讲解了计算机汇编语言是如何实现循环结构的。本篇博客我们将介绍汇编语言中过程的实现方式。   过程在高级语言中也称为函数,方法。一个过程的调用包括...

    IT可乐
  • Python编程入门(一)

    ================================================================================...

    py3study
  • 记一次有趣的挖矿病毒

    本病毒使用了去符号表、敏感信息混淆、int 0x80执行系调函数、sh -c 执行bash脚本获取相关信息等技术来做免杀处理,但是不足的点也很明显:

    贝塔安全实验室

扫码关注云+社区

领取腾讯云代金券