部门小伙伴遇到一个样本需要对动态函数调用就行批量注释还原的问题,通过idapython可以大大的减少工作量,其实这一问题也是很多样本分析中最耗时间的一块,下面来看看如何解决这个问题(好吧这才是今年最后一篇技术文章!-_-).

具体情况如下,由于样本注入的代码都是使用的动态函数的获取方式,因此通过ida去看的话都是以下的形式,大大增加了逆向的难度。

为了减轻逆向的难度需要对这些函数进行批量的注释,在写该脚本前想想我们需要解决哪些问题。

  1. 如何获取所有的该类型函数调用?
  2. 如何判断该函数调用为什么api(即该call eax是call writefile还是call readfile了?)

通常通过Loadlibrary和GetproAddress动态获取api的方式都是将这些地址放到单独的一段内存中,每四个字节为一个地址,如下图所示:

此处首先假设我们已经将该表转换成了对应的一个数组,就像这样(转换过程见下文):

首先需要获取所有该类型动态函数的调用,通常的动态函数调用方式如下,通过mov获取对应的函数地址,然后call该寄存器。

因此我们可以通过idapython脚本搜索对应call reg系列指令(当然并不是所有的call reg指令都是动态函数调用,我们的标准是先mov之后再call,同时mov的目的reg和call的reg要一致,此处先将所有的call找出来),如下图所示:其中的FF D0即为call eax指令对应的十六进制码。

现在获取了所有的call reg地址,除了要进行过滤之外还需要知道这个call对应的api到底是啥,理论上通过ida是没法办到的,但是有了上文中的funclist及对应内存表中该函数的地址偏移(此处为278)就可以知道对应的函数名称,(278->632-296(内存中的函数表偏移))/4,获取的值即为对应funclist中对应的索引。

如下图所示,通过这个funclist和偏移即可获取对应call的api是什么,同时判断call的前一条指令mov中的第一个变量是否和call的寄存器一致来进行过滤,通过mov的第二个变量获取需要的偏移(这个地方的多个idc函数不做过多介绍,在前面的文章idapython在样本分析中的使用-字符解密中有详细的分析)。

最后组合起来如下:

此时运行之后每个对应函数都增加了相应的注释,当然这个地方你也可以直接通过重命名函数直接将call reg修改为对应的call api。

最后需要解决的一个问题如何获取上面那张funcnamelist的问题(当然不嫌累的话可以把内存中的地址一个个对应出来),其实上面已经说了idapyhon是无法解决的,但是通过调试器的脚本却可以实现,比如我最钟爱的windbg,通过分析可以知道保存了这些地址的内存,比如下图,在windbg中可以通过ln命令获取对应地址的符号。

通过ln获取对应地址的符号,如下就可以知道这个地址对应了函数LoadLibraryA。

同样通过windbg的python脚本就可以将这批函数对应的api名字生成一个idapython需要的funcnamelist了。

结果如下所示:

最后快元旦了,大伙新年快乐。

转载请注明出处

idapython实现动态函数调用批量注释的更多相关文章

  1. vim的批量注释与删除注释

    vim的批量注释与删除注释 方法一:块选择模式 批量注释: Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的I进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,Vi ...

  2. [转]vim编辑器---批量注释与反注释

    转 在使用vim编写代码的时候,经常需要用到批量注释与反注释一段代码.下面简要介绍其操作. 方法一 块选择模式 插入注释: 用v进入virtual模式 用上下键选中需要注释的行数 按Control+v ...

  3. NERD_commenter——VIM批量注释与反注释插件

    转自:http://www.xefan.com/archives/83568.html 这是对程序员非常实用的一款插件,支持多种语言的补全,还支持单行注释,批量注释,等各种命令映射. 使用方法,先下载 ...

  4. Vim编辑器-批量注释与反注释

    标签:linuxLinuxLINUXvimVIMVim编程 2013-01-10 09:52 27517人阅读 评论(3) 收藏 举报  分类: Linux(18)  版权声明:本文为博主原创文章,未 ...

  5. Vim实现批量注释的方法

    调试代码的时候,免不了要批量注释/取消代码注释,很多IDE都有快捷键将你选中的代码块批量注释/取消注释的功能,那么在Vim里面如何完成这个功能呢? 方法一 块选择模式 批量注释: Ctrl + v 进 ...

  6. 【Linux】Vim编辑器-批量注释与反注释

    [-] vim编辑器---批量注释与反注释 方法一 块选择模式 插入注释 取消注释 方法二 替换命令 批量注释 取消注释 实例演示   vim编辑器---批量注释与反注释 在使用vim编写代码的时候, ...

  7. vim批量注释

    vim批量注释 法一.在vim中 :20,30 s/^/#/g 20-30行 用 # 注释掉.(python是用#注释地---) :20,30 s/^#//g 20-30行 取消注释 法二. 1.多行 ...

  8. vim 批量注释和批量取消注释

    批量注释 按ctrl+v进入可视块模式, 上下移动选中需要注释的行, 按I, 输入注释符号#, 按两下Esc, 保存   批量取消注释 按ctrl+v进入可视块模式, 上下移动选中需要取消注释的行, ...

  9. linux操作命令,批量注释#方法

    用户,密码 1.修改密码:passwd 2.切换用户:  su root 3.增加用户:adduesr+用户 4.root更改目录的权限:chown  leopard:leopard data/ -R ...

随机推荐

  1. 执行mvn 报错 source-1.5 中不支持 diamond运算符

    编译版本出现了问题 <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> < ...

  2. Autoit中用PrintWindow替代ScreenCapture函数实现截图

    想截取躲在后面的窗体或控件,找到了PrintWindow函数,幸运的是Autoit3也对此进行了封装以方便使用. 于是乎,将帮助文件里的_WinAPI_PrintWindow()实例改写了一下,以替代 ...

  3. php 全局变量

    参考链接:http://www.cnblogs.com/borage/p/3645285.html

  4. Codeforces 731C Socks 并查集

    题目:http://codeforces.com/contest/731/problem/C 思路:并查集处理出哪几堆袜子是同一颜色的,对于每堆袜子求出出现最多颜色的次数,用这堆袜子的数目减去该值即为 ...

  5. 修改Centos 6.5的yum源

    1.进入目录 cd /etc/yum.repos.d/ 2.保持副本 mv CentOS-Base.repo CentOS-Base.repo.backup 3.下载新的CentOS-Base.rep ...

  6. PHP获取某月天数

    方式一: <?php function days($year,$month){ if($month<10){ $month = '0'.$month; } if($month == 12) ...

  7. airflow 优化

    1. 页面默认加载数据过多,加载慢. 修改 .../python2.7/site-packages/airflow/www/views.py文件, 1823行, page_size参数, 比如改成18 ...

  8. python3的编码问题

    Python3对文本(str)和二进制数据(bytes)作了更为清晰的区分. 文本默认是以Unicode编码(python2默认是ascii),由str类型表示,二进制数据则由bytes类型表示. s ...

  9. Visual Studio 2015中创建C#的Android项目提示"Value cannot be null"的解决方法

    由于之前本机已安装过Android SDK,在安装Visual Studio 2015时跳过了,并没有为Xamarin指定对应路径导致.Visual Studio顶部菜单:Tools > Opt ...

  10. extern "c"用法解析

    转自: extern "c"用法解析 - 简书 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言, ...