个人觉得学习分两种,

  • 一种是当面请教和直接从书本网络中的资料学习.
  • 其二就是看着令你惊叹的作品-顿悟.
  • 什么?顿悟不了?那我们就一起来逆向学习吧!差点忘了,我并不打算提供Demo,这并不重要,难道你打算遇到一个同样的情景?

    重在方法.

注意:

本文为了照应新手人群,对于某些内容可能会非常具体的推演.

名词解释:

  1. 一个实例:一个对象,这里指一个程序被创建后在内存中的数量.大白话就是:成功执行了几次.

事由:

今天闲来无事(忙里偷闲)执行了两次Dr_COM的宽带认证client.如咱所料,

如图:



我们知道,限制程序仅仅执行一个实例的方法非常多,例如以下主流的几种:

  1. 查找窗体.
  2. 使用相互排斥对象之类的.病毒经常也这么干.
  3. 使用共享区块.
  4. 使用暂时文件.

那我们的COM先生是否怎样实现的呢?

开弓or工

好的操起家伙(OllyDBG,IDA)開始一次内科手术.

假设你不是非常熟悉这两个工具能够在须要的时候參考这里:

反病毒工具-IDA使用介绍

反病毒工具-OllyDBG使用简单介绍

首先,用OD加载我们Dr.COM

这里的入口点似乎是早期的VS版本号编译的Release版本号C/C++程序.用工具ExeInfoPE验证一下我们的经验并简单看下是否是伪装壳:

ExeInfoPe的使用方法及介绍能够看这里:

ExeInfo在反病毒领域的使用方法

我们须要找到哪句提示语“程序xxx已经在执行”,在系统中的位置.在界面中央(反汇编窗体)右键,选择“中文字符串搜索->智能搜索”(这是一个插件,你能够从主流的OD版本号中同样位置找到相似的字符串查找功能).弹窗如图:

非常幸运,我们找到了它.我们并非每次都这么幸运,由于一些程序猿会将它们加密存储.对于处理种种加密情况我们有机会再谈.



双击这个字符串就可以来到这个字符串的地址.

我们看到一个红色箭头指向这里.而本字符串地址的上面是一个jmp,它指向了以下的某处,这表明指令执行的时候仅仅能从远处跳到本字符串地址而不可能是一行一行走下来的.

请牢记我们的目的,我们的目的是找到程序怎样进行”是否执行了多个实例”的推断.这个推断导致指令走向两条或者很多其它的路.当中一条就是这条提示信息.顺藤摸瓜就可以.

我们逆着跳到本字符串地址的箭头找到根源.

如上图,我们找到了jmp的根源它就在我们圈住的地方.这是一个动态的jmp.它依据eax的值进行运算,eax*4+0x401D98,运算结果是一个地址跳转表,指向结果.eax就是关键.是谁改动了eax呢?

这里有条mov 指令,原来eax的值来自于[esp+0x174],而esp是栈顶寄存器,仅仅有在执行到该条指令的时候才会有真正參与运算的值.好的.F2在该条指令下断点.然后执行起我们的程序,聪明的OD已经帮助我们计算出了地址,原来eax的值来自于ss:[0018FC64].ss是段选择寄存器,就是我们右下角的窗体显示的内容咯.

我们要监视这个地址是谁将’1’这个值写入当中的.这里提供三种方法:

  1. 紧盯住该地址的内容,我们通过栈回溯跟踪到改动者.
  2. 通过硬件断点,在左下角窗体-“数据窗体”找到该地址,右键”断点”->”写入断点”.长度依据具体情况,这里WORD就可以.
  3. 使用RUN跟踪.菜单条”调试”->”设置条件”,将中断条件设置为该地址为’1’则中断.至于关于强大的RUN跟踪的使用方法,假设你感兴趣,你须要找OD的资料学习.

下图描写叙述了观察栈回溯的两种方法:

皇天不负有心人,我终于找到了将’1’写入的操作,它的地址是:403992.如图:

检測到多个实例的情况已经找到.那么单个演示样例执行的情况怎样呢?我们关闭上面打开的两个Dr.COM程序.如今我们要实验一下仅仅执行一个该程序的时候eax是多少?

将程序拖入OD中一个client,找到我们上次的eax*4+0x401D98的地方.发现正常情况下eax的值为A.继续用上面的方法寻找是谁改动了这个eax,找到了一个新的地址403466.这真是非常醉,这个程序看来是在推断之后进行了不少其它任务才进行push操作的.VS2005…

