部门小伙伴遇到一个样本需要对动态函数调用就行批量注释还原的问题,通过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. 关于C中内存操作

     from:http://blog.csdn.net/shuaishuai80/article/details/6140979 malloc.calloc.realloc的区别 C Language ...

  2. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  3. Java并发之CountDownLatch

    CountDownLatch是Java concurrent包下的一个同步工具.它可以让一个(或多个)线程等待,直到其他线程中的某些操作完成. 本质上是一个信号量,我们把它比作一个有N个插销的大门,它 ...

  4. Java国际化(i18n)

    Java国际化(i18n) 最近在做一个网站国际化的功能.用Java做开发,使用spring+velocity. Java提供了对i18n的支持,spring对其做了集成,可以很方便的配置.主要思想就 ...

  5. 安装sitecore数据库和客户端到本机

    (提前先装好数据库和IIS) 安装教程下载:http://download.csdn.net/detail/qq1162195421/6436799 安装过程省略... 1.安装好之后,会自动在安装路 ...

  6. 转载:gulp文件

    这是我的文件目录结构图  下面是我gulpfile.js的配置 'use strict' var gulp=require('gulp'); var gutil=require('gulp-util' ...

  7. C语言 回文

    #include <stdio.h> #include <string.h> int main() { ]; int i,j; printf("Please inpu ...

  8. 根据对象的某一属性进行排序的js代码(如:name,age)

    var data = [{ name: "jiang", age: 22 }, { name: "AAAAAAAAAAAAAA", age: 21 }, { n ...

  9. 父类div高度适应子类div

    父类div高度适应子类div 通常有许多div的高度由子类的高度决定父类的高度,所以需要父类div要适应子类div的高度,一般情况父类的高度可以直接设置成“auto”即可. 在有的情况下,子类div会 ...

  10. 导入maven工程错误

    有时候导入maven工程会报空指针异常: An internal error occurred during: “Updating Maven Project”. java.lang.NullPoin ...