之前两篇文章,针对恶意代码为了确保自身只有一个实例在运行进行了正向开发和逆向分析。逆向入门分析实战(一)逆向分析入门实战(二)

这种现象在恶意代码中非常常见,现在对上次的内容进行一个简要的回顾和扩展:

使用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结构体中读取相应的系统版本。

接下来看代码:

这段代码中,在主函数中先声明子函数,然后调用子函数,之后使用getchar函数,用来获取一个键盘输入。为什么加这个getchar函数?主要是因为如果不加这个,有的时候,当你直接双击这个程序时,可能命令行一闪而过让你看不清输出的内容。

子函数中,首先是获取计算机名,创建了一个szComputerName字符数组用来接收计算机名,数组大小为MAXBYTE,为一个常量,通常为256,当然不同操作系统版本对应的大小可能不太一样,在后面逆向的时候我们可以查看。

之后,同理获取计算机用户名。最后获取系统版本,其中if语句里的条件可能看不太懂,这个主要是OSVERSIONINFO结构体的成员变量需要查阅MSDN即可。dwMajorVersion就对应不同的系统版本。当对应的值为6并且dwMinorVersion为1则是windows7或者windowsserver 2008 R2。如果想了解更多关于系统版本的内容可以查看MSDN:

https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-osversioninfoa

之后编译,运行:

使用windows7时的效果:

该主机计算机名确实为PC:

版本为windows 7:

而使用windows 10时的效果:

二、逆向分析:

将程序拖入ida pro:

首先调用puts将字符串输出,之后调用getSystemInfo函数,这就是我们前面编写的子函数。双击进入发现有很多行汇编代码,如果我们现阶段就要把每一行都弄得很明白,那要花很长时间,学习很多知识,所以和上次一样,我们要分清主次,把所调用的函数分析清楚即可,等后续自己“功力深厚”一些,再努力把每一行汇编代码都分析清楚。我们选中call,会发现所有的call指令都变黄了,这样便于我们分析,为了便于描述,将每一行汇编的地址调出来,点击options->General->Line prefixes,将其勾选:

1、逆向分析获取计算机名和用户名

此部分内容对应的汇编代码如下:

查看0040175E处的call命令,此处调用GetComputerNameA函数,之前提到过后面多出一个A指的是当前使用的为ASCII环境。

在这个函数前面有两个备注分别是lpBuffer和nSize这两个其实就是GetComputerNameA的参数,我们之前学习的时候,一般是使用push将参数入栈,此处怎么不是push?其实是一样的,仔细查看汇编指令push即可知道,其实push指令将参数入栈后,栈顶指针esp便会指向该参数,而此处使用的是mov将参数的值赋值给esp所指的地址空间,本质上是一样的。至于为何将nSize赋值给esp+4所指的空间,这是因为栈的增长方向以及参数所占的内存大小有关,此处简要介绍一下,因为标准调用约定中需要从右往左入栈,需要先将nSize参数入栈,再将lpBuffer参数入栈。根据栈的特点,先入栈的参数地址高,后入栈的参数地址低。即栈是一种由高地址向低地址扩展的数据结构。有兴趣的可以进一步查阅push指令和函数调用约定相关的资料。

执行完0040175E处的call命令返回值便会存储在lpBuffer对应的缓冲区内,此处即ebp+Buffer所指的空间内。之后调用printf函数,进行格式化输出,其中同样涉及到esp+4,原因也是因为需要将GetComputerNameA获取到的计算机名先入栈,再将“computer name is %s \r\n”入栈。如果你熟悉格式化字符串漏洞的话,你会有一种很熟悉的感觉,当然如果你已经掌握了这里的知识,可以深入去了解格式化字符串漏洞的相关内容。

获取用户名的逆向分析过程与获取计算机名的过程类似,此处不过多介绍了。

2、逆向分析获取操作系统版本

这段内容对应的汇编代码如下:

首先查看00401812处的代码,94h对应10进制为148,这个数值便是sizeof(OSVERSIONINFO)的返回值,即OSVERSIONINFO结构体的大小。之后使用lea指令,它是LoadEffective Address的缩写,即加载有效地址,将该结构体所在的地址赋值给eax,之后将eax中保存的地址空间存入esp所指的空间中,整个过程即可完成结构体指针入栈工作。

然后调用GetVersionEXA函数,返回值将会放置在结构体中。之后将该结构体中的dwMajorVersion成员变量与6对比,dwMinorVersion与1对比,之后使用jnz命令来决定是否跳转,之前的文章将提及过,该命令是jump not zero的缩写,当不等于0时跳转。如果此处不是很熟悉,建议查阅之前的文章,掌握cmp和jnz以及zf标志寄存器的相关知识。再之后便使用puts输出字符串。

总结:

获取这些基本的信息其实很简单,只需调用几个windows API即可,对恶意代码进行逆向分析也很容易定位到是否在获取这些基本信息。而如果我们通过对这些windowsAPI调用的过程进行深入分析,便可以进一步掌握C语言、汇编语言和数据结构等相关的原理,比如指针,lea指令、栈的工作原理,或者进一步学习格式化字符串漏洞。

参考书籍:

《C++黑客编程揭秘与防范》冀云著,第1版,2012.6--北京,人民邮电出版社

《C++反汇编与逆向分析技术揭秘》钱松林,赵海旭著--北京:机械工业出版社,2011年9月。

《恶意代码分析实战》 (美)Michael Sikorski / Andrew Honig 著,诸葛建伟,姜辉,张光凯译 -- 北京:电子工业出版社,2014年4月,原书名: Practical Malware Analysis: The Hands-On Guide to DissectingMalicious Software。

《汇编语言》王爽 著--2版,北京:清华大学出版社,2008年4月。

