老文章档案 · 2003 年

使用KERNEL32.DLL破解???

网络学院 · 破解文章 · 2003-09-19 · 作者:DDXia[CCG] · 出处:赢政天下整理收藏

介绍:

在Internet上有一个非常出色的游戏。。。Subspace,by VIE(Virgin),(DDXia:好象没有听过)

最近刚拿到它的零售版,。。。。 零售版程序中含有CRC检查和内存驻留(时时检查)(DDXia:好怕怕哦)

我们应该如何CrAck???

工具:

Winice 3.22

Hiew 5.66

W32Dasm 8.9 (Regged helps)

API 知识 (有Win32.Hlp 就行)

游戏的 URL/FTP

http://subspace.vie.com/

教学

SubSpace,是一个已经发布了一段时间的在线游戏。在玩游戏过程很难作弊。。。这就是运行它的乐趣,

但不会玩这个游戏。现在游戏发行了零售版,在其中加入了CD-Check。。。啊哦!!来,坐下来开始CRACK,

如果你有零售版,你会发现游戏提示"请插入CD....",并带有时间限制....哈哈~~~~~~....但有点我懂啦....

于是进入Winice。(DDXia:真是聪明!!)

BPX GetDriveTypeA (DDXia:一般,寻找CDROM都是使用这个API)

捕获、进入SubSpace的代码中....这个程序的CDCHEK步骤如下:(DDXia:重点之一,具有普遍性)

查CDROM的驱动器号-----------------------------GetDriveTypeA

获取CD的空间--------------------------------------GetDiskSpaceFreeA

如果等于零,那肯定是CD。

获取CD的标签 -------------------------------------GetVolumeInformationA

如果标签=='SUBSPACE' 那么 CD OK

打开 CD根目录的'INTRO.FLC'。 ---------------CreateFileA

如果存在, 那么 CD OK

获取INTRO.FLC的大小---------------------------GetFileSize?

比较它的大小

如果相等,就设一个标志。

既然大多数人读了这篇文章也不会去CRACK它,所以对原代码不会在这里贴出来。但最有趣的部分,也就是关键,

是如何绕过检测部分。我们可以通过HIEW来修改跳过,但有CRC 校验检测会中断程序,那么再补丁CRC检测,

可是内存中的还有动态校验....真的很难debug,在Winice中需要修改的断点就有0CCh(DDXia:换算过来就是204处,

哇!!我倒。。。。。。).....该怎么办呢??恩,考虑一下API Hooking,看来没有什么希望。再想一想,

.......TSR Crack!但是这可不是DOS环境啊!在Window中没有 AX=25XX, INT 21h功能,那么哪里是突破口呢?

.......YEAH !Windows的本身。

有了这个想法,于是到IRC中发表(DDXia:外国的Cracker非常喜欢到IRC中交流),但是这个想法就好象

自己准备去修理一颗核弹,和内核玩简直就是发疯了(DDXia:呵呵~~~~~我还是非常欣赏他的冒险精神和创

造力)我们知道在SubSpace保护程序中,第一次调用的API是 GetDriveTypeA,这个API返回一个数值,

2代表软驱,3代表硬盘,5代表CDROM,(至于其他的数值,我们不关心).....实际上,我们要象FAKECD

程序那样攻击它的保护....当用TSR模拟一个CD的时候,我们在硬盘中模拟那些必需的文件。

在Winice中,输入:

U GetDriveTypeA (DDXia:俺孤漏寡闻,可是第一听说这样用U命令啊!!!牢记在心!哈哈~~~~,

又学到一招)

将看到API被反汇编过的代码......下面的代码是其中的一部分,也可以静态反汇编kernel32.dll。但你看到的程序,

会有些莫名其妙的比较后,使用JMP跳转到其他的API:

(DDXia:也许代码部分会有不一样,那是因为kernel32.dll版本不同)

:BFF777C4 57 push edi

:BFF777C5 6A21 push 00000021

:BFF777C7 2BD2 sub edx, edx

:BFF777C9 68EFE2F9BF push BFF9E2EF

:BFF777CE 64FF32 push dword ptr fs:[edx]

:BFF777D1 648922 mov dword ptr fs:[edx], esp

:BFF777D4 8B7C2414 mov edi, dword ptr [esp+14]

:BFF777D8 0BFF or edi, edi

:BFF777DA 7407 je BFF777E3

:BFF777DC 2BC0 sub eax, eax

:BFF777DE 8D48FF lea ecx, dword ptr [eax-01]

:BFF777E1 F2 repnz

:BFF777E2 AE scasb

* Referenced by a Jump at Address:BFF777DA(C)

|

:BFF777E3 648F02 pop dword ptr fs:[edx]

:BFF777E6 83C408 add esp, 00000008

:BFF777E9 5F pop edi

:BFF777EA E9E5D4FFFF jmp BFF74CD4

在这个程序中,我们如何放入自己的代码呢?!?在JE处设BPX,结果是它会不断被中断。所以

BPX BFF777DA,然后运行 Explorer或者某些程序就会被BPX中断。你将看到什么都不做,也会中断!

所以我们敢肯定(这主要因为是微软写的代码)这段程序有点垃圾......让我们修改和优化它:

