zoukankan      html  css  js  c++  java
  • IDAPython第三讲 搜索功能 与交叉引用功能

    IDAPython第三讲 搜索功能 与交叉引用功能

    一丶搜索函数简介

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

    搜索函数可以是向上搜索 也可以是向下搜索. 搜索失败就会返回-1 也就是BADADDR

    而搜索功能也常常用于去除花指令当中.

    在官网中可以点击此链接进行观看学习:

    IDAPython 升级版查找函数

    IDAPython中 isxxx判断函数

    IDAPtyhon中的引用功能

    flag的取值如下:

    flag取值有:
     
    SEARCH_DOWN 向下搜索
     
    SEARCH_UP 向上搜索
     
    SEARCH_NEXT 获取下一个找到的对象。
     
    SEARCH_CASE 指定大小写敏感度
     
    SEARCH_UNICODE 搜索 Unicode 字符串。
    

    常见的函数如下: (IDA7.5之前版本与IDA7.5改版后的高级支持版本)

    老函数 作用 新函数
    idc.FindBinary 查找二进制找到返回地址没找到返回-1(BADADDR) idc.find_binary(ea, flag, searchstr, radix=16, from_bc695=False)
    idc.FindData 从ea还是返回查找的数据 idc.find_data 或者ida_search.find_data
    idc.FindCode 查找代码找到指定地址的代码 idc.find_code 可以使用 ida_search.find_code 也可以使用
    idc.Jump 跳转到ea位置 ida_kernwin.jumpto(ea)

    例子:

    ea = here()
    value = idc.find_binary(ea,SEARCH_DOWN,'8B 4D 08')  从ea位置向下查找 查找的二进制为8B 4D 08 返回查找到的地址
    
    value1 = idc.find_code(ea,SEARCH_DOWN)  从ea还是查找找到ea下的第一行code代码地址
    value2 = idc.find_data(ea,SEARCH_DOWN)
    

    其中常见的就是上方表示的几个函数

    IDA升级之后其查找函数都变为了 ida_search.find_xxx了. 择优选择去官网学习.

    而后可以使用 is_code is_data is_xxx函数来判断获取的值是否是对的.

    二丶数据校验函数

    数据校验函数就是isxxx 但是它的参数是一个flag所以我们要先使用函数来获取flag 然后在将获取的值传入isxxx 来进行判断.

    老函数 作用 新函数
    idc.GetFlags(ea) 获取标志 ida_bytes.get_full_flags
    idc.isCode(f) 判断是否是代码传入标志 根据标志返回True or False ida_bytes.is_code(f)
    idc.isData(f) 同上 只不过是判断是否是数据 ida_bytes.is_data(f)

    示例如下:

    import idc
    ea = here()
    value1 = idc.find_code(ea,SEARCH_DOWN)
    print(hex(value1))
    
    flag = ida_bytes.get_full_flags(value1)
    print(flag)
    
    print(ida_bytes.is_code(flag))
    

    三丶交叉引用功能

    ​ 在我们实际在IDA的操作中 我们常常会对一个函数按X快捷键来查看谁引用了. 或者对数据看看谁引用了他. 这些在IDAPython中都给我们提供了函数功能. 下面来看看如何操作吧.

    这里只介绍如何对引用做操作. 至于添加引用删除引用 可以观看文档.

    IDAPtyhon中的引用功能

    函数 作用
    CodeRefsTo( long Address, bool Flow ) 获取地址处引用位置 A调用B 对B函数地址使用此函数则找到A调用 返回列表.遍历列表则可以找出所有引用位置. 参数1是ea也就是地址,参数2告诉IDA是否跟踪这些代码.
    CodeRefsFrom( long Address, bool Flow ) 返回address的代码引用了何处的代码. 返回一个列表
    DataRefsTo( long Address ) 返回一个列表告诉address位置的数据被谁引用了
    DataRefsFrom( long Address ) 同上 告诉我们address引用了谁.

    代码如下:

    import idc
    ea = here()
    for i in CodeRefsTo(ea,False):
        print(hex(i))
        
    # DataRefsTo(ea):
    #DataRefsTo(ea)
    
    作者:IBinary


    坚持两字,简单,轻便,但是真正的执行起来确实需要很长很长时间.当你把坚持两字当做你要走的路,那么你总会成功. 想学习,有问题请加群.群号:725864912(收费)群名称: 逆向学习小分队 群里有大量学习资源. 以及定期直播答疑.有一个良好的学习氛围. 涉及到外挂反外挂病毒 司法取证加解密 驱动过保护 VT 等技术,期待你的进入。

    详情请点击链接查看置顶博客 https://www.cnblogs.com/iBinary/p/7572603.html
  • 相关阅读:
    epoll 使用详解
    STL 较详尽总结
    可视化对比排序算法
    统治世界的十大算法
    Vector Demo
    Git远程操作(附重要原理图)
    Wireshark(五):TCP窗口与拥塞处理
    Wireshark(四):网络性能排查之TCP重传与重复ACK
    Wireshark(三):应用Wireshark IO图形工具分析数据流
    Wireshark(二):应用Wireshark观察基本网络协议
  • 原文地址:https://www.cnblogs.com/iBinary/p/14801928.html
Copyright © 2011-2022 走看看