crack 练习

最近看了crack, 心里痒痒的, 觉得总要做些什么事情; 因为是初学, 所以只能搞些简单的东西来蹂躏一下了,呵呵! 找来找去, 觉得程序设计时的东西可能有点价值(都是些模拟真实软件的小程序), 于是我就选择了我的同学写的成绩管理系统; 我用编译器把程序编译成了release版的, 然后就开始郑重其事地"破解"起来了;这里先说明一下, 虽然我连源代码都有, 但是这是我同学写的, 我只是收藏了一下, 并没有看过(包括在破解的过程中), 我是真的 郑重其事 的;

在破解之前, 让我们现来了解一下程序的运行过程(见图01 -05 )吧! 在程序运行后, 我们会发现程序给出了一个提示界面, 我们想修改学生的成绩, 于是我们输入了4; 按回车后, 我们进入了一个相应的界面, 我们想以超级用户的身份进行登入, 于是我们输入了 1; 按回车后, 我们进入了超级用户登入的界面, 它要求提供密码; 因为密码是放在文件里的, 我们看过之后知道是 200808, 于是输入密码; 这样, 我们就以超级用户的身份进入了系统;  如果输错了密码就不可以登入;

图01

图02

图03

图04

图05

 

现在我们的破解目标是, 在不知道密码的情况下(就是不能看那个存放密码的文件) 以超级用户的身份登入系统;

接下来, 我们来看一下我们在整个破解过程中要用到的软件, 一个是静态分析工具 IDA , 另一个是文本编辑工具 UltraEdit;  我们用IDA对可执行文件进行跟踪, 了解程序, 然后找到破解程序的思路, 因为IDA不可以直接修改反编的代码(知道为什么吗?), 我们只好借助于 文本编辑工具 UltraEdit;

可执行文件在一定程度上是在运行时内存中的镜像, 也就是说你的程序中跳转地址, 程序地址(其实程序的调用也是一种跳转过程)都已经固定了, 也就是说你不可以改变原来代码的相对位置, 不然的话跳转指令会出错的! 修改代码很容易改变原来代码的相对位置, 所以IDA禁止了修改代码; 但是IDA中可以为跳转的标识号改名, 这一过程并没有改变原代码, 这些标识号是IDA在自己的运行空间中设置的;

我们现来看看IDA的界面吧, 发现界面的很大的一部分被称为 IDA View-A 的标签页占据着, 标签页中显示了可执行文件的反汇编代码; 在这个标签页的边上是另一个标签页 "Hex View-A", 这是用十六进制显示代码和数据的; 我们在整个破解的过程中主要就是用来这两个窗口;

图06

现在开始破解:

我们分析一下程序的运行, 我们最感兴趣的是超级用户登入时输入的密码, 于是我们把IDA切换到"Hex View-A"标签页, 然后在其中查询字符串"超级用户"; 

图07

于是我们看到了"请输入超级用户密码" 这一字符串, 于是我们选择这一字符串,

图08

 

然后切换至 "IDA View-A"标签页, 由于IDA具有同步功能, 于是我们就可以在代码显示部分看到这一字符串, 其实两个窗口显示的是可执行文件的同一个地方, 只是显示方式不同而已! 我们很快发现这里是程序的数据段部分, IDA就是好, 在边上用浅蓝色的字给出了这个字符串调用的位置, 而且还是个超链接(双击可以跳转到那个地方); 浅蓝色字给出了这样一个信息, "请输入超级用户密码:" 这一字符串是在函数 sub_4067F0 (这只是IDA给出的标识,

图09

在可执行文件中这只是个地址值, 你完全可以把这个标识换成别的, 在IDA中页确实给出了改名的功能, 下面会用到的); 我们双击浅蓝色字, 跳转到字符串引用处;

图10

 

简单看了一下这里的代码, 我们的目光很快被这个指令组合所吸引: test jz call;  仔细想一下, 我们会发现, 这很有可能是在进行密码的验证; 理由是, 1. 它是出现在提示符"请输入超级用户密码:" 下的; 2. 在这一指令组合之前, 提示符后出现的函数调用都是些系统的函数调用;

不管怎样, 我们跟踪一下吧; 我们现处理代码 jz  short loc_40696F; 我们双击 loc_40696F, 我们就跳转到了那个标识符的地方;  我们发现在这个代码段 有几个输出信息:
"1.您的输入错误,重新输入", "2.返回" ... 这不是我们在超级用户登入时,输错密码时的提示信息吗;

图11

好了, 我们就这一模块重新命名为"error"(一处改名, 到处都会改名; 见图14);

图12

 然后我们返回到上一个页面(图10);
接下来, 处理这个代码: call sub_405540, 我们双击 sub_405540, 跳转到这个函数中; 简单地浏览了一下代码, 我们发现了这样一个输出信息: "请选择要修改的学生的学号:" ; 就凭这条信息, 结合它出现的地方, 我们可以断定我们现在所处的位置是超级用户操作的地方, 我们再回想一下,发现, 我们在程序运行时, 输对超级用户密码后, 出现的界面里也有这样的一条信息! (见图05)

