1. 我刚接触破解,不明白甚么是 CrackMe ,还有 KeygenMe , ReverseMe , UnpackMe,他们是甚么 ?
ans:
他们都是一些公开给别人尝试破解的小程序,制作 crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 cracker,想挑战一下其它 cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破。
KeygenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳
2. 制作一个 crackme 需要甚么 ? 有甚么要注意 ?
ans:
编写Crackme 的语言没有限制,常见的有 C, C++ , VB, Delphi, ASM 等等,只要写出一个可以给玩家注册的程序,并检查他的注册作出反应便可以。一般 crackme 应可以在 win98, 2k, xp 下运行,如果 crackme需要某一些 dll 或补助檔,应该一起提供
Crackme 中可以使用输入序号的方式, keyfile ,或是其它创新的方法来获得注册序号,主要的原则是 Crackme 使用的技巧是可以应用在现实的软件保护,或可用于共享软件的注册程序。如果一个 Crackme 的破解难度高,并且它的技术可以容易实现于现实的软件应用上,这种 Crackme 被视为很有价值的 crackme
3. 为甚么建议 crackme 不加壳 ?
asn:
如果每一个 crackme 制作者都为了提高 crackme 的强度,而使用了一些商业软件的猛壳,我们破解 crackme 便需要花时间精力在脱壳上了。而且,加壳的动机是不利于研究 crackme 的设计和强度,也不利于兄弟们互相交流破解 crackme 的过程和心得。
Crackme 的真正强度在于设计者的原程序,而不是依靠壳,如果一个 crackme 没有加壳也能够把大部份的人难倒,这才是真正的强 crackme 。
4. 我的设计很独特,我想所有人都来试试,可是没有人理会我,为甚么 ?
ans:
破解 crackme 和破解其它软件一样,是个人的喜好,不可以强迫。如果兄弟们对你的 crackme 感兴趣,便会下载尝试,这是出于自愿的,一些 crackme 的设计是十分普遍,可能提不起一些老手的兴趣,一些新手下载了,却没有成功破解,结果是没有人回复,一些 crackme 的设计比较复杂或特别,可能大家都在观察,等待破解方法公开,没有人愿意花时间亲自研究。
【入门术语简介】
(更详尽的资料,请参考看雪论坛精华,或看雪的书籍)
加壳 : 表示程序的 exe 被一层外壳保护,这层外壳是一些软件保护公司 (或一些高手) 设计出来的,可以把 exe包裹起来,在 exe 执行时提供保护,对抗破解者
爆破 : 意思是透过修改程序,来达到破解目的,主要方法包括,修改重要跳转指令 (jmp, jz, jzn, 等等)
花指令 : (junk code) 意思是程序中有一些指令,由设计者特别构思,希望使反汇编的时候出错,让破解者无法清楚正确地反汇编程序的内容,迷失方向。经典的是一些跳转指令,目标位置是另一条指令的中间,这样在反汇编的时候便会出现混乱。花指令有可能利用各种 jmp, call, ret, 一些堆栈技巧,位置运算,等等
SMC : (self-modifying code) 意思是自我修改的代码,使程序在运行时自我修改,用途包括:
- 使一些重要的跳转位置爆破无效化 (以 smc 对重要位置进行覆写)
- 使一些重要代码隐藏 (在必要时才实时产生重要代码段,防止程序被人静态分析,也防止一些透过搜寻的破解方法)
自校验程序 : 意思是这些程序会检查自己有没有被修改,如果发现被修改的话,便会离开或进行其它动作。基本的校检方法包括 checksum, 检查大小, 检查跳转代码,等等
自调试程序 : 意思是这些程序会扮演调试器的角色,调试自己重要的部份,让破解者无法用调试器进行破解 (因为一个程序只可以被一个程序调试)
SEH : (structured exception handling) 是一种处理程序异常的机制,当程序异常 (例如除零异常,非法存取异常,等等) 发生的时候,系统便会把执行位置切换到thread 的 exception handler。一些程序会透过 SetUnhandledExceptionFilter( ) 来设定 thread 的最高层异常处理 (代替 windows 提供的那一个错误信息),再制造异常,来达到扰乱调试的效果
RSA : 是一套加密技术 (public key infrastructure),它被广泛应用于各种层面,由一对密钥 (public key 和 private key) 的组合,提供安全的资料加密
Symmetric encryption : 对称加密,意思是加密和解密的 secret key 是相同的,例如 DES, AES, Blowfish
Asymmetric encryption : 非对称加密,是Symmetric encryption 的相反,例如 RSA
PE format : (Portable Executable) 意思是指 Windows 中 exe 的格式
IAT : (Import Address Table),是 PE 结构里重要的一部份,用途是存放 API 位置,让程序中的呼叫可以透过它的位置来使用各个系统API 和 dll 的 export functions。一个 exe 的 IAT 里是并没有实际位置的,这些位置由系统加载 exe 的时候实时填上
RVA : (Relative Virtual Addresses) 在 PE 格式中,有很多不同的区块需要定位,但是不可以指明一个绝对位置,所以 PE 里使用了 RVA。RVA 是一个相对于 Base address (基底位置) 的值,例如一个 PE 被载入到 0x400000,这个 PE 有一个区块的RVA 是 0x1000,那么这个区块在内存的实际位置便是 0x401000
VA : (Virtual Address) 内存虚拟空间中的一个位置,在 PE 描述中的意思是 : PE 被载入后,区块在内存的确实位置
Offset : 意思是偏移值,通常用于指明一个位置,它的用法是把一个基底位置加上 offset 值 (offset 可以是负数)。 例如我们说 : 一个资料结构在内存中的位置是 0x125000,它的 offset 0x10 处是用户名字, offset 0x14 是用户序号。在 PE 结构中, offset 通常用于指明在 exe 档案中的实际位置
dump : 意思是把内存中正在运行的 PE 整个抄下来,储存成另一个 exe file。这种做法可以把程序执行的某一刻保留,例如在 IAT 建立完成后。dump 是脱壳的一个基本步骤.