部门小伙伴遇到一个样本需要对动态函数调用就行批量注释还原的问题,通过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. AD域控制器通过组策略禁止USB设备

    问题:域环境下如何禁用USB口设备? 第一种:用传统的办法,在Bios中禁用USB. 第二种: 微软技术支持回答:根据您的需求, Windows识别USB设备主要通过两个文件,一个是Usbstor.p ...

  2. socket (一)

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...

  3. mysql 语法

    -create database database_name; show databases;show tables;                                 | -creat ...

  4. 08-linux 其他知识

    linux其他知识点 1-防火墙- iptables原理 2- 本部分属于一步一步学习大数据系列之 Linux 的章节,欢迎订阅更多文章 更多内容请参考:一步一步学习大数据系列介绍

  5. centos 7配置网络 更新yum源

    cd /etc/sysconfig/network-script/ 找到对应的ifcfg-entxxxx文件,然后添加网关,修改dhcp为static,静态ip,添加IPADDR ip地址.onboo ...

  6. 多个.ui共用一个.qrc出错

    在一个已经组建完成的qt项目中,如果再加入新的界面文件,界面文件是无法直接使用原工程的.qrc文件的(执行添加资源操作时不显示资源文件),必须重启一次Qt. 版本: Qt 5.7.0 Qt Creat ...

  7. Merge K Sorted Arrays

    This problem can be solved by using a heap. The time is O(nlog(n)). Given m arrays, the minimum elem ...

  8. DispatcherServlet 和 ContextLoaderListener 的关系,到底用哪个?

    我们先看下这两个东东的配置方法: 对于contextConfigLocation参数,有2个地方可以配置: 1)context-param 是全局性配置 2)servlet下的init-param 是 ...

  9. 序列化多个form表单内容同时提交

    一.首先将表单主体序列化为json对象. 方法: //将表单序列化为json,这里加了个jQuery的扩展方法 $.fn.serializeJson = function () { var resul ...

  10. MAC 常用命令

    杀死占用某个端口的进程 命令 lsof -i tcp:port  port换成端口号可以查看端口是被哪个程序占用   -->    kill -9 pid   杀死进程