😇
牛牛的安全 Odin
  • 个人介绍
  • 数据安全
  • 工控安全
    • 工控概念
  • 车联网安全合规
    • R155
    • CSMS\VTA
    • GDPR认证
  • 车联网安全
    • 漏洞订阅
    • 汽车攻击时间轴
    • 汽车信息安全研究
      • 车厂安全需求 Custom Requirement
      • 安全威胁
      • 参考文章
      • Who’s Behind the Wheel?
      • 安全研究基础
      • 智能网联汽车安全渗透指标
      • 智能网联汽车软件安全测试关键技术研究
      • 基于硬件在环的整车控制器功能安全测试技术研究
      • 智能网联汽车信息安全解决方案
      • 自动驾驶汽车的安全性-识别挑战
    • ECU逆向案例
      • 特斯拉攻击链
      • 汽车动力系统ECU固件逆向工程初探
  • 物联网安全
    • IoT 技术和协议
    • 智能设备常规测试思路总结
    • 各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
    • QEMU 系统仿真
      • 如何“用 QEMU 模拟它”
      • 处理加密的路由器固件
    • 自动分析Automated Approach
    • IOT渗透测试(一)
    • 物联网安全目录
  • 固件分析案例
    • 智能门锁、手环
      • MCU固件反汇编
      • 云丁鹿客门锁中bootloader和FreeRTOS的分析
      • 云丁鹿客门锁BLE通信的分析(下)
      • 云丁鹿客门锁BLE通信的分析(中)
      • 云丁鹿客门锁BLE通信的分析(上)
      • 华为智联旗下小豚AI摄像头的完整分析(下)
      • 华为智联旗下小豚AI摄像头的完整分析(上)
      • 海康萤石智能门锁的网关分析(4)
      • 海康萤石智能门锁的网关分析(3)
      • 海康萤石智能门锁的网关分析(2)
      • 海康萤石智能门锁的网关分析(1)
      • idapython编写和调试
      • 果加智能门锁的全面分析(下)
      • 果加智能门锁的全面分析(中)
      • 果加智能门锁的全面分析(上)
      • BLE智能手环
      • 耶鲁智能门锁的简单测试(下)
      • 耶鲁智能门锁的简单测试(上)
      • 耶鲁门锁漏洞
      • 对一款BLE灯泡的分析
      • BLE协议栈与Android BLE接口简介
    • 在IoT设备中查找端口对应进程的四种方法
    • 路由器命令执行
    • 对基于Philips TriMedia CPU的网络摄像机进行逆向工程
    • 从Microsoft Band以及 Hello Sense 设备中提取自己的历史数据
    • CVE-2021-22909- 深入研究 UBIQUITI 固件更新错误
    • 复现|摄像头固件重打包
    • Dlink_DWR-932B路由器固件分析
    • 针对小米九号平衡车的无接触式攻击
    • 记一次智能印章设备的漏洞挖掘
  • APP 逆向
    • Go二进制文件逆向分析从基础到进阶——综述
    • Switch APP逆向分析
  • 传统静态代码分析
    • 静态分析案例
      • ELF恶意软件的静态分析原理和方法(上)
      • ELF恶意软件的静态分析原理和方法(下)
    • 静态代码分析工具清单
    • 企业级静态代码分析工具清单
  • 应用安全测试
    • DAST、SAST、IAST
    • IAST 工具初探
  • 芯片架构
    • ARM指令集概念
    • ARM指令集
    • 冯·诺伊曼结构
    • 指令集
    • 处理器架构、指令集和汇编语言,三者有何关系?
  • 病毒分析
    • 熊猫烧香
  • 编程知识
    • REST API 教程
  • 流量分析工具
    • 卡巴斯基开源的智能手机流量劫持工具
    • 利用 Burp Suite 劫持 Android App 的流量(二)
    • 利用 Burp Suite 劫持 Android App 的流量(一)
  • 区块链安全
    • 安全多方计算
    • Chainalysis 团队从区块链的角度分析发现 2020 年最大的 4 起勒索软件攻击实现存在关联
  • 攻击案例
    • 特斯拉Powerwall网关可能受到黑客攻击
  • 移动应用
    • Mac上使用Charles抓包
    • 手机抓包工具汇总
    • APP渗透测试流程和技巧大全
    • 加壳和脱壳
    • 浅谈 Android Dex 文件
    • 移动应用漏洞分析样例分享
    • 移动应用常见漏洞分析
    • 移动应用漏洞分析工具介绍
    • 渗透测试流程详解 及 移动APP安全测试要点
    • Frida Android hook
  • 安全设计
    • 【软件安全设计】安全开发生命周期(SDL)
Powered by GitBook
On this page
  • 开发环境
  • idapython脚本编写
  • 小结
  1. 固件分析案例
  2. 智能门锁、手环

idapython编写和调试

Previous海康萤石智能门锁的网关分析(1)Next果加智能门锁的全面分析(下)

Last updated 3 years ago

在本专题第8篇中,我们解析了家庭版果加智能门锁的固件代码,在其中找到了一个语音提示函数,即函数sub_800D40C。选中该函数按快捷键’x’,可以查找该函数的交叉引用,但这里有一个问题是,我们无法查看调用该函数时传递的参数,截图如下:

如果我们可以列出每处调用时传给该函数的参数,那么分析效率就会提升许多。正好我们可以借此机会入门一下idapython,为以后的工作打好基础。

