本文原创作者:比尔.盖茨
Pin 是一种动态二进制检测框架,适用于x86,x64架构,一般用于程序动态分析用,是多个平台都支持,windows 、linux以及OSX。该工具原本适用于计算机架构分析用的,但是由于丰富的api,与强大的功能现在运用的地方很多。比如计算机安全,环境模拟器,并行计算。
Pin相当于一个JIT("just in time“)编译器,并且有相当数量的实例代码(这一点真不错),对于新手来说上手是很快的。但是貌似在国内安全界很少被公开提及,但我知道还是用的。对于这样的一个好工具,我觉得再不介绍给大家真不好意了。
Pin大体上有三种插装代码模式(指令级,rtn级,bbl级),
指令级的执行过程大体上如下图:
下面讲讲pin 工具的功能:
1. 替换原有程序函数 2. 探测程序任意指令,在自己设定的插入位置插入自己的代码并执行 3. 记录程序调用,包括syscall(检测改变参数) 4. 记录程序线程活动情况 5. 监测进程树 6. 模拟api调用(这里可以思维宽广点。。。)
Pin的三种插入(代码)模式:
1.Instruction level (Ins )
即在每一条原始程序指令前,后插入自己的代码,即调用这个函数,这里我不详细讲,因为pin的文档很全面,自己去就行。但是有一点这个级别执行可想而知,会执行的很慢,很耗时间。(因为在每天指令上加入代码,即使自己的代码只包含一行(ps: nop),代码就至少膨胀5倍以上)
2. Function level(RTN)
Pin通过符号表信息来找到这些需要插入的位置,要使用这种模式的代码插入,首先得调用pin内置的初始化符号表函数,即PIN_InitSymbols()
3. Basic block level(BBL)
即基本调用块级别,插入模式,只在trace时候可用。
下图为pin的执行过程:
0. 启动自己(pin.exe),以debugger的模式,附加要分析程序的进程 1. 注入pinvm.dll到宿主程序中 2. 注入自己的工具代码(即pintool.dll) 3. 激活主程序进程
然后的过程就是程序执行与pin代码执行的过程了。
下图为其各个部分的具体功能:
Api log Record工具:
就是记录出pe文件执行时候调用的api序列,为了效率,我并没有记录所有的api,这样执行效率与序列优化都能保证,输出api序列文件名为apisequence.log。如果有注入或者写内存,则会有dump,dump的文件名为 .dump结尾的文件。
本工具中包含 :
1. 返回地址,api名称,调用参数,返回值,动态库加载顺序。 2.dump注入代码或写内存数据。
工具运行命令行
Zbot运行后的log输出情况:
Md5: 776f4947d88943479094fb9a9cf8c96e
大灰狼:
Zbot dump出来的文件
其中1.dump为一个pe文件
有了这些api log,所以很容易处理批量已知恶意代码。对于未知的文件,则可以制定一些特征规则,然后去匹配运行后的api log与内存dump文件特征,则能较快筛选出恶意与非恶意文件,还有可以更进一步给出样本分类。
对于特殊的样本则可以先用此工具运行,找到感兴趣的api或位置,根据前面的api返回地址跟踪过去,则会很容易进行逆向分析过程。对于加壳或者混淆过的恶意代码分析能够提供参考分析与帮助。
工具还有不完善的地方和可以优化和怎加功能的地方,如果有时间我会再完善的,如果大家有好的想法,可以给我提建议。
工具下载地址
链接: http://pan.baidu.com/s/1ntKmzKd
密码:x6kn
1.该工具只能运行在win7 x86,x64以上环境,且目标程序只支持x86(如果有需要我可以搞一个x64版本的) 2.该工具在执行目标程序的时候是真实跑起来的,所以如果运行病毒请在虚拟机中运行,如果目标文件不是恶意代码则无所谓 压缩包md5: f30fcb9fad3f509a8cb1bd9614c24720 压缩包sha1: 78cf69cc4119589e808a5247020540853cf18c55
* 作者:比尔.盖茨( 微博),属FreeBuf原创奖励计划文章,未经许可禁止转载