上次我们对主函数分析完成了,逆向入门分析实战(一)那么这次我们对子函数IsAlreadyRun进行分析。

C语言代码


IsAlreadyRun函数的C语言代码如下图所示:

下面对其汇编代码进行分析:

rep stosd之前,同样是入栈操作,我们无需仔细追究,重点关注call函数。

1. CreateMutexA函数

首先根据call ds:CreateMutexA

这一条指令便可得知调用了CreateMutex函数(注:CreateMutexA是在Ascii 环境下的,CreateMutexW是unicode环境下的)。

上次我们提到过,在函数调用之前,如果有参数需要传递,需要使用push先将参数从后往前入栈。那么我们来看下call ds:CreateMutexA前面的三条push指令分别代表什么意思?如果查呢?这就用到非常常用的一个文档--msdn文档,这个文档是微软写的,介绍了Windows API函数,基本上遇到的函数都可以在这里查到,比如CreateMutex这个函数对应的地址是:https://docs.microsoft.com/zh-cn/windows/win32/api/synchapi/nf-synchapi-createmutexa

从官网可以看到对应的函数解释,详细介绍了这个函数的作用,参数,返回值等:

三个参数lpMutexAttributes,bInitialOwner,lpName中第三个参数lpName的意思是互斥对象的名称,另外两个在此处不展开介绍了,感兴趣的可以去查看msdn文档。现在我们再回过头来仔细看一下ida Pro给的反汇编代码:

是不是和MSDN上的三个参数反过来就对应上了?第一条push指令对应的是lpName这个参数,所以根据ida pro右边给出的备注,可以得知这个互斥对象的名称是TEST。上一次也提到过,函数调用完成后,VC中,会使用eax寄存器来保存函数的返回值。在这里也是一样的,call ds:CreateMutexA的返回值会存入eax寄存器。

2. 跳转分析

我们继续分析下面的汇编代码:

根据call __chkesp可知是调用了栈平衡错误检测函数,这里我们无需理会。之后,

mov指令将调用CreateMutexA函数的返回值eax先移动到ebp+var_4的地址上,之后又与0对比,如果两者相等,则跳转到 loc_40107D位置。即,如果CreateMutexA函数的返回值为0,则跳转 loc_40107D位置。

下面分两种情况进行讨论,一种是CreateMutexA函数的返回值为0,一种是不为0。

2.1. CreateMutexA返回值为0

首先分析CreateMutexA函数的返回值为0的情况:

跳转到这个位置之后,执行xor eax,eax这条指令,上次也提到过xor eax,eax直接会将eax的值设置为0,这是很常见的一种将eax置为0的方式。

执行完这条指令后,会到loc_40107F位置,根据pop出栈指令、call __chkesp、retn等指令可知,这是子函数IsAlreadyRun调用完要返回主函数。

那么,IsAlreadyRun函数的返回值是多少呢?返回值存在eax中,由前面可知,eax在CreateMutexA函数的返回值为0情况下,eax值为0(xor eax,eax的作用),所以IsAlreadyRun函数的返回值也是0,即IsAlreadyRun返回值为false。

对应的C语言代码:

即,当hMutex = ::CreateMutex(NULL, FALSE, "TEST")执行后得到的hMutex为0时的场景,子函数IsAlreadyRun直接执行return FALSE;

2.2. CreateMutexA返回值不为0

之后,分析CreateMutexA函数的返回值不为0的情况:

此时,由于eax不为0,所以不会跳转到loc_40107D这个位置,而是执行call ds:GetLastError执行调用GetLastError函数。后面又执行call __chkesp 调用栈平衡错误检查函数,我们在这里无需理会。之后执行cmp eax,0B7h指令,由于GetLastError函数的返回值存储在eax中,此处其实是在看GetLastError返回值是否等于16进制的B7,对应10进制的183。

如果eax的值不等于183,那么跳转到loc_40107D,之后和上一种情况一样,将eax置为0,然后返回主函数。

如果eax的值等于183,则执行mov eax,1指令,然后跳转到loc_40107F位置,返回主函数。

那么这个183到底代表什么意义呢?通过查询MSDN文档,我们可以得知,它刚好对应常数ERROR_ALREADY_EXISTS。

对比我们写的C语言代码:

也就是GetLastError函数的返回值等于ERROR_ALREADY_EXISTS时,返回true;否则,返回false。

到此为止,整个代码分析完毕。感谢各位耐心的阅读,如有不当之处,欢迎指出。

参考书籍:

《Windows黑客编程技术详解》甘迪文著--北京:人民邮电出版社,2018年12月。

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

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

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

实操练习——逆向破解-CrackMe系列

http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182016031814360300001

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

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

    之前两篇文章,针对恶意代码为了确保自身只有一个实例在运行进行了正向开发和逆向分析.逆向入门分析实战(一)逆向分析入门实战(二) 这种现象在恶意代码中非常常见,现在对上次的内容进行一个简要的回顾和扩展: ...

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

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

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

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

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

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

  5. Flink流式计算从入门到实战 二

    文章目录 三.Flink运行架构 1.JobManager和TaskManager 2.并发度与Slots 3.开发环境搭建 4.提交到集群执行 5.并行度分析 6.Flink整体运行流程 Flink ...

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

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

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

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

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

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

  9. SO逆向入门实战教程一:OASIS

    文章目录 一.前言 二.准备 三.Unidbg模拟执行 四.ExAndroidNativeEmu 模拟执行 五.算法分析 六.尾声 一.前言 这是SO逆向入门实战教程的第一篇,总共会有十三篇,十三个实 ...

最新文章

  1. ANDROID_MARS学习笔记_S01_011ProgressBar
  2. 如何快速下载maven依赖jar包
  3. 215. 数组中的第K个最大元素 BFPRT最牛解法
  4. python的open函数百度百科,open函数
  5. Python笔记-BeautifulSoup通过查找Id获取元素信息
  6. ThinkPHP_5对数据库的CURL操作
  7. mysql显示表已存在_「Docker系列」 如何在Docker中部署MySQL数据库?
  8. [Python] L1-003. 个位数统计-PAT团体程序设计天梯赛GPLT
  9. 神奇技术:科学家借助AI从受害人脑中还原犯罪者样貌
  10. 【2013】将x插入有序数列
  11. 超详细中文车牌识别开源库EasyPR入门实战(win10_VS2019_opencv34)
  12. WEBMAX函数 动态模糊特效【官方教程】
  13. 图书馆图书管理系统python_使用python的简易图书馆管理系统
  14. 外贸常用术语_13个常用的国际贸易术语详解
  15. C51单片机实现 贪吃蛇
  16. C语言——计算当前日期前/后N天的日期
  17. 【视频+图文 直播贴】2014.9.9 Apple苹果发布会
  18. 优美的数列(斐波那契数列)
  19. 港大黄凯斌:6G时代的边缘智能,香农与图灵的相遇
  20. 托运行李安检系统行业研究及十四五规划分析报告

热门文章

  1. 电销外呼系统怎么选择
  2. FANUC Robot自动回原点编程三
  3. 2018-07-09和10的1天半面试
  4. [股票预测]基于ARIMA股票预测
  5. 亚马逊UL588认证常规检测项目介绍
  6. 1小时快速搭建一个网站
  7. ORACLE学习笔记-关于索引和约束
  8. 诺贝尔奖得主亲临MWC上海解读移动通信的“黑金”石墨烯
  9. 百度撒币!亿万现金补贴、首创经纪人模式,全民小视频意欲何为?
  10. 地级市地区生产总值及一二三产构成