文章来源 | MS08067 恶意代码分析实战班
本文作者:小玉玉(恶意代码分析讲师)
在恶意样本分析的过程中,我们会不可避免地使⽤ida这个⼯具进⾏静态分析,在分析的过程中如果我们遇⻅了需要做重复操作的步骤或者⼿⼯很难完成的步骤的话我们就需要⾃⼰来根据当前的任务需求编写⼀些ida插件来帮助我们完成。
基本介绍
在ida中我们可以在如下界⾯编写我们的插件:
(这是单⾏代码编写的地⽅)
(这⾥可以编写多⾏代码)
ida插件语⾔⽀持类型:
idc(本⽂不做介绍,代码规范类似于C++)
python
ida常⽤语法与使⽤
我们可以获取ida中光标所处位置(注意:不是⿏标,是光标,也就是单击在ida的反汇编界⾯中的位置),这是最基础也是最常⽤的语法。
效果如下:
(此处没有做16进制编码,所以显⽰的地址为10进制)
我们还可以获得ida中光标所在的区节段的起始位置和结束位置,这在我们做⼀些指定信息的遍历或者对于某个区节段搜索信息的时候也经常会⽤到。
效果如下:
我们除了位置之外也可以获得ida中光标所在的汇编指令的内容。
效果如下:
有的时候我们可能不想要所有的汇编代码,我们只想要操作符或者被操作数的信息⽅便我们做筛选。
效果如下:
关于区节段的函数实战中使⽤的⽐较少,⼀般都是⼿动定位,所以本篇⽂章略过,感兴趣⼤家可以⾃⼰查阅相关内容,接下来我们介绍在ida中常⽤的与函数相关的插件语法。
⽐如我们可以遍历光标所在的区节段内所有ida已知的函数名和函数地址,⽤到我们刚才写的找起始位置和结束位置代码。
效果如下:
其中,idautils.Functions这个函数便是返回已知的函数的地址,我们在for循环中除了输出地址之外还⽤到了idc.get_func_name这个函数将指定的函数的地址转换成函数的名称。
在静态分析中,我们经常会跟进某个函数⾥⾯的代码做分析,有时候我们需要知道某个函数它所占⽤的⼤⼩或者函数的范围,也就是光标所在的函数的起始地址和结束地址。
效果如下:
除了光标所在的函数之外,我们也可以寻找相对于光标所在函数的上⼀个函数或者下⼀个函数的起始位置。
效果如下:
在静态分析中,我们偶尔会遇到没有ret的函数,⽐如某些纯汇编写的代码或者⽐较特殊的编译器的时候(部分hook也有这种情况),我们可以使⽤⼀下代码判断这个函数是否存在ret返回指令。
效果如下:
这⾥的例⼦中存在ret指令所以什么都不显⽰
在我们分析样本的过程中经常需要去区分哪些是库函数,以下代码可以帮助我们遍历整个程序中所有的库函数的位置和名称。
效果如下:
ida的输出除了我们在⽴即窗⼝看到的内容之外还可以做其他的操作,这⾥主要介绍两个⽅法:
1.在ida的汇编代码中写注释
2.修改在ida中看到的内容
1.在ida的汇编代码中写注释
效果如下:
2.修改在ida中看到的内容
这⾥需要⼤家注意三点:
1.内容⼀定要是16进制的内容
2.16进制内容为⼩端序
3.值的⼤⼩和位数⼀定要和你⽤的函数⼀⼀对应(很重要,很重要,很重要)
效果如下:
多⾏代码的编写
我们可以利⽤刚才学到的知识点写⼀些⽐较完整功能的脚本了,⽐如我们可以获取程序中所有⾮库函数或者⾮直接跳转的函数(flag为FUNC_THUNK),然后把每个函数中的所有call或者jmp语句提取出来,之后我们再判断⼀下如果call或者jmp⽴即数或者指针我们就不管,如果是跳转的寄存器我们就筛选出来。
这样做的⽬的是我们在动态分析的时候经常会遇到“call eax”这种动态调⽤,⽤⼀下代码便可以快速找到地址。
效果如下:
案例参考:
https://github.com/idapython/src
https://www.52pojie.cn/thread-1061866-1-1.html
更多恶意代码分析技术可以加入系统实战班学习(2.24号开班)
情人节活动抽奖持续进行中
点击下方小程序参与抽奖,5套MS08067实验室独家定制“唐风礼盒套装”!
— 实验室旗下直播培训课程 —