(游戏中第一次调用是检查C:)

:BFF777C4 57 xor edx,edx ; 标志位

:BFF777C5 6A21 mov eax,[esp] ; 得到正在调用的程序的地址

:BFF777C7 2BD2 cmp eax,413e6e ; 是否是游戏的CD-CHECK

:BFF777C9 68EFE2F9BF jnz BFF777EA ; 如果不是,继续

:BFF777CE 64FF32 mov [esp+4],eax ; 保存返回地址

:BFF777D1 648922 pop eax ; ESP+4

:BFF777D4 8B7C2414 mov eax,5 ; 返回5,表示我们是CDROM

:BFF777D8 0BFF ret

:BFF777DA 7407 je BFF777E3 ; 微软代码

:BFF777DC 2BC0 sub eax, eax ; 这里!

:BFF777DE 8D48FF lea ecx, dword ptr [eax-01]

:BFF777E1 F2 repnz

:BFF777E2 AE scasb

* Referenced by a Jump at Address:BFF777DA(C)

|

:BFF777E3 648F02 pop dword ptr fs:[edx]

:BFF777E6 83C408 add esp, 00000008

:BFF777E9 5F pop edi

:BFF777EA E9E5D4FFFF jmp BFF74CD4

你能看到,我们非常暴力的截取了这个API........每一次调用,我们都去 检查是否是被游戏调用.......非常简单!

现在我们欺骗它C:就是CDROM,我们再到磁盘剩余空间的检查:

(原程序和上面的很相相似,但也是很多垃圾....谁能解决?因为这段程序是大了点.....下面是新的改良过的

程序!)

(DDXia:不过在NT中就没有怎么多的程序废话了,比较紧凑,WIN98没有看过是如何的?)

:BFF778C5 2BD2 xor edx,edx ; 好象所有的微软都喜欢这代码呢?

:BFF778C7 68B8E2F9BF mov eax,[esp] ; 得到正在调用的程序地址

:BFF778CC 64FF32 cmp eax,491E22 ;是否是 SubSpace?

:BFF778CF 648922 jnz BFF77900 ;如果不是,继续

:BFF778D2 8B4C240C add esp,14h ; 修改堆栈,保证返回正常

:BFF778D6 E302 mov [esp],eax ; 返回指针

:BFF778D8 8A01 mov [esp+18],eax ; 这里是空间大小返回。(DDXia:我觉应该是edx,

而不是eax,也许是笔误)

:BFF778DA 8B4C2410 ret ; 返回

:BFF778DE E302 jcxz BFF778EA ; 剩下的代码不变

:BFF778E0 8B01 mov eax, dword ptr [ecx]

:BFF778E2 8B4C2414 mov ecx, dword ptr [esp+14]

:BFF778E6 E302 jcxz BFF778EA

:BFF778E8 8B01 mov eax, dword ptr [ecx]

:BFF778EA 8B4C2418 mov ecx, dword ptr [esp+18]

:BFF778EE E302 jcxz BFF778F2

:BFF778F0 8B01 mov eax, dword ptr [ecx]

:BFF778F2 8B4C241C mov ecx, dword ptr [esp+1C]

:BFF778F6 E302 jcxz BFF778FA

:BFF778F8 8B01 mov eax, dword ptr [ecx]

:BFF778FA 648F02 pop dword ptr fs:[edx]

:BFF778FD 83C404 add esp, 00000004

:BFF77900 E954D5FFFF jmp BFF74E59

这样看来,我们截获这段程序,同时强迫它返回磁盘剩余空间为零,C:象个CDROM.......现在剩下的就是标签检

查和文件检查.......这样简单,修改C:的标签为SUBSPACE,和还使用一小段ASM编的程序,我们编个大小为

37,433,486的文件..然后修改KERNEL32.DLL,重新启动。不停的画十字架吧,企求不要系统崩溃吧!!

后语:

这是非常有趣的CRACK的一种方法.....不过我从来没有看见任何一个人使用这种方法,也许是因为它太

冒险,同时还有一个兼容性的问题。我主要是想交流我发现的想法,(DDXia:YEAH!Crack的精神

所在,不断的探索和传播)也许在未来会考虑这种技术.....这主要的问题是修改了 KERNEL32.DLL,因为

它有许多的版本。如果Patch 所有的版本那简直就是发疯了。

非常惊奇的是无论DOS走多远, its roots still follow us in cracking!(DDXia:这句太难翻译了)

丁丁虾再说几句:(暴力法-----Crack第一式,牢记 EB----JMP,跳过、跳过、再跳过)

的确,有些疯狂,但他思考的方式和他的自创力都是值得学习!翻译的目的是希望大家能比较深层

的思考问题。

(丁丁虾长长地、长长地吐了一口气)终于完成翻译了!请多多指教!拜托啦!好久好久都没有

写过什么东东了!就当给大家的一份小小小的礼吧!!!现在凌晨1:00 还差10分钟。该收工了!

相关资讯:

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)|

广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright (C) 1998-2004 winzheng.com All Rights Reserved.

特别感谢 蓝芒科技 提供下载站及论坛服务器

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史