之前两篇文章,针对恶意代码为了确保自身只有一个实例在运行进行了正向开发和逆向分析。逆向入门分析实战(一)、逆向分析入门实战(二)
这种现象在恶意代码中非常常见,现在对上次的内容进行一个简要的回顾和扩展:
使用 ida pro 对恶意代码进行反汇编时会发现如下特征:
1、可以找到使用了 windows 的 api 函数 CreateMutex,该函数其中一个参数为互斥变量名。
2、在调用 CreateMutex 函数之后,通常会调用 GetLastError 函数,返回值与 ERROR_ALREADY_EXISTS 相同,即会使用 cmp 指令对返回值 eax 和 ERROR_ALREADY_EXISTS 对应的常量(16 进制的 B7,10 进制的 183)进行对比。
当然,本篇文章不是为了继续讲这个,现在我们应该更加深入的分析其他恶意代码常见的手法,这次分析恶意代码常见的获取计算机基本信息的函数,同样是先通过正向开发,然后进行逆向分析。
通常,恶意代码比较关注的计算机基本信息包括计算机名,计算机用户名,计算机的版本。下面我们就以获取这三个基本信息为例,进行正向开发和逆向分析。
一 、正向开发,获取计算机基本信息
首先,我们需要掌握几个知识点:
1、GetComputerName 函数,该函数有两个参数,第一个参数是一个缓冲区,用来接收计算机名。第二个参数指定该缓冲区的大小。对于经常使用 Python 进行编程的人来说,可能觉得有点奇怪,因为以 Python 语言的风格可能会是这样的:
computerName=GetComputerName()
函数无需传递参数,返回值即为计算机名。但是对于 windows api 很多函数来说,都会是这种风格,用某一个参数用来接收返回值,习惯就好。
2、GetUserName 与 GetComputerName 函数用法十分类似。
3、GetVersionEx 是用来获取计算机版本的函数,该函数只有一个参数,我乍一看觉得这个函数还挺简单,肯定和上面两个函数一样直接把返回值即计算机的版本返回到这个参数里了,当我仔细去看 MSDN 文档时发现,呵,参数居然是 lpVersionInfo,这是什么破东西?经过仔细调研发现,这是一个指向 OSVERSIONINFO 结构体的指针,好吧,当初学 C 语言的时候就觉得指针这玩意贼烦,现在又来了。那就好好再学习一下指针吧!这个指针指向 OSVERSIONINFO 结构体,而这个结构体就是用来承载返回值系统版本的。也就是我们先创建一个 OSVERSIONINFO 结构体,之后把结构体的指针作为参数传入 GetVersionEx 函数即可,然后再从 OSVERSIONINFO 结构体中读取相应的系统版本。