既然我们有了两次操作的地址,仅仅要找到它们的共同调用者就可以.一般通过重复对照OD中的栈回溯能够帮助我们找到它们的祖先函数.可是这次我不打算用这样的毫无趣味的方法.

IDA上场!!!!

反病毒工具-IDA使用介绍

IDA作为一款擅长图形化程序流程的超棒静态分析工具非常适合此次任务.将程序拖入IDA.

小经验:注意:不要快捷方式拖进去.OD是会将快捷方式指向的程序进行分析,**而**IDA连快捷方式本身都不放过!

如图:

假设你发现你的界面是汇编界面而不是像上图的流程图,这往往意味你刚刚不小心关闭了流程图.放心,你能够通过View->Opensubviews->Proximity browsers 又一次打开它.

在图形界面按”G”,写上push 0xA的地址”403466”如图:

OK,跳过去:

同样的办法按”G”,写上push 0x1的地址.找到push 0x1在流程图的显示.

在IDA中使用你的Ctrl+鼠标滚轮,能够放大or缩小流程图.让你感觉到更直观.

我的天两幅图居然没有在一幅”大图”里面!!!这意味这两个函数在调用上相隔非常远.

我们通过”大图”的顶端.点击函数名称,按住”X”键能够看到交叉引用的界面.这项功能非常有用,它能够将全部对目标函数或变量的调用列出来.我们看到对于push 0xA这一路的顶端函数仅仅有一个父函数调用过它.双击这个父函数.

这以下的图中,我们看到它们的关系:

让我们放大分道扬镳之地.如图:

从后往前看,假设cmp结果是0,就会跳到右边(loc_403A99),没有发现已经执行了本程序.cmp比較的是eax是否等于0FFFFFFFF(八个F).假设等于就是正常.OK,显然是call sub_40A4E0做了某种推断导致eax的值.

如今记住eax假设等于0FFFFFFFF就是没有检測到其它演示样例.

在OD中进入这个函数:

发现新大陆

我和我的小伙伴们都惊呆了.这全然超出了我的预期.本来以为这个程序会用传统的实例检測方法,可是我们看到了CreateFileMappimg之类的函数.初步推断此程序利用多次映射文件产生的冲突来做的文章.继续看:

我们发现一个新的分道扬镳的跳转,它位于40A529.

它用以下这句做了比較:

cmp ebp,0xB7

向上追溯:

mov ebp,eax

ebp来自eax.依照约定,函数的调用能够改动eax的值来达到传递结果的目的.而这里的eax正是GetLastError函数的执行结果.

地址40A529的代码的意思是假设执行GetLastError返回的不是0xB7,则跳走.跳走的结果是:

0040A54A   mov eax,edi

而此时的edi为FFFFFFFF,回忆上面,这个值意味着我们没有检測到还有一个演示样例在执行.

有同学可能会问,’0xB7是嘛意思呀?

随机的一个值?’.当然不是,0xB7是错误码,它拥有明白的含义,你能够通过VisualStudio中菜单条中的工具->”错误查找”小工具,找到它的含义:

果然如此.

收工总结

到此我们已经达到了我们预期的目的-探明Dr. Com检測到自己是否仅仅执行了一个实例的方法.通过逆向分析了解到它是通过:

设置CreateFileMapping函数的最后一个參数MapName,该參数是一个共享值.假设该值被重复命名,会报错,该错误能够通过GetLastError函数得到,返回值为ERROR_ALREADY_EXISTS(0xB7).

知识拓展

很多其它关于该函数的情况能够阅读这里:

CreateFileMapping使用方法

学到了什么?

估计一名纯新手读者通过阅读本文会学到:

  1. OD对程序的基本分析方法.
  2. 栈回溯概念
  3. 利用IDA流程图分析程序.
  4. 一种独特的进程相互排斥方法.(目的)
  5. ……

我从中学到了什么:

  1. 复习了以上全部知识
  2. 沿途看了数个感兴趣的WindowsAPI的实现.
  3. 直接下断经常使用相互排斥函数找捷径差点被坑.
  4. 了解了一些字符串函数和文件夹路径设置函数的使用方法.
  5. ……

尾声

在我幼稚园时,老师问我,”你从哪里懂得这么多”.”我的老师是书本.”我回答道.

