上次我们对主函数分析完成了,逆向入门分析实战(一)那么这次我们对子函数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     [ebp+var_4], eax
cmp     [ebp+var_4], 0
jz      short loc_40107D

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

精选:2019原创干货集锦 | 掌握学习主动权

了解投稿详情点击——重金悬赏 | 合天原创投稿涨稿费啦!

我就知道你“在看”

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

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

    本文由作者首发于合天智汇:http://www.heetian.com/info/840 之前两篇文章,针对恶意代码为了确保自身只有一个实例在运行进行了正向开发和逆向分析.逆向入门分析实战(一).逆向 ...

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

    本文由作者首发于合天智汇,http://www.heetian.com/info/742 1.木马分析入门 大家好,我最近从Web安全开始学习二进制安全,分享一下自己学习过程的收获和心得体会.由于是入 ...

  3. 视频教程-x86/x64软件逆向分析入门-C/C++

    x86/x64软件逆向分析入门 成都理工大学优秀讲师,教授,二十年开发经验,和十六年一线教学工作经验,发表学术论文十余篇.参与包括863项目等多个国家级科研项目,参与包括微信机器人(WeChaty)等 ...

  4. [系统安全] Windows逆向必备知识、逆向分析小实战

    本文为笔者从零基础学习系统安全相关内容的笔记,如果您对系统安全.逆向分析等内容感兴趣或者想要了解一些知识,欢迎关注.本系列文章将会随着笔者在未来三年的读研过程中持续更新,由于笔者现阶段还处于初学阶段, ...

  5. golang入门实战(二)

    golang入门实战 github 接上篇 接口数据时间格式 token校验中间件 多平台打包 未完待续 github 项目完整代码–github 接上篇 golang入门实战(一) 接口数据时间格式 ...

  6. 机器学习-情感分析-入门实战案例

    前言 情感分析属于自然语言处理的一部分,其任务是,给定一个文本,判断这个文本所表达的情感是正面的,中立的,还是负面的.这被广泛用于: 1. 商品好评度自动检测. 2. 微博推特等平台用户发言是开心赞美 ...

  7. 怎么加载csv_python爬虫入门实战(四)!爬取动态加载的页面

    今天的主题是爬取动态网页的经验分享,以cocos论坛为例子进行分享.(官方不会打我吧 ) 配置环境 为什么选择cocos论坛呢?因为自己在浏览论坛时,发现标题内容会随着滚动条的位置而动态添加. 环境: ...

  8. python爬虫动态加载_python爬虫入门实战(四)!爬取动态加载的页面!

    今天的主题是爬取动态网页的经验分享,以cocos论坛为例子进行分享.(官方不会打我吧 ) 配置环境 为什么选择cocos论坛呢?因为自己在浏览论坛时,发现标题内容会随着滚动条的位置而动态添加. 环境: ...

  9. layui 如何动态加载局部页面_python爬虫入门实战(四)!爬取动态加载的页面!

    今天的主题是爬取动态网页的经验分享,以cocos论坛为例子进行分享.(官方不会打我吧 ) 配置环境 为什么选择cocos论坛呢?因为自己在浏览论坛时,发现标题内容会随着滚动条的位置而动态添加. 环境: ...

最新文章

  1. HSSFWorkbook 与 XSSFWorkbook
  2. linux io重定向指令,Linux基础知识之 IO重定向
  3. 答答租车系统(面向对象综合练习)_JAVA
  4. 数据分析与挖掘实战-基于基站定位数据的商圈分析
  5. 机器学习(八)支持向量机svm终结篇
  6. Maven:IDEA 使用maven 下载源码包
  7. 如何解决Xshell使用时中文字体是躺倒显示的问题
  8. 【记录】AutoMapper Project To OrderBy Skip Take 正确写法
  9. GNS3 2.1.9版本的安装
  10. 大数据时代移动营销的十大趋势
  11. TcPlayer腾讯播放器
  12. windows温度监控效果最棒的软件 | Windows桌面优化、功能增强软件
  13. web前端@css选择器
  14. Spline样条曲线
  15. 排列组合算法(全排列、全组合)
  16. 我的helloworld
  17. 如何通过6个简单步骤让百度收录你的网站
  18. 笔记---怪诞行为学
  19. 陌陌直播全景监控系统实践
  20. [转载]Radmin的命令行参数

热门文章

  1. android打包错误6,Android本地打包出现错误,生成不了apk
  2. 黑龙江省测绘地理信息局关于开展2013年度测绘专业技术职务任职资格评审的通知
  3. vsCode左侧导航栏以及编辑区域字体整体调整的快捷键
  4. 大中型电子计算机房装修材料价格,大型计算机机房装修方案以及材料清单.doc...
  5. MPLS VPN组网系列(一)基础MPLS VPN组网
  6. TypeScript 错误property does not exist on type Object
  7. Python复健练习:爬取58同城房产月租及户型加密字体
  8. 医学计算机应用与基础知识,医学计算机应用基础计算机基础知识课件.ppt
  9. 他励直流电动机为什么不能直接启动?采用什么方法比较好
  10. 组合数学 北师大 张秀平 自学 视频 NOIP