飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6964|回复: 6

[转贴] 标志位法完美破解光驱伴侣

[复制链接]

该用户从未签到

发表于 2006-11-26 14:55:23 | 显示全部楼层 |阅读模式
前些日子在看学论坛的时候发现了一篇利用标志位法破解加密狗的文章,看完之后感觉大有帮助,于是就想找一个软件试试手。正巧在网上发现了这款小巧的软件——光驱伴侣2005,而且更巧的是这个软件利用标志位法就可以很轻松的破解,于是在一阵喜悦之后便写下了这篇文章,一起来分享成功的喜悦吧。


软件介绍
光驱伴侣2005是一款小巧的光驱辅助工具,它可以通过简单的快捷键来轻松自如的切换光驱的打开与关闭。但是到你要真想用它的时候,却发现它是一个注册软件,在你没有注册本软件之前,你只可以使用20次。如果到了使用的时间,软件将禁止你使用它的所有功能。所以只有输入正确的注册码后我们才可以使用它,于是便想到了自己动手破解。

破解方法介绍
破解软件的常用方法一般有两种:动态破解和静态破解。前者主要用到的软件有:TRW2000,SoftICE和Ollydbg,静态的一般我们常用的就是W32Dasm。今天我们破解用到的就是第二种方法:静态破解。
光驱伴侣2005在注册上有个最大的特点:在输入注册码后不弹出任何的错误提示,按“确定”后自动退出,在这种情况下一般的破解思路是对注册表的相关键值下断点。但是我试过这个方法,它的破解思路太烦琐,不易被初学者掌握。所以,我今天就为大家带来一种非常简单,一学就会的破解方法——标志位法。
标志位法可以这样的解释:使用全局变量作为软件注册成功与否的标志,一般是在地址中存入1和0,当返回值为1时代表注册成功;相反如果返回值为0的时候代表注册失败。那么这个内存中的地址就被称作标志位。当程序运行的时候,初始化值为0,读取Windows 注册表或*.ini文件中的信息后,判断软件是否注册成功。在大部分的时间里我们都是在关心一些跳转,结果是往往事与愿违。所以,大家熟练的掌握标志位法,对我们以后的破解会有很大的帮助。
接下来我们来看看标志位的赋值语句:
mov dword ptr [xxxxxxxx] , 00000001
mov dword ptr [xxxxxxxx] , 00000000
mov dword ptr [xxxxxxxx] , EAX
mov dword ptr [xxxxxxxx] , EDX
了解了标志位的赋值语句,我们一般可以在W32Dasm中搜索xxxxxxxx,这样就可以很容易地找到破解的关键了,下面我们就以破解光驱伴侣2005为例,为大家详细的介绍标志位法的破解。

破解过程
在破解之前我们首先要了解一下软件的注册流程。启动程序,单击鼠标右键,选择“现在注册”,在打开的注册窗口中随便输入用户名和注册码,如图1所示。

图1
确定它并没有弹出我们所期待的注册码错误的提示,而是一声不响地退出了。不知你发现了没有,这个软件是有时间限制的,那我们就把软件的时间全部用完,然后再一次启动程序。怎么样?这时候是不是弹出了一个提示框?
进入软件后,再单击鼠标右键,发现所有的功能菜单也变成灰色的了。
我们这个提示框下手。在用W32Dasm静态分析前,我们还是用PEID查看一下软件是否被加壳,
经检查软件是用UPX加壳,为了不耽误时间,我在这里就不用手动脱壳了,有兴趣的朋友可以自己试试了。在这里我用专门的脱壳工具——winupxshell自动脱壳,脱完后再用PEID看一下,脱壳成功。
现在我们就可以用W32Dasm对脱壳后的软件进行静态分析了。还是老一套,在菜单栏中点击“参考——串式数据参考”,在弹出的窗口中找到提示软件使用期限到的语句。
双击它,来到此处:
* Possible StringData Ref from Code Obj ->"软件试用次数已到 请购买注册"
|
:004BD3F8 B804D64B00 mov eax, 004BD604
:004BD3FD E8E6E1F7FF call 0043B5E8
:004BD402 E98F000000 jmp 004BD496 如果跳走,显示错误提示。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD3C2(C) 跳转代码
| 以下代码将执行没有过期的功能

