文章名称:hellfire2000破解过程及注册机的编写(上)
作者:夜月
e_mail:luoyi.ly@yeah.net
oicq:36606500
目的:帮助和我一样的广大初学者。
软件名称:hellfire2000
软件简介:很酷的屏幕保护软件。与流行的那些几张图片换来换去的屏保完全不同。它可以完全让你的桌面“燃烧”
起来,还有很逼真的背景音效。如果能再加上一点嗅觉的刺激的话,呵呵...你可能真的会以为你的宝贝
compute烧起来了呢!
保护分析:1.时间保护分析:
该软件把它的时间信息保存在:
[HKEY_CLASSES_ROOT\AppID\HCB1CD94CF]下,(埋得好怪呀!呵呵..)过期后,将该键删除,就可以
继续使用了。
2.注册保护分析:
在它的设置项里面就有三个输入框,分别是输入:user name,company,reg.key.用trw2000的万能中断
hmemcpy+pmodule很容易找到关键的比较处。它会先判断reg.key的长度是否为偶数,不是的话直接出
错。是的话,再继续判断是否为12位数字。不是的话,又是直接出错,而且它的这个判断和平常我们常
见的用ecx计数的判断不同(下面我会提到),只有过了这两关,才能到达计算注册码的核心代码处。
算出来的注册吗以两位一组的形式和你输入的reg.key比较,而且是数字比较,不是ascii码比较。用
d命令不能直接在内存窗口的右边看到注册码。它以整数的形式存放在左边。
注册成功后,注册信息保存在:
[HKEY_CURRENT_USER\SOFTWARE\FP SOFTWARE\HELLFIRE-2000\HELLFIRE\CONFIG]下的:
LicenseCompany
LicenseKEY
LicenseUSER
三个键中。删除后程序又可以重新注册。
3.程序自我保护分析:
我曾试图用暴力破解法改动一个字节使程序注册,(具体地点后面我会提到)但是第二次程序运行时,
提示我:可执行文件被修改。小弟功力不够,不能够破解这个“地雷”,那位大虾有兴趣帮小弟一把,
小弟感激不尽!
教程正文:
1.输入注册信息:
user name:luoyi
company: upc
reg.key: 654321
2.用trw2000跟踪,可找到如下代码:
:00405EAA C784249400000000000000 mov dword ptr [esp+00000094], 00000000
:00405EB5 E806FDFFFF call
00405BC0 <---------CALL1
:00405EBA 83C40C
add esp, 0000000C
:00405EBD 85C0
test eax, eax
:00405EBF 0F84FD000000 je 00405FC2
:00405EC5 8D4C2410
lea ecx, dword ptr [esp+10]
:00405EC9 E8620B0000 call
00406A30 <---------CALL2
:00405ECE 85C0
test eax, eax
:00405ED0 0F84EC000000 je 00405FC2
:00405ED6 53
push ebx
可以看出:程序有两个子程序来判断注册码的正确与否。可是,就我跟踪的结果来看,好像只有
CALL1起了判断作用。好了,用F8跟入CALL1,继续跟踪,会看到如下代码:
:00405BE6 6800010000 push
00000100
:00405BEB 50
push eax
:00405BEC 51
push ecx
:00405BED E8DEFDFFFF call
004059D0 <----------CALL3
:00405BF2 83C40C
add esp, 0000000C
:00405BF5 83F806
cmp eax, 00000006 <-----------reg.key的位数比较
:00405BF8 7417
je 00405C11
大家看到了吧,一般的长度比较,都是用ecx作计数器来进行的,可是这个程序有点不一样,它是把
长度的一半作为比较依据。(小弟在此耗时1个小时,才搞清楚eax是什么东东,5555...真丢人!)
OK!长度的地雷已经排除了,下面进入正式的注册码计算阶段:
:00405C6F 6A06
push 00000006
:00405C71 51
push ecx
:00405C72 E869FCFFFF call
004058E0 <---------关键算法所在处
:00405C77 83C40C
add esp, 0000000C
:00405C7A 85C0
test eax, eax
:00405C7C 752B
jne 00405CA9
大家千万不要被这个TEST EAX,EAX所迷惑,在这个关键算法的CALL里,出口的EAX总是为1。也就是
说,程序在此总是会往下面跳,跳到哪?呵呵....当然就是下面的这一段关键比较了:
:00405CA9 33C0
xor eax, eax
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405CBE(C)
|
:00405CAB 8A540408
mov dl, byte ptr [esp+eax+08] --------------------
:00405CAF 8A8C0408010000 mov cl, byte ptr
[esp+eax+00000108]
:00405CB6 3AD1
cmp dl, cl <-----------看到注册码的比较了吗?
:00405CB8 75C4
jne 00405C7E
:00405CBA 40
inc eax
:00405CBB 83F806
cmp eax, 00000006 循环6次,正好比完12位数,只要有一个
:00405CBE 72EB
jb 00405CAB 不对,就...嘿嘿....------------------
:00405CC0 8D4C2400
lea ecx, dword ptr [esp]
:00405CC4 C7842410020000FFFFFFFF mov dword ptr [esp+00000210], FFFFFFFF
:00405CCF E8F10A0100 call
004167C5
:00405CD4 8B8C2408020000 mov ecx, dword
ptr [esp+00000208]
我在开始的时候说的改动一个字节注册,到了这时候,大家应该都明白了吧?就是把405CB8处的JNE
改成JE就OK了!可惜....呵呵...不过,这点困难还难不到我们,我们既然找到了关键算法的CALL
那我们能不能写出注册机呢?(其实,这个时候,在内存窗口已经可以看到注册码了)。
出于长度的原因,软件的算法分析及注册机的编写我就写到这篇文章的(下)中去了!
- 标 题:hellfire2000破解过程及注册机的编写(上) (4千字)
- 作 者:夜月
- 时 间:2001-1-19 10:49:16
- 链 接:http://bbs.pediy.com