图13

OK, 我们现在用同样的方法为这个函数改名, 为"surperEdit";

图14

返回上一层, 我们来整理一下思路; 程序运行时, 进行超级用户登入时, 程序会提示你输入密码 "请输入超级用户密码:", 然后程序进行一系列操作之后, 就进入到我们关心的 指令组合: test jz call; 现在我们知道一旦test 的结果为0, 则程序进入出错处理, 不然的话就是登入成功; 我们可以用图的方法来看这个逻辑过程;

图 15

进行代码的破解:
我们的破解目标是, 在不知道密码的情况下, 以超级用户的身份进行登入; 分析代码后我们, 我们有这样的解决方案: 1)跳过密码的验证, 直接进入登入后的界面, 在密码验证前加入这样的代码 jmp surperEdit;  2)修改程序, 使得输入错误代码都可以进入程序, 也就是修改代码 jz short error 为 jnz short error;

我们选择方案2 (因为其实现简单, 我们将在下面解释为什么), 方案二的原理: 我们发现输入的密码正确时, test al, al 的结果为1, 相反错误时为0; 结果为0时, 通过指令jz我们就跳到了错误处理处, 为1时, 就跳转到surperEdit; 改为jnz 后, 运行结果正好相反, 当输入的密码正确时, 程序进入了错误处理, 错误时却能登入, 所以在运行此破解的版本时, 如果你的运气足够的好, 找对了正确的密码, 但是我要告诉你, 此时你的运气是所有使用这个破解程序人中最差的!

图16

方案二虽然说差不多解决了我们所要达到的目地, 但是对于用户来说, 并不完美; 其实方案一是最完美的; 那你可能要说为什么不用方案一, 那就看解决的难易程度了; 由于修改代码时,我们不可以使可执行文件的长度发生变化(与IDA不可以修改代码的原因一样), 所以要在代码中添加这样一个jmp指令有难度, 还有就是jmp指令的跳转地址手工计算有难度,它与jmp指令的地址有关系; 但是我自己也处理了一下,还是被搞定了;

方案二, 我们只要把 jz 改为 jnz, 对应机器码, 就是把 74 改为 75 ( 注意: 74代表jz, 75代表 jnz) ; 分析阶段完成, 现在我们就可以用UltraEdit进行编辑了, 现用 UltraEdit打开可执行文件, 接着使地址跳转到 00006906 (你可以从IDA中得到, 你先选择代码, 然后看状态栏, 具体参见图06 中状态栏中画出的), 然后把74改为75; 保持代码; 然后运行!

图17



话题扩充(以关键字提出):
1.空洞
因为可执行文件中的代码段, 数据段的长度固定, 我们的可执行文件的有用部分总是不会把其充满, 所以在可执行文件中找到很多未用的地方, 我们不妨称其为 可执行文件的 "空洞"; 很多的病毒都会利用这些地方写入病毒代码, 然后通过修改程序的指针使其指向这里; 这样的病毒可以实现0字节增长的感染; 也就是说我们不可以通过查看文件长度是否增长来判断是否感染病毒了;

2. 壳
我们会发现, 加壳和脱壳 经常与 软件的破解联系起来; 从字面上, 很容易知道, 软件壳是用于保护软件的; 我们刚破解的那个程序是个没有壳的程序, 所以看其来很脆弱(是啊, 想想没有壳的蜗牛 和 乌龟 就知道了), 我们可以直接看到像"输入超级用户密码:"之类的敏感信息, 然后跟踪之; 但是如果我们对原来的代码进行了一定的压缩, 或是加密, 就不会这么轻易地看到敏感信息了吧; 我们可以把这个对原代码处理的过程叫做加壳; 这样的代码破解就有困难了;这样, 脱壳的意思就清楚了

        如果我们用压缩的方法来对软件加壳的话, 我们可以联想我们用winRAR压缩普通文件, 我们现在想要压缩的文件上面点击右键压缩后, winRAR就会按照默认的算法(一般是标准压缩, 我们也可以选择最快压缩,最好压缩....)进行压缩;  然后当我们双击想要打开的压缩包时, 我们实际调用的是WinRAR, 然后由WinRAR负责把压缩包解压, 此时的压缩包纯粹是一堆冗余很小的数据;
 类似的, 我们的软件用压缩的方式加壳时,我们先要写压缩算法, 然后对其加密, 然后我们点击要运行的程序时, 我们其实调用的是那个解壳程序, 由它来把真正的程序加载; 但是要申明一点, 我们这里的压缩不仅在算法上可能不同于WinRAR, 其压缩也可能要分部分  

希望大家看过文章之后, 给点意见或建议, 我将万分感谢; 如果文章中有什么错误, 恳请各位大虾指正, 在此先说声谢谢;
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值