idapython实现动态函数调用批量注释
部门小伙伴遇到一个样本需要对动态函数调用就行批量注释还原的问题,通过idapython可以大大的减少工作量,其实这一问题也是很多样本分析中最耗时间的一块,下面来看看如何解决这个问题(好吧这才是今年最后一篇技术文章!-_-).
具体情况如下,由于样本注入的代码都是使用的动态函数的获取方式,因此通过ida去看的话都是以下的形式,大大增加了逆向的难度。
为了减轻逆向的难度需要对这些函数进行批量的注释,在写该脚本前想想我们需要解决哪些问题。
- 如何获取所有的该类型函数调用?
- 如何判断该函数调用为什么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实现动态函数调用批量注释的更多相关文章
- vim的批量注释与删除注释
vim的批量注释与删除注释 方法一:块选择模式 批量注释: Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的I进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,Vi ...
- [转]vim编辑器---批量注释与反注释
转 在使用vim编写代码的时候,经常需要用到批量注释与反注释一段代码.下面简要介绍其操作. 方法一 块选择模式 插入注释: 用v进入virtual模式 用上下键选中需要注释的行数 按Control+v ...
- NERD_commenter——VIM批量注释与反注释插件
转自:http://www.xefan.com/archives/83568.html 这是对程序员非常实用的一款插件,支持多种语言的补全,还支持单行注释,批量注释,等各种命令映射. 使用方法,先下载 ...
- Vim编辑器-批量注释与反注释
标签:linuxLinuxLINUXvimVIMVim编程 2013-01-10 09:52 27517人阅读 评论(3) 收藏 举报 分类: Linux(18) 版权声明:本文为博主原创文章,未 ...
- Vim实现批量注释的方法
调试代码的时候,免不了要批量注释/取消代码注释,很多IDE都有快捷键将你选中的代码块批量注释/取消注释的功能,那么在Vim里面如何完成这个功能呢? 方法一 块选择模式 批量注释: Ctrl + v 进 ...
- 【Linux】Vim编辑器-批量注释与反注释
[-] vim编辑器---批量注释与反注释 方法一 块选择模式 插入注释 取消注释 方法二 替换命令 批量注释 取消注释 实例演示 vim编辑器---批量注释与反注释 在使用vim编写代码的时候, ...
- vim批量注释
vim批量注释 法一.在vim中 :20,30 s/^/#/g 20-30行 用 # 注释掉.(python是用#注释地---) :20,30 s/^#//g 20-30行 取消注释 法二. 1.多行 ...
- vim 批量注释和批量取消注释
批量注释 按ctrl+v进入可视块模式, 上下移动选中需要注释的行, 按I, 输入注释符号#, 按两下Esc, 保存 批量取消注释 按ctrl+v进入可视块模式, 上下移动选中需要取消注释的行, ...
- linux操作命令,批量注释#方法
用户,密码 1.修改密码:passwd 2.切换用户: su root 3.增加用户:adduesr+用户 4.root更改目录的权限:chown leopard:leopard data/ -R ...
随机推荐
- Oracle函数组的使用
--1.组函数--COUNT():用来统计记录的条数 如果没有记录,返回 0--COUNT函数可以根据一列或多列进行计算,没有排重功能--统计EMP表一共有多少条记录select count(empn ...
- Java EE 经验
环境配置 GlassFish Error 1 Exception while loading the app : CDI deployment failure:Error loading class ...
- Live YUV420 和 OpenCV Mat 的互相转换
1. YUV420 -> Mat 可用于转换接受到的YUV视频源到OpenCV可以识别的数据 Mat myuv( Frame_Height + Frame_Height / 2, Frame_W ...
- Ubuntu Server 14.04 集成
方便工作出差显示项目整合了下平时常用软件: OS: Ubuntu Server 14.04 VM:VMware Workstation 12.1.0 (不同版本好像会不兼容) 已经安装软件: 1. s ...
- jQuery EasyUI Combobox 无法获取属性 options 的值: 对象为 null 或未定义
错误的写法: $('#combobox1').combobox({ valueField: 'id', textField: 'text',data:[{id:1,text:'蚂蚁小羊'}]}); 正 ...
- N皇后问题—初级回溯
N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...
- phpcurl类
1.需求 了解curl的基本get和post用法 2.例子 <?php class Curl{ private $timeout=30; public function set_timeout( ...
- 6 VC维
1 VC维的定义 VC维其实就是第一个break point的之前的样本容量.标准定义是:对一个假设空间,如果存在N个样本能够被假设空间中的h按所有可能的2的N次方种形式分开,则称该假设空间能够把N个 ...
- kill命令
*杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志. 首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令: # kill -pid 注释:标准的kill命令通 ...
- SemanticZoom配合GridView组件的使用关键点
1,SemanticZoom 有两个重要属性 默认值ZoomedInView(不设置的话,默认显示,包括分类名和分类成员)和ZoomedOutView(这个是缩小后的目录,只要包括分类名,点击跳到对应 ...