ida插件mynav

on under 二进制
1 minute read

About

原mynav插件详情在这里,github项目在这里,由于原项目的代码无法在IDA 7.0中运行,笔者将mynav.py进行了部分修改,使可运行在IDA 7.0中.修改后的github项目在这里

Usage

在ida完成对一个目标文件的分析后,File|Script File选择mynav.py(或mybrowser.pymyexport.py),然后在Edit|Plugins|MyNav中可看到如下子菜单

其中最重要的功能用法如下:

  • 第1步:plugins|mynav|new session,取一个名字,单击ok后会提示要在所有函数下断点,单击ok,然后ida会自动从暂停状态变成运行状态,在运行的程序中做一些不想记录的操作(或者什么也不做,只是等待2s),然后将运行的程序关闭(不是通过ida关闭)

  • 第2步:plugins|mynav|new session,取另一个名字,单击ok后ida会自动从暂停状态变成运行状态,在运行的程序中做关键的操作(如点击某个想知道背后运行了什么函数的重要的按键),然后将运行的程序关闭(不是通过ida关闭)

  • 第3步:plugins|mynav|trace session,选择2中的session名字,之后和2中的”取另一个名字”之后的操作一样,也即重现2中的操作

  • 第4步:plugins|mynav|show trace session,选择3中的session名字

上面前2步的功能就差不多够用了,有3和4更好.笔者认为上面4个步骤对应mynav实现的原理如下:

  • 第1步中通过在所有函数上下断点,并且设置断点被触发后自动删除,这样在第1步完成后会将所有函数中的非关键操作对应的函数的断点删除,mynav每触发一个函数的断点都会记录这个函数被运行了.

  • 第2步不会在第1步的基础上再设置新的断点,第2步在安全人员进行了关键的操作后会触发这个关键操作对应的函数,mynav会将在第2步中触发的函数记录下来,并将触发的断点删除,第2步完成后即可得到关键操作对应的函数,到这里需要的东西差不多够了,有后面的3和4更好

  • 第3步中mynav会将第2步中的记录的session(每个session记录了运行过的函数,也即触发过的断点)中的函数的断点重新生效,然后安全人员重新做关键操作后ida会再次触发第2步中的相关断点,mynav会再次记录这一步触发的函数,并将触发后的断点删除,这一步可以对运行过的函数流程看地更细

  • 第4步中可以辅助记录不同的关键操作对应的函数,可用于对比不同关键操作对应的函数流程

注意:

  • 第1步操作之前需要确保安全人员没有自行设置断点,如果在使用第1步的功能前已经有断点会导致使用这个功能失败(应该是由于mynav认为如果已经有断点则认为不是在第1步的操作)
  • 有时通过usb远程以attach的方式调试app时ida在加载远程手机中的进程列表时会crash,遇到这种情况需要每次重新attach调试app时将usb重新拔插后再attach
  • 使用mynav的这种在所有函数下断点的方法在目标可执行文件比较大的时候(>500M)不合适,因为在所有函数下断点可能要下很久,500M以上的文件下断点估计要花2个小时以上.如果是调试ios app,遇到这种情况直接用根据UI找函数的方法较合适
  • mynav可能不会在动态链接库的函数中下断点(这一结论暂未验证),如果关键函数(如判断软件使用者是否是vip的函数)是在动态链接库中(如android的so文件,ios的dylib文件,win的dll文件)则不会被mynav追踪到,这种情况查看stack trace即可,stack trace以看到动态链接库中的函数调用
  • ida调试可以以加载或附加的方式调试,如果以加载的方式调试,在第2步新建session后如果剩下的断点(所有的函数中除去第1步中触发过的函数外的剩下的函数)较多,有可能会影响目标程序的正常启动(有时候会这样),如果有影响则可考虑在第1步后第2步前先将剩下的断点全部先disable,等目标程序启动后再将剩下的断点enable,然后再开始第2步的plugin|mynav|new session.或者不使用加载的方式调试,而使用附加的方式调试.

Refer

ida, mynav
home
github
archive
category