有人说书本是不会说话的老师.假设你学到很多其它知识,请珍惜和程序在一起的时光吧.

有问题请留言评论以便讨论.

假设本文为你来到了新奇空气,请点(~ o ~)~

逆向学习XXclient怎样仅仅执行一个实例的更多相关文章

  1. 学习MQ(三) 一个实例

    学习MQ(三) 一个实例. 现在有两台机器A和B,分别安装了MQ6.0,我要通过MQ进行A和B之间的双向通信. 我打算分两步,第一步:实现A到B的数据传输. 在A上: 1.创建队列管理器 QM_100 ...

  2. go 学习笔记之仅仅需要一个示例就能讲清楚什么闭包

    本篇文章是 Go 语言学习笔记之函数式编程系列文章的第二篇,上一篇介绍了函数基础,这一篇文章重点介绍函数的重要应用之一: 闭包 空谈误国,实干兴邦,以具体代码示例为基础讲解什么是闭包以及为什么需要闭包 ...

  3. Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。

                                                                                                        ...

  4. 亚马逊AWS学习——多网络接口下配置EC2实例连接公网的一个“bug”

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/47667627 本文出自[我是干勾鱼的博客] 之前在<亚马逊AWS学习--E ...

  5. JBPM学习(四):执行流程实例

    概念: ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图. Execu ...

  6. [学习笔记]一个实例理解Lingo的灵敏性分析

    一个实例理解Lingo的灵敏性分析     线性规划问题的三个重要概念:    最优解就是反应取得最优值的决策变量所对应的向量.    最优基就是最优单纯形表的基本变量所对应的系数矩阵如果其行列式是非 ...

  7. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

  8. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

  9. OpenGL学习日记-2015.3.13——多实例渲染

        实例化(instancing)或者多实例渲染(instancd rendering)是一种连续运行多条同样渲染命令的方法.而且每一个命令的所产生的渲染结果都会有轻微的差异. 是一种很有效的.有 ...

随机推荐

  1. Centos安装FastDFS+Nginx

    一.安装环境: gcc:安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc: yum install gcc-c++ PCRE:PCRE(Perl C ...

  2. bzoj4956: [Wf2017]Secret Chamber at Mount Rushmore

    F......loyd? 这范围也是..... 然而大了也不会.... #include<cstdio> #include<iostream> #include<cstr ...

  3. 如何删除github wiki page

    title: 如何删除github wiki page toc: false date: 2019-02-23 10:08:41 categories: methods tags: github wi ...

  4. Python的filter与map内置函数

    简单的记录下这两个函数的功能: list(filter(lambda x : x % 2, range(10))) 上例是返回了0-10之间的所有基数组成的列表.filter()有2个参数,第一个参数 ...

  5. Super超级ERP系统---(5)采购管理--采购入库

    采购商品完成后,下一步要进行入库操作.为了做到精细化管理,入库操作主要分以下几个步骤,采购到货确认,采购入库,入库完成.接下来我们看看这些步骤是怎样实现的. 1.到货确认 采购商品到达仓库后,仓库收货 ...

  6. css简单介绍

    css层叠样式表,主要作用就是解决内容与表现分离的问题.html标签有自己的意义当然也是有自己的默认样式的,但有时候我们想修改他的样式,这时候就需要了css. 例:给字体加上颜色,我们有如下几种方法: ...

  7. Domain=NSOSStatusErrorDomain Code=1937337955 关于iOS录音AVAudioRecorder与音频播放AVAudioPlayer真机调试录音不能播放的问题

    error:Domain=NSOSStatusErrorDomain Code=1937337955 ,这个错误很常见, 原因是因为我们需要调用另外一个AVAudioPlayer 的初始化方法,来确定 ...

  8. MemCached总结二:数据管理指令

    管理memcached中的数据包括添加(add).修改(set).删除(delete)及获取(get)等操作. 命令格式: 1.set set userId 0 0 5 12345 STORED ge ...

  9. 相似图像识别检 —基于图像签名(LSH)

    原文链接:http://grunt1223.iteye.com/blog/828192 参考:人工智能,一种现代方法 第 617页,且原始论文给出了完整的证明过程.在ANN方法中,LSH算一种可靠的紧 ...

  10. Algorithms算法题<1.1>

    1.1.27 二项分布.估计用一下代码计算binomial(100,50,0.25)将会产生的递归调用次数: public static double binomial(int N,int k,dou ...