一、前言

《冠军足球经理》系列作为一款拟真度极高的足球经营类游戏。赢得过无数赞誉,而CM4可以说是这个传奇的起点。

可是在游戏安装过程中。当用户输入完序列号之后。程序并不会对用户的输入进行真伪推断,仅仅有等到安装完成。进入游戏之后,通过游戏是否正常显示才可以得知。而假设遇到用户不小心输入错误的情况,那么仅仅能卸载游戏又一次安装。这就会造成非常大的麻烦。

为解决问题,这次的研究会以两篇文章的篇幅通过两种方式对这个游戏进行逆向分析。一种是採用常见的“爆破”手段,也就是本文所讨论的方法;而还有一种则是编写出CM4的注冊码生成器。这会在下一篇文章中进行讨论。

后者须要根据反汇编代码分析出游戏的验证机制,这能够说是不论什么逆向研究的终于目标。也是本次研究的终于目标。

图1 CM4游戏封面

 

二、尝试在没有序列号的前提下安装并进入游戏

CM4这款游戏在游戏安装的过程中。会要求用户输入序列号,这个序列号由数字加字母组成,一共16位,每4位为一组。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaW9pb19qeQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

图2 CM4安装程序的序列号输入界面

而在本研究的过程中。我尝试将序列号输入为“0123456789ABCDEF”,每一位输入不同的字符,这样便于后面的逆向跟踪。

这样的方式往往也运用于缓冲区溢出的检測(可见《反病毒攻防研究第003篇:简单程序漏洞的利用》)。当游戏安装完成后,进入游戏。程序会先进行序列号的验证,假设之前的序列号输入错误,那么就会出现错误提示对话框。

图3 进入游戏之前提示的错误信息

这里当我们单击“确定”之后,依旧可以进入游戏,可是游戏却无法正常显示,在我的电脑中。凡是出现文字的部分,均会以乱码显示。尽管说对于老玩家而言。依旧可以通过各个button的位置来确定每一个button的功能。可是依旧会造成非常大的麻烦。所以在此非常有必要对这一问题进行逆向研究。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaW9pb19qeQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

图4 进入游戏中的乱码显示

三、寻找软件的CDKEY检查对话框位置

一般来说,想要找到软件的验证语句的位置,则须要运用动态或者静态反汇编工具,得到它的反汇编代码,分析该软件的执行机理,一步一步跟踪执行。直至弹出如图3所看到的的“CDKEY检查”对话框。这个对话框一定是由一个CALL语句调用出来的,那么这个CALL语句必定包括了对应的验证机制,就有必要进入这个CALL语句,进一步分析。

对于这次的研究对象——CM4来说相同如此,依据惯例。我们有必要先对这款软件进行查壳的操作,这是一切逆向工作的起始。毕竟有壳的软件是必需要进行脱壳之后才干进一步分析的。

这里我使用的是PEiD:

图5 对CM4进行查壳操作

依据查壳的结果能够看到。本软件是採用Microsoft Visual C++ 8.0编写的Debug版本号,并没有加壳,那么接下来就能够依照上述思想開始分析了。

直接单步执行进行检查。非常快就能够定位到调用错误提示对话框的CALL语句。其相对地址为0x0041495C(当然真正调用MessageBox()语句的 CALL还在这个CALL的内部)。

图6 找到CDKEY检查的CALL

按F7进入这个CALL之后,继续单步运行,来到相对地址为0x00411E3C位置处的语句,因为经过上一步(test eax,eax)的验证后ZF标志位为1(两个eax的值相等),于是跳转实现,会直接跳转到0x00411F26的位置。

图7 跳转至对话框的语句

经过观察能够发现,所跳转到的0x00411F26的位置就是调用MessageBox()函数的位置,而它也正是“CDKEY检查”对话框。

图8 对话框调用函数位置

分析至此,就能够採取对应的手段来避开这个对话框,使游戏正常执行。

 

四、採取“爆破”方式来正常进入游戏

“爆破”最经常使用的方式是改动关键跳,对于本软件来说。就是上面分析出来的相对地址为0x00411E3C位置(图7)处的“je00411F26”(相等则跳转)语句。正是因为这个跳转实现,使得CDKEY检查对话框(图3)弹出。根据这个就能够进行改动了。

在此情况下通常有两种方式能够达到目的。一种是能够考虑改变条件跳转语句的条件。能够将je改动为jnz(不等于0则跳转)。这样程序能够顺序运行下去,而不会跳转到错误提示窗体。

图9 改动跳转语句的条件

还有一种是能够直接将跳转语句删除,用nop予以代替,也能够达到避免产生跳转的效果。

