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 ...
随机推荐
- Wrong list
1.背包dp[i][j]无论当前物品是否不大于j都可以转移dp[i-1][j] 2.循环从0开始还是1开始的问题 3.无向图边集数组开两倍 4.(3*987654321) > maxint 4. ...
- PJAX的实现与应用
一.前言 web发展经历了一个漫长的周期,最开始很多人认为Javascript这们语言是前端开发的累赘,是个鸡肋,那个时候人们还享受着从一个a链接蹦 到另一个页面的web神奇魔术.后来随着JavaSc ...
- [Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD
在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练.其实,常用的梯度下降法还具体包含有三种不同的形式,它们也各自有着不同的优缺点. 下面我们以线性回归算法来对三种梯度下降法进行比较. ...
- JS阻止冒泡事件以及默认事件发生的简单方法
如果<p>是在<div>里面,那么呢,<P>有一个onclick事件,<div>也有onclick事件,为了触发<P>的点击事件时,不触发父 ...
- scanf_s
很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,有时hacker可以利用原版的不安全性黑掉系统 例如: ANSI C中没有scanf_s(),只有s ...
- 功能实现:PLC对LPC的音量控制
设计方案1: 在PLC上,当使用QDial调节音量时,触发QDial的SIGNAL:ValueChange(),对应SLOT向LPC发送自定义键码0x22; 在LPC上,当接收到0x22键码时,执行操 ...
- Menu与ActionBar的爱恨情仇
最近在开发一款音乐播放器,在开发过程中遇到了一点小麻烦,通过android API搞清楚了Menu与ActionBar的爱恨情仇,写了个小Demo祭奠一下那些年我们陷进去的坑,有不对的地方请大神们批评 ...
- ARM概论(Advanced RISC Machines)
简介 ARM7是32 位通用微处理器ARM(Advanced RISC Machines)家族中的一员,具有比较低的电源消耗和良好的性价比, 基于(精简指令)RISC结构,指令集和相关的译码机制与微程 ...
- trap命令
一. [root@OEL6-38 arun]# vim yy.sh --------------------- 参考: http://blog.csdn.net/holandstone/article ...
- mysql主从复制实现数据库同步
mysql主从复制相信已经用得很多了,但是由于工作原因一直没怎么用过.趁着这段时间相对空闲,也就自己实现一遍.尽管互联网上已有大把类似的文章,但是自身实现的仍然值得记录. 环境: 主服务器:cento ...