* Possible StringData Ref from Code Obj ->"UserDefineHotKey"
|
:004BD407 68B8D54B00 push 004BD5B8

* Reference To: KERNEL32.GlobalAddAtomA, Ord:0000h
|
:004BD40C E80797F4FF Call 00406B18
:004BD411 0FB7C0 movzx eax, ax
:004BD414 2D00C00000 sub eax, 0000C000
:004BD419 898334030000 mov dword ptr [ebx+00000334], eax
:004BD41F 6A7A push 0000007A
:004BD421 6A02 push 00000002
:004BD423 8B8334030000 mov eax, dword ptr [ebx+00000334]
:004BD429 50 push eax
:004BD42A 8BC3 mov eax, ebx
:004BD42C E86FB7F8FF call 00448BA0
:004BD431 50 push eax
在离这段错误提示代码不远处有一个跳转004BD3C2(C),找到这个跳转的代码:
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD2F7(C), :004BD31D(C) 还有两个重要的跳转!!!
|
:004BD3A4 68AC260000 push 000026AC
:004BD3A9 B9F0D44B00 mov ecx, 004BD4F0

* Possible StringData Ref from Code Obj ->"setting"
|
:004BD3AE BAFCD44B00 mov edx, 004BD4FC
:004BD3B3 A15C1D4C00 mov eax, dword ptr [004C1D5C]
:004BD3B8 8B30 mov esi, dword ptr [eax]
:004BD3BA FF5608 call [esi+08]
:004BD3BD 3DC0260000 cmp eax, 000026C0 比较是否到期
:004BD3C2 7C43 jl 004BD407 这句就是跳转代码
:004BD3C4 33D2 xor edx, edx
:004BD3C6 8B83F0020000 mov eax, dword ptr [ebx+000002F0]
:004BD3CC 8B08 mov ecx, dword ptr [eax]
:004BD3CE FF5164 call [ecx+64]
:004BD3D1 33D2 xor edx, edx
:004BD3D3 8B83F4020000 mov eax, dword ptr [ebx+000002F4]
:004BD3D9 8B08 mov ecx, dword ptr [eax]
:004BD3DB FF5164 call [ecx+64]
:004BD3DE 33D2 xor edx, edx
:004BD3E0 8B8304030000 mov eax, dword ptr [ebx+00000304]
:004BD3E6 E8856BF9FF call 00453F70
:004BD3EB 33D2 xor edx, edx
:004BD3ED 8B8308030000 mov eax, dword ptr [ebx+00000308]
:004BD3F3 E8786BF9FF call 00453F70
但是当我们把“004BD3C2 7C43 jl 004BD407”这段代码改成直接跳转后,还是显示使用期限已到的提示。说明在这个跳转的前面还应该有跳转,我们在这段代码的前面几行发现了有两个跳转可以直接跳到这里:004BD2F7(C), :004BD31D(C),那我们就索性就到前面看个究竟:
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD29E(C), :004BD2C7(C)
|
:004BD2F3 807DFB00 cmp byte ptr [ebp-05], 00
:004BD2F7 0F85A7000000 jne 004BD3A4 这是其中的一个,但并不启作用。
:004BD2FD 8D45B0 lea eax, dword ptr [ebp-50]
:004BD300 50 push eax
:004BD301 B903000000 mov ecx, 00000003
:004BD306 BA07000000 mov edx, 00000007
:004BD30B 8B45FC mov eax, dword ptr [ebp-04]
:004BD30E E84D76F4FF call 00404960
:004BD313 8B45B0 mov eax, dword ptr [ebp-50]
:004BD316 E86DF9FFFF call 004BCC88
:004BD31B 84C0 test al, al 进行比较
:004BD31D 0F8481000000 je 004BD3A4 这才是我们要找的那个关键跳转,如果不跳走就失败
:004BD323 33D2 xor edx, edx
:004BD325 8B831C030000 mov eax, dword ptr [ebx+0000031C]
:004BD32B E8406CF9FF call 00453F70
我们可以从这段代码清楚地发现为什么刚才修改了最初的那个跳转并没有成功。那是因为如果“004BD31D 0F8481000000 je 004BD3A4”这个跳转如果不跳,就会来到下面的代码:
* Possible StringData Ref from Code Obj ->"光驱伴侣2005 3.0"
|
:004BD390 BAE8D54B00 mov edx, 004BD5E8
:004BD395 A1641D4C00 mov eax, dword ptr [004C1D64]
:004BD39A E88550F8FF call 00442424
:004BD39F E9F2000000 jmp 004BD496这里跳走就出错!!
现在我们是不是就明白当初为什么会失败了?因为当我们执行了“004BD39F E9F2000000 jmp 004BD496”这个跳转就已经失败了。
通过上面的分析我们已经找到了暴破的方法了:
将:004BD31D 0F8481000000 je 004BD3A4改为:
:004BD31D 0F8581000000 jne 004BD3A4
将004BD3C2 7C43 jl 004BD407改为:
004BD3C2 EB43 jmp 004BD407
经过这样的修改后,软件已不在有时间和任何功能上的限制了。
似乎到这里破解的工作应该结束了,可是大家该问到了,还有没有更简单的破解方法哪?有!
我们可以这样设想一下:为什么jmp 004BD496会失败呢?我们看看代码就知道了:
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD39F(U), :004BD402(U)
|
:004BD496 33C0 xor eax, eax 这里eax已经为0
:004BD498 5A pop edx
:004BD499 59 pop ecx
:004BD49A 59 pop ecx
:004BD49B 648910 mov dword ptr fs:[eax], edx
:004BD49E 68C0D44B00 push 004BD4C0
从“004BD496 33C0 xor eax, eax”这段代码我们知道,它其实是在为标志位赋值,经过转换,eax的值为0,通过我们一开始的介绍,大家应该知道失败的原因了吧?大家一定会想到,我们可以将eax的值转换为1不就行了?对,这也就是标志位法的关键,也就是我今天破解这个软件的关键。为了让大家更好的了解标志位,我们还是看一下这段代码,那样你会更好地了解什么是标志位了。
* Reference To: user32.RegisterHotKey, Ord:0000h
|
:004BD462 E8719EF4FF Call 004072D8
:004BD467 68AC260000 push 000026AC
:004BD46C B9F0D44B00 mov ecx, 004BD4F0