(注意:将反汇编代码改动为nop并非对全部程序都有效,其目的仅仅是避免跳转,从而继续下一条语句运行。详细情况须要详细分析)。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaW9pb19qeQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

图10 nop掉跳转语句

採用上述不论什么一种方式改动之后,进入游戏。能够发现错误提示窗体不再显示。而且游戏中的文字也正常了。

图11 改动后进入游戏

当然,“爆破”的手段五花八门。可供改动的位置以及方式多种多样,在此也就不再赘述。

可是有一点在此须要强调,在一般的软件逆向分析中,有一种去除NAG窗体的方式是把MessageBox()函数的第一个參数(在反汇编代码中是第四个參数)的值改动为一个无意义的值,比方1,这样就会导致消息窗体创建失败,从而也就不会显示MessageBox了。

图12  改动MessageBox的hWnd參数的值

可是在本软件中,採用这样的方式尽管可以去除错误窗体。可是进入游戏后依然显示乱码(如图4所看到的),可见,此时尽管不再提示CDKEY检查错误对话框,可是验证依然失败,说明验证流程已经运行了。因此在本程序中。只改动hWnd这个參数是无法达到目的的。

 

五、进一步分析CM4序列号验证机理

採取“爆破”手段尽管可以解决这个问题,可是却改动了程序的源码,因此并非高明的手段。而类似于这样的软件的逆向分析的最高目标。就是通过分析其序列号的验证机制,从而编写出序列号生成器。这样不会破坏程序的原始代码,也对程序有了比較深刻的理解。当然关于序列号验证算法的逆向分析与序列号生成器的程序编写。会放到下一篇文章中讨论,这里仅仅是去寻找验证机制的反汇编代码位置。

首先能够肯定的是,序列号验证模块的入口代码一定是一个CALL语句,并且它必定在推断是否运行错误提示窗体代码(图7)的上方(可能在上方非常远处)。对于本程序来说,这个CALL的返回值保存在eax中,而这个eax正好就在弹出“CDKEY检查”窗体反汇编代码的正上方:

图13 序列号验证返回值推断

一般来说。序列号的验证就是通过一系列的算法对序列号进行检验,验证结束以后,接下来的语句就能够通过返回值,也就是保存在eax中的值的情况进行推断。以决定程序接下来的走向。有些不一样的是,本程序并非对eax中的内容直接进行推断。而是将[ebp-19d]中的值经填充后再赋给eax进行验证,那么有理由相信,用于验证的CALL语句的真正返回值会保存在[ebp-19d]中。它才是最为关键的位置。逆向分析时就须要时刻留意这个位置的值怎样发生变化。换算成相对地址,也就是0x0012FCEB。

不断向上回溯查找能够发现,整个流程中会出现非常多的CALL,可是不必每个CALL都要跟进查看。仅仅要留意该CALL语句运行完成后是否改变了0x0012FCEB位置的值就可以。能够紧盯数据窗体中的0x0012FCEB位置,看其到底是受到哪个CALL的影响由断点“CC”变成了非零值(关于断点“CC”的说明,可查看《技术面试问题汇总第001篇:猎豹移动反病毒project师part1》中问题1末尾处的补充知识)。

依照这样的思想,非常快就能够找到关键CALL:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaW9pb19qeQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

图14 影响返回值的关键CALL

相对地址为0x0041DB3的CALL语句运行后,其返回值赋给了[ebp-19d],将该位置的值由CC变成了00。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaW9pb19qeQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

图15  数据窗体中查看0x0012FCEB

这样一来。接下来的工作就是进入相对地址为0x0041DB3的CALL语句中进行分析了。对于这个CALL内部原理的分析,我会放在下一篇文章中。

六、小结

对软件进行逆向分析是一件很耗时的工作,须要耐心与恒心。可是一旦成功。喜悦是不言而喻的。OllyDbg是我们反汇编工作中的利器,希望大家可以熟练掌握,还是那句话,希望各位读者可以勤加练习。才干在实际的运用中,少走弯路。

