病毒分析之我见

转自:UNPACK 作者:乌龟

这两天逛了几个国内知名的反病毒的论坛或是版块,不知道是各位同行没有兴趣讨论还是为什么。病毒分析报告看到了不少,可是难道我们真正需要的只是一个答案?一份报告吗?或许我们更需要的是如何提高自身的分析能力。我们都想有更高的收入,但对于一个公司来说,付出更高的回报也许不是问题,前提是员工能创造更大的价值,怎样才能让自己的逆向能力合法的转化为更高的回报呢?也许这个帖子能有些帮助。

先声明一下,都是些个人看法,欢迎有兴趣的朋友讨论,权当抛砖引玉了
通常情况下,病毒分析需求可以归为以下3类:
1. 练手
2. 快速响应
3. 深度分析

针对不同的缘由,我们分析的入手点及侧重点又会有所不同

先从练手开始。
为什么要练手?纯爱好的不在此文讨论范围呢。如果是工作需要,或是为将来的工作做准备,第一个该考虑的问题是“选材”。
不是每个样本都适合用来练手的,如果要我来推荐,我会选以下几种样本。
下载器类的木马(Downloader),原因很简单,普及。这类型的木马会在日常工作重复出现,虽然大多数情况下都不需要做完整的白盒分析,但这会是一个好的开始。
机器人类的后台木马(Bot),这类型的木马通常都是受利益驱动的,会有越来越多的专业开发者加入此类木马的开发,所以有可能是最复杂也是最不能回避的一类威胁。
信息收集类的木马(Infostealer),这类型的木马同样可能是受利益驱动的,但相对而言,前者可能造成的后续危害更大,不过此类威胁也不能忽视,例如银行网游帐号的,或自动转账等等。
网络蠕虫(Worm),worm可能有很多种传播方式,邮件,im, p2p,文件共享,usb等等,单纯从练手的角度考虑,每种类型的最好都接触一次。
文件感染型病毒(File infector virus),同上,病毒感染和传播也可能有多种途径,但是。。。。个人以为最多拿一个样本熟悉一下就够了。为什么?因为稀少,有必要为不到1%的潜在问题花费大量时间去准备吗?个人认为是不值得的,做好其他99%的工作,剩下那1%完全可以在工作中积累和弥补。
还有一类非常重要,但至少在练手初期不推荐的木马,rootkit。。。没必要在刚开始的时候折腾自己,至于对于其他诸如MBR,BIOS,各种算法等等的作为爱好研究一下还好,但如果浪费很多精力用来练手。。。不划算


个人以为接下来该考虑的问题是“怎么练”。
对于以工作为目的的病毒分析而言,最重要的是什么?答案很简单,快。你需要快速的识别提交的样本是否是病毒,是哪一类病毒,应该做什么类型的检测或是修复等等。所以对于“怎么练”这个问题,要做的第一件事是快速识别,而对于快速识别来说,没有什么比在虚拟机或是专用的病毒测试机器上运行它更快了,当然运行+监视结果不是个100%准确的办法,可能有的威胁需要条件触发等等。鱼和熊掌不可得兼,重要的是在最短的时间内尽可能多的作出响应。除此之外也还有一些可以考虑的手段,例如观察字符串,调用的API等等。快速识别虽然看起来并不是什么技术含量很高的步骤,但必不可少。

接下来这步不是这里能多做讨论的,怎么加,加什么类型的检测与修复代码,这一步不同公司有不同的引擎,有针对有选择的练习可以事半功倍。
回到大多数朋友口中的逆向或者说白盒分析来,怎么锻炼出色的逆向病毒能力呢?除了毅力+细心之外,我想提几个需要注意的问题。
为什么要逆向病毒。逆向病毒和逆向其他类型的程序完全不同,你需要的是熟悉了解病毒的各种机制,然后有针对性的做修复或是给客户提供建议如何预防。
这里首先要提出来的是“壳的问题”。
熟悉越多的壳,对你的工作会越有帮助,但如果哪位朋友为了分析病毒去学习脱壳,那就有些南辕北辙了。为什么?因为我们不需要一个脱完壳后还可以运行的病毒,如果能脱壳当然好,但即便不能,我们也不是不能分析了。
1. 运行 2.选择合适的断点 3.挂起可能存在的反调试监控线程 4. 然后挂上去调试,或是把运行的程序从内存中dump出来静态分析等等,方法可能有很多,最重要的是怎样快,就怎样好。另一方面,几乎所有的高危威胁,都不会只用公开的壳,所以过于在意怎么脱壳不见得会有多少帮助。
在壳之后,我想问的是“静态”还是“动态”?这不是一个有100%答案的问题,具体问题具体分析,但原则上来说,能静态搞定的,没必要动态调试。静态不容易理解的,再试着调试。

接下来的问题是一些新入行朋友常纠结的“F7的问题”。步入Step into是必需的,但看到call就Step into绝对不是个好习惯。一个出色的逆向工程师最与众不同的是会选择什么时候F8(Step over)什么时候F9(Run),以及在需要的时候Alt+F7(load script),有时候某个函数看起来很复杂,步入分析可能要很久,但如果学会猜测+验证,也许一个简单的F8就搞定了。我们不需要知道每个函数是怎么实现的,我们只需要知道病毒想干什么,会干什么。这个猜测不是一天两天能练出来的,但如果你试着坚持下去,慢慢的会感受到它的妙处。
除此之外,不要过度依赖于某个工具或是插件,常见的工具病毒作者也知道,如果有针对的做了处理,部分过度依赖工具的朋友没准就被忽悠进去了。
最后再聊两句深度分析。深度分析通常会消耗掉非常可观的时间,如果不是客户需求,或是某一类非常活跃的威胁,不值得。深度分析也并不仅仅包括逆向,甚至可能会包含地下网络的追踪与调查,域名与服务器的分析,等等,有技术相关的,也有不相关的。本文不讨论其他内容,对于完整的逆向分析而言,除了上面提到过的之外,还有以下几点建议:

1. 在条件允许的情况下,不妨找一些同一家族的早期变种用于参考,这些早期变种或许可以帮助你更好的理解正在分析的新变种。例如Spyeye, 近期版本Spyeye不再直接使用字符串比较,而是不可逆的校验码,换句话说,如果没有原始字符串,要理解起来还真会浪费一些时间
2. 不是每个病毒都可以完美脱壳后再分析的。例如Zeus,Zeus解密使用到的一个密钥是基于原始文件第三节的虚拟地址计算出来的,无论多完美的脱壳,这个值肯定会变。
3. 对于复杂的恶意代码,如果静态分析或完整的动态调试都不太容易的话,试着Ctrl+N单调某一个函数未尝不是个办法。
4. 有时间的话,用常见的编译器(例如VC,Delphi,VB等)编译一些程序逆来玩,这样可以熟悉一些常见的编译器函数,例如strlen。
5. 有时间的话,熟悉熟悉各类加密解密,压缩算法, 撞上的时候会省不少时间。
6. 善用google和baidu,参考别人的分析报告并不是什么坏事,但不要依赖,最后的报告必须是基于自己的分析。
7. Olly确实比其他调试器强大,但是如果你的IDA能搞定呢?别忘了IDA随时可以添加备注,一个好的IDB对于以后的工作或许也有帮助,所以在允许的时候,我更推荐IDA

就先到这里吧,希望对各位热爱反病毒的朋友能有所帮助,也欢迎大家讨论或提出更多的问题和建议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值