* Possible StringData Ref from Code Obj ->"setting"
|
:004BD471 BAFCD44B00 mov edx, 004BD4FC
:004BD476 A15C1D4C00 mov eax, dword ptr [004C1D5C]
:004BD47B 8B18 mov ebx, dword ptr [eax]
:004BD47D FF5308 call [ebx+08]
:004BD480 40 inc eax 执行注册成功的关键
:004BD481 50 push eax
:004BD482 B9F0D44B00 mov ecx, 004BD4F0
这段代码是执行注册成功的关键代码段,其中起决定性作用的就是“004BD480 40 inc eax”这条语句。它的意思就是将eax加1,最初eax的值为0,那么现在它的值为1了,这样程序在执行到后面的时候标志位为1,所以注册成功。
通过刚才的分析我们不用修改任何的跳转,只要在“004BD496 33C0 xor eax, eax”这段代码的下面加一句“004BD498 40 inc eax”就大功告成了,是不是很简单?
PYG19周年生日快乐!

该用户从未签到

发表于 2008-9-19 11:22:54 | 显示全部楼层
楼主说的很详细啊,谢了
PYG19周年生日快乐!

该用户从未签到

发表于 2008-9-19 11:31:17 | 显示全部楼层
先支持一个,再看LZ作品
PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2017-10-30 11:22
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2008-9-19 23:44:12 | 显示全部楼层
    先下载下来试一下行不行
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-9-20 20:00:37 | 显示全部楼层
    标志位,学习了/:good
    PYG19周年生日快乐!
  • TA的每日心情

    2022-11-12 10:37
  • 签到天数: 305 天

    [LV.8]以坛为家I

    发表于 2008-9-21 17:37:11 | 显示全部楼层
    标志位/:010 /:010 /:010 有点难
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-9-22 12:47:17 | 显示全部楼层
    先支持一下.多谢了.哥们你真好.
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表