逆向project第003篇:跨越CM4验证机制的鸿沟(上)的更多相关文章

  1. 逆向project第005篇:跨越CM4验证机制的鸿沟(下)

    一.前言 本文是逆向分析CM4系列的最后一篇,我会将该游戏的序列号验证机制分析完成,进而编写出注冊码生成器. 二.分析第二个验证循环 延续上一篇文章的内容,来到例如以下代码处: 图1 上述代码并没有特 ...

  2. 逆向工程第003篇:跨越CM4验证机制的鸿沟(上)

    一.前言 <冠军足球经理>系列作为一款拟真度极高的足球经营类游戏,赢得过无数赞誉,而CM4可以说是这个传奇的起点.但是在游戏安装过程中,当用户输入完序列号之后,程序并不会对用户的输入进行真 ...

  3. 逆向工程第005篇:跨越CM4验证机制的鸿沟(下)

    一.前言 本文是逆向分析CM4系列的最后一篇,我会将该游戏的序列号验证机制分析完毕,进而编写出注册码生成器. 二.分析第二个验证循环 延续上一篇文章的内容,来到如下代码处: 图1 上述代码并没有特别需 ...

  4. 逆向工程第004篇:跨越CM4验证机制的鸿沟(中)

    一.前言 在上一篇文章的最后,我已经找出了关键的CALL语句,那么这篇文章我就带领大家来一步一步地分析这个CALL.我会将我的思路完整地展现给大家,因此分析过程可能略显冗长,我会分为两篇文章进行讨论. ...

  5. 逆向project第004篇:令计算器程序显示汉字(下)

    一.前言 钩子技术是一项很有有用价值的技术.在Windows下HOOK技术的方法比較多,使用比較灵活,常见的应用层的HOOK方法有Inline HOOK(详见<反病毒攻防研究第012篇:利用In ...

  6. 黑客攻防技术宝典web实战篇:攻击验证机制习题

    猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 在测试一个使用joe和pass证书登录的Web应用程序的过程中,在登录阶段,在拦截代理服务 ...

  7. Linux登录验证机制、SSH Bruteforce Login学习

    相关学习资料 http://files.cnblogs.com/LittleHann/linux%E4%B8%AD%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95%E8%AE% ...

  8. Android 逆向project 实践篇

    Android逆向project 实践篇 上篇给大家介绍的是基础+小Demo实践. 假设没有看过的同学能够进去看看.(逆向project 初篇) 本篇主要给大家介绍怎样反编译后改动源代码, 并打包执行 ...

  9. Android Cocos2dx引擎 prv.ccz/plist/so等优化缓存文件,手把手ida教你逆向project反编译apk库等文件

    前段时间在 Android play 上看到一个非常牛逼的 3D 动态天气预报,效果真的非常炫.二话不说动手 dex2jar.bat/apktool 发现这并没 有什么卵用,在核心的地方看见 nati ...

随机推荐

  1. poj 3420 Quad Tiling (状压dp+多米诺骨牌问题+矩阵快速幂)

    还有这种操作?????? 直接用pre到now转移的方式构造一个矩阵就好了. 二进制长度为m,就构造一个长度为1 << m的矩阵 最后输出ans[(1 << m) - 1][( ...

  2. css所有属性(table,行列组)总结

    概述: CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明: CSS声明总是以分号(;)结束,声明组以大括号({})括起来: 一.注释: CSS注释以 "/*" 开始, ...

  3. 【codeforces 500E】New Year Domino

    [题目链接]:http://codeforces.com/problemset/problem/500/E [题意] 有n个多米诺骨牌; 你知道它们的长度; 然后问你,如果把第i骨牌往后推倒,然后要求 ...

  4. ASP.NET-入门

    MVC5特点 1.One ASP.NET统一平台  2.Bootstrap 免费CSS,响应式页面 3.路由标记属性:简单.控制器.操作.前缀.参数.URL 4.ASP.NET web API 2 : ...

  5. CODEVS——T 1005 生日礼物

    http://codevs.cn/problem/1005/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description ...

  6. [CSS3] The different of Background-size between 'cover' and 'contain'

    'cover': The smaller axies of image (x axies) should match smaller axies (x axies) of container. So ...

  7. 剪切具有CornerRadius的RectangleGeometry(可能在Ripple中用到)

    剪切具有CornerRadius的RectangleGeometry(可能在Ripple中用到) 1.新建Converter public class BorderClipConverter : IM ...

  8. ElasticSearch 深入理解 三:集群部署设计

    ElasticSearch 深入理解 三:集群部署设计 ElasticSearch从名字中也可以知道,它的Elastic跟Search是同等重要的,甚至以Elastic为主要导向. Elastic即可 ...

  9. (转载) android快速搭建项目积累

    android快速搭建项目积累 2016-04-05 20:07 519人阅读 评论(0) 收藏 举报  分类: android优化(8)   Rx技术(5)  版权声明:本文为博主原创文章,未经博主 ...

  10. php创建图像具体步骤

    php 的图像处理在验证码是最常见的,下面说下使用php创建图像的具体步骤. 简要说明:PHP 并不仅限于创建 HTML 输出, 它也可以创建和处理包括 GIF, PNG(推荐), JPEG, WBM ...