《逆向工程核心原理》,李承远著--北京,人民邮电出版社,2014年第1版。

逆向游乐园第一关 

https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182016031811584100001

(通过该实验了解调试工具和反编译工具的使用方法,能够通过分析样本中的详细信息,进行程序的爆破或者算法的还原突破程序的限制。)

欢迎投稿至邮箱:edu@heetian.com

有才能的你快来投稿吧!

投稿细则都在里面了,点击查看哦

重金悬赏 | 合天原创投稿涨稿费啦!

精选推荐

《Web安全零基础到精通》

  • 如果你也是一名想进入Web安全行业,急需专业老师带路的人;

  • 急需提升实战技能,想找一份心仪工作的0-3年Web安全新人;

  • 在校大学生,想进入Web安全行业,急需参与实操项目的同学。

戳戳戳

逆向入门分析实战(三)相关推荐

  1. 逆向入门分析实战(二)

    上次我们对主函数分析完成了,逆向入门分析实战(一)那么这次我们对子函数IsAlreadyRun进行分析. C语言代码 IsAlreadyRun函数的C语言代码如下图所示: 下面对其汇编代码进行分析: ...

  2. 木马编程入门_逆向入门分析实战(一)

    原创xiaoyuer合天智汇 木马分析入门 大家好,我最近从Web安全开始学习二进制安全,分享一下自己学习过程的收获和心得体会.由于是入门的内容,所以对于二进制大佬来说这很简单,所以本文主要面向的对象 ...

  3. 逆向入门分析实战(一)

    本文作者:xiaoyuer 本文涉及知识点靶场练习--ARM汇编教程:该课程是后续<ARM漏洞利用技术>打基础的,我们在漏洞利用课程中会介绍使用ARM汇编编写shellcode等内容,所以 ...

  4. pytorch快速入门与实战——三、Unet实现

    专栏目录:pytorch(图像分割UNet)快速入门与实战--零.前言 pytorch快速入门与实战--一.知识准备(要素简介) pytorch快速入门与实战--二.深度学习经典网络发展 pytorc ...

  5. javascript逆向入门级别实战--某小网站登录密码加密分析

    仅供学习,切勿用于非法用途! 难度 非常低 网站(请自行base64解码) aHR0cCUzQS8vd3d3LnBpZ2FpLm9yZy8= 抓包分析 按F12打开浏览器开发者工具,选到network ...

  6. Flink流式计算从入门到实战 三

    文章目录 四.Flink DataStream API 1.Flink程序的基础运行模型 2.Environment 运行环境 3.Source 3.1 基于File的数据源 3.2 基于Socket ...

  7. 贴捕鱼cocos2d逆向入门分析

    cocos2d-x 先clone git clone地址 https://github.com/cocos2d/cocos2d-x.git lua虚拟机相关代码在cocos2d-x\cocos\scr ...

  8. Python 爬虫逆向破解案例实战 (三):凡科网逆向之闭包技巧

    目录 1. 凡科网逆向分析 2. 代码实现 3. 总结 1. 凡科网逆向分析 点击 此处 进入到 凡科网 的主页面,在键盘中按下 <Fl2> 快捷键或者是鼠标右键单击选择 检查(inspe ...

  9. 8s pod 查看 的yaml_Kubernetes入门到实战(五)深入浅出详解Pod

    作者:Happy老师 链接:https://blog.51cto.com/happylab/2500457 写在前面 前面的系列文章已介绍kubernetes架构,安装,升级和快速入门,读者通过文章的 ...

最新文章

  1. 浏览器内核Trident/Gecko/WebKit/Presto
  2. Python使用matplotlib保存图像时发生自动裁剪丢了部分标签信息解决方案(plt.savefig保存时丢失了部分标签字符)
  3. 设置作者_阿里Java开发手册建议创建HashMap时设置初始化容量,但多少合适
  4. 【 MATLAB 】使用案例研究 DTFT 的对称性
  5. 使用Picasso加载网页图片到RecyclerView
  6. 【转】C# DateTime 日期计算
  7. github 头像生成 java_Java 如何根据头像地址生成圆形的头像?
  8. 3-6:常见任务和主要工具之正则表达式
  9. java.sql.connection 长时间不使用_车子长时间停放不使用,要做到这几点!不然报废是小,安全是大...
  10. python数字右对齐_python用format把float、int等数字字符串化设置左对齐右对齐居中对齐,宽度,保留几位...
  11. 一个牛人给的java九点建议
  12. SARIMA时间序列模型预测城市房价数据
  13. jovi语音助手安装包_jovi语音助手下载
  14. html画表盘 随时间转动,Html5画钟表盘/指针实时跳动
  15. matlab中用if语句,matlab if语句如何使用
  16. 文件上传漏洞测试upload-labs
  17. 无限能,传统中药饮片的蜕变
  18. VS Code 所选驱动器或UNC共享不存在或不可访问
  19. 新闻发布系统——INSERT 语句与 FOREIGN KEY 约束XXX冲突。该冲突发生于数据库XXX,表XXX, column 'XXX。
  20. 嵌入式系统测试平台——ETest

热门文章

  1. 《计算机图形学》实验报告 Cohen Sutherland裁剪算法
  2. Oracle 踩坑记录
  3. 笔记本硬盘飚速 首款1T 7200转本盘详测
  4. 【Go】K8s 管理系统项目[Jenkins Pipeline K8s环境–应用部署]
  5. UE4 回合游戏项目 15- 生成玩家、控制玩家
  6. 【session】session和session_id的理解
  7. uniapp扫描身份证获取信息
  8. android 控制POS机图文打印(二)
  9. 百分之二十用计算机怎么算,巧用百分里油耗计算器,节省汽车油耗
  10. 使用Selenium来爬取网页内容