开发环境

如果不是使用记事本直接写代码的大佬,建议还是配置一个合适的开发环境,工欲善其事,必先利其器。Python的开发环境有很多,我们这里选择WingIDE作为其开发环境,其他环境如pycharm也是可以的,但这里不做过多演示。WingIDE的官网是:http://wingware.com,在官网上可以找到3个版本,一个收费版WingIDE pro和两个免费版WingIDE personal和WingIDE 101,理所当然的,WingIDE pro功能要强大一些,但免费版也满足我们的需求。下载完成安装之后,WingIDE会自动查找到python的安装路径,完成python开发的配置工作。

然后我们需要再配置一下,使WingIDE可以调试和开发idapython脚本,参考WingIDE官方的配置方法:http://wingware.com/doc/howtos/idapython。首先,我们将WingIDE安装目录下的wingdbstub.py文件复制到IDA安装目录下python文件夹中。这是因为我们的idapython脚本需要引用wingdbstub库,如果该文件不在对应的目录下,就会引用失败。然后,我们打开WingIDE的远程调试功能,如下图所示:

此后,我们写的idapython脚本只要额外加上两行代码,就可以使用WingIDE作为调试工具了,需要添加的代码如下:

最后,我们wingIDE写一个小脚本,并在脚本中下一个断点,用以验证我们之前的配置工作是否成功,代码截图如下:

上图中,可以在红框之后的代码段下断或者单步调试;测试脚本的含义是查找地址0x800D40C的交叉引用,在下一章中,会详细解释idapython的编写入门。

在IDA中运行该脚本,如下图所示:

可以看到wingIDE中,代码顺利断在了第9行断点处,可以直接查看代码中的变量值,如下图所示:

删除断点,待脚本运行完毕之后,就可以在IDA output窗口观测到脚本输出内容,如下图所示: 图2-6 测试脚本输出内容 到此,我们的开发环境就完成了。

idapython脚本编写

开发idapython脚本,首先需要掌握python脚本的编写,我们这里假设所有读者具备了基本的python脚本开发能力,起码写个hello world没啥问题。此外还需要熟悉idapython独有的各个模块。

idapython的所有模块都在其安装目录下的python文件夹中,如下图所示:

在IDA 6.95之前的版本中,该文件夹中并没有这么多文件,仅有idaapi.py、idc.py和idautils.py,所有的idapython提供的功能全部都由这3个模块实现。而在IDA 7.0之后的版本,IDA将idapython提供的各种函数分门别类的放在了ida_开头的py文件中,虽然也保留了idaapi.py等文件,但看起来只是为了向下兼容而保留的。此外,这些文件的名字,如ida_auto.py,看起来就是对应idc SDK中定义的头文件的名字,如截图中的ida_auto.py对应idc SDK中auto.hpp文件。鉴于此,我们在开发idapython脚本的时候,应该减少使用idaapi.py等文件,因为该文件也许在下个版本中该文件就会消失。

所有idapython提供的模块可以在hex-rays官网上找到说明,地址如下:https://www.hex-rays.com/products/ida/support/idapython_docs/。还可以在idapython的github上找到相关的样例,地址如下:https://github.com/idapython/src。当然,最快的上手方法还是直接拿别人的代码读一读改一改,跑起来就行。下面将图2-2的代码稍作调整:

import ida_xref
import ida_idc

import wingdbstub
wingdbstub.Ensure()

def ListXref(FuncAddr):
    index = 0
    for xref in XrefsTo(FuncAddr,   0):
        FuncArg = find_function_arg(xref.frm)
        FormatStr = '%02d,  0x%08X calls sub_800D40C(0x%02X)' % (index,   xref.frm, FuncArg)
        print(FormatStr)
        index += 1

def find_function_arg(addr):
    for i in range(20):
        addr = PrevHead(addr)
        if GetMnem(addr) ==   "MOVS" and "R0" in GetOpnd(addr, 0):
            FuncArg = GetOpnd(addr,   1)
            return   int(FuncArg[1:],16)
    return ""


if __name__=='__main__':
    print('List the Xref to   sub_800D40C')
    ListXref(0x800D40C)
    print('List end')

代码3-1 用于显示函数调用参数的idapython代码

在上图中的代码中,函数find_function_arg就是我们直接参考其他人的代码修改而来;PrevHead、GetMnem、GetOpnd、XrefsTo等都是idapython提供的函数或变量,相信大家看了这段程序就能理解这几个关键字的定义,分别是获取上一个指令或数据的地址、获取该地址的指令、获取该地址的操作对象、查找交叉引用的意思,详细解析可以去官网查询或者直接查看idapython库中的注释内容。这段idapython代码的最终运行效果如下图所示:

可以从上图中看到,所有调用sub_800D40C函数的地址和调用参数已经展示出来,满足了我们的需求。

小结

本篇主要介绍了idapython的基本功能。在本专题的后续文章中,我们将在很多地方使用idapython帮助我们分析,所以正好借此机会对idapython做个简要的介绍。

图1-1 函数sub_800D40C的交叉引用
图2-1 开启WingIDE远程调试
图2-2 idapython脚本中启用WingIDE调试
图2-3 测试脚本用于验证配置是否成功
图2-4 IDA加载测试脚本
图2-5 wingIDE调试idapython脚本
图3-1 idapython提供的各个模块
图3-2 代码运行效果