首页
社区
课程
招聘
[旧帖] [讨论]最近着手一个软件,请大家帮着看看那里是关键点? 0.00雪花
发表于: 2007-7-31 16:15 9064

[旧帖] [讨论]最近着手一个软件,请大家帮着看看那里是关键点? 0.00雪花

2007-7-31 16:15
9064
最近忙着破解的一个软件,折腾好久没有找到突破点,还请大伙指点指点!
软件名称:医学三基考试宝典(护士)2.0

下载地址:http://download.it168.com/09/0905/78098/78098_3.shtml

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
先脱壳(ASP),再跳转就可以了。
2007-8-1 11:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我这儿有做好的一个,需要的话可以发给你
2007-8-1 11:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢sunshine胡,请发送到:ochotona@126.com。
还有我想知道你是如何做的?
2007-8-2 09:20
0
雪    币: 1355
活跃值: (339)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
5
安装好原程序后,拿这个覆盖上去就OK了。
怎么改?呵呵,低级的技术了。脱壳后直接找关键字眼,顺藤摸瓜找到关键跳,直接NOP或者改
相反的,功能就打开了。这个软件也许我的一个朋友,她也学护理的,呵呵,说不定能用上
啊。  气死我了,网速突然太慢了。传不上来,等等,好东西等会再发上来。

第一处:试题查找功能开启
00544BE0   .  E8 8BFDFFFF   call    00544970
00544BE5   .  84C0          test    al, al
00544BE7   .  74 1B         je      short 00544C04
00544BE9   .  C783 4C020000>mov     dword ptr [ebx+24C], 1
00544BF3   .  EB 0F         jmp     short 00544C04————————————这里是我已经改好的了
00544BF5   .  B8 344C5400   mov     eax, 00544C34                    ;  软件注册后才能使用试题查找功能
00544BFA   .  E8 A5D4F9FF   call    004E20A4
00544BFF   .  E8 FCE2FFFF   call    00542F00
00544C04   >  33C0          xor     eax, eax

第二处:模拟考试功能开启
0058A5C0   .  E8 E7F3FFFF   call    005899AC
0058A5C5   .  84C0          test    al, al
0058A5C7   .  74 1B         je      short 0058A5E4
0058A5C9   .  C783 4C020000>mov     dword ptr [ebx+24C], 1
0058A5D3   .  EB 0F         jmp     short 0058A5E4————————————这里是我已经改好的了
0058A5D5   .  B8 54A65800   mov     eax, 0058A654                    ;  软件注册后才能使用模拟考试功能
0058A5DA   .  E8 C57AF5FF   call    004E20A4
0058A5DF   .  E8 1C89FBFF   call    00542F00
0058A5E4   >  33C0          xor     eax, eax

第三处:考试宝典功能开启
0058CC01   .  8945 EC       mov     dword ptr [ebp-14], eax
0058CC04   .  8B45 EC       mov     eax, dword ptr [ebp-14]
0058CC07   .  E8 C81FF5FF   call    004DEBD4
0058CC0C   .  84C0          test    al, al
0058CC0E   .  EB 0A         jmp     short 0058CC1A————————————这里是我已经改好的了
0058CC10   .  B8 F4CC5800   mov     eax, 0058CCF4                    ;  未注册版考试宝典不能察看此资料内容,请您注册。
0058CC15   .  E8 F64AF5FF   call    004E1710
0058CC1A   >  33C0          xor     eax, eax

第四处:注册成功标志打开
0058E5A4   .  E8 2B06F5FF   call    004DEBD4
0058E5A9   .  84C0          test    al, al
0058E5AB   .  90            nop————————————这里是我已经改好的了
0058E5AC   .  90            nop————————————这里是我已经改好的了
0058E5AD   .  8D45 F4       lea     eax, dword ptr [ebp-C]
0058E5B0   .  B9 44E65800   mov     ecx, 0058E644                    ;  [已注册]
0058E5B5   .  8B55 F8       mov     edx, dword ptr [ebp-8]
0058E5B8   .  E8 676EE7FF   call    00405424
0058E5BD   .  8B55 F4       mov     edx, dword ptr [ebp-C]
0058E5C0   .  8BC3          mov     eax, ebx
0058E5C2   .  E8 2DC1F2FF   call    004BA6F4
0058E5C7   .  EB 1F         jmp     short 0058E5E8
0058E5C9   .  8D45 F0       lea     eax, dword ptr [ebp-10]
0058E5CC   .  B9 58E65800   mov     ecx, 0058E658                    ;  [未注册]
0058E5D1   .  8B55 F8       mov     edx, dword ptr [ebp-8]
0058E5D4   .  E8 4B6EE7FF   call    00405424

完了

如此一来,管它注册不注册呢?呵呵,功能和外观跟注册码注册的没什么差别。只是手段太低劣了......
上传的附件:
2007-8-4 05:09
0
雪    币: 1355
活跃值: (339)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
6
呵呵,终于传上来了
2007-8-4 05:44
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
已破解完,这个其实很简单了。先脱壳,也可以不脱壳,找到相关关键点,就可以了。
2007-8-4 11:21
0
雪    币: 1355
活跃值: (339)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
8
冬天的雪,感觉风格挺象,呵呵。交个朋友吧!我是菜鸟
2007-8-4 19:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
爱琴海,呵呵,替换后可以使用,但是题目数量还是无法更改,就是模拟考试中的题量,是不是还没完全解密。
2007-8-6 11:33
0
雪    币: 1355
活跃值: (339)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
10
我也不清楚,谁有注册机?再看看
2007-8-8 01:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我在使用时,把题量改为100,开始后发现题量只有 8-9,是不是机器码的限制?
2007-8-8 08:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
软件在提取题目的时候还会进行是否注册的判断,如果未注册侧最多只能试做一题,在帮助中是写着的。可用如下方法破解:

1、所有功能开启
004DEBD4      40            inc     eax
004DEBD5      90            nop
004DEBD6      90            nop
004DEBD7      90            nop
004DEBD8      90            nop

2、多考题开启
0051D5F2      8B55 F8       mov     edx, dword ptr [ebp-8]         ;单选题功能开启
0051E372      8B55 F8       mov     edx, dword ptr [ebp-8]         ;多选题功能开启
005213AE      8B55 F8       mov     edx, dword ptr [ebp-8]         ;是非题功能开启
00521F72      8B55 F8       mov     edx, dword ptr [ebp-8]         ;名词解释功能开启
00522B22      8B55 F8       mov     edx, dword ptr [ebp-8]         ;填空题功能开启
0052823E      8B55 F8       mov     edx, dword ptr [ebp-8]         ;配伍选择题功能开启

需要软件的化我在传上来。
2007-8-9 22:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
alloha,把软件传上来啊,你很厉害,共同学习学习。
2007-8-10 00:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我权限不够,发到你的email吧。
2007-8-10 01:00
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
alloha真是高手,不过能不能写的再详细点,最好有破解思路和过程
2007-8-10 12:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我整理一下,争取今晚把过程传上来。
2007-8-10 13:34
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
发现所有考试宝典系列的软件都可以按alloha方法爆破,就是不知道怎么找到这些关键点的
我是用UE直接替换的:8B 55 E8 8B 45 FC 8B 08 FF 51 04 89 45 F0  -->8B 55 F8 8B 45 FC 8B 08 FF 51 04 89 45 F0,不过替换了14处,但软件运行无异常,^_^
2007-8-10 14:09
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
期待你的过程。。。

前面还忘了说一处替换E8 EB 01 00 00 C3-->40 90 90 90 90 C3用于所有功能开启,之前是解决题数限制的
2007-8-10 14:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
1、用PEid查壳,是ASPack2.12,寻找专用工具脱壳,我用的是AspackDie脱的。
2、试用软件,在试用软件的过程中,通过帮助注意到,未注册软件与为注册软件的一个区别是,未注册软件应用程序窗口顶部有[未注册]字样,已注册软件为[已注册],以此为突破口,破解对功能的限制。
3、使用W32dsm  反汇编exe 在其中搜索 “未注册”字样。来到如下代码处。

CODE:0058E5A4                 call    004DEBD4
CODE:0058E5A9                 test    al, al
CODE:0058E5AB                 jz      short 0058E5C9   ;如果al 为 0侧跳转未注册,如果al不
为 0 侧跳转已注册。
CODE:0058E5AD                 lea     eax, [ebp-0Ch]

* Possible StringData Ref from Code Obj -> “[已注册]”

CODE:0058E5B0                 mov     ecx, offset dword_58E644
CODE:0058E5B5                 mov     edx, [ebp-8]
CODE:0058E5B8                 call    sub_405424
CODE:0058E5BD                 mov     edx, [ebp-0Ch]
CODE:0058E5C0                 mov     eax, ebx
CODE:0058E5C2                 call    sub_4BA6F4
CODE:0058E5C7                 jmp     short loc_58E5E8
CODE:0058E5C9 ; ---------------------------------------------------------------------------

* Possible StringData Ref from Code Obj -> “[未注册]”

CODE:0058E5C9
CODE:0058E5C9 loc_58E5C9:                             ; CODE XREF: CODE:0058E5AB j
CODE:0058E5C9                 lea     eax, [ebp-10h]
CODE:0058E5CC                 mov     ecx, offset dword_58E658
CODE:0058E5D1                 mov     edx, [ebp-8]
CODE:0058E5D4                 call    sub_405424
CODE:0058E5D9                 mov     edx, [ebp-10h]
CODE:0058E5DC                 mov     eax, ebx
CODE:0058E5DE                 call    sub_4BA6F4
CODE:0058E5E3                 call    sub_542F00
CODE:0058E5E8
CODE:0058E5E8 loc_58E5E8:                             ; CODE XREF: CODE:0058E5C7 j

可见红色部分为是否注册的逻辑重点。

跳转到call    004DEBD4 地址为是否注册的关键函数,跳转到 004DEBD4 看看。
004DEBD4 proc near
call    004DEDC4
retn
sub_4DEBD4 endp

由此看来应用程序调用 004DEBD4 程序,通过该程序的反回值(存放于eax中,这里只使用了al第8位)来判断程序是否注册。

在W32dsm继续搜索“未注册”几个子,发现所有判断均是在 004DEBD4 函数调用后做出的,可见 004DEBD4 是程序注册判断的关键函数,只要该函数返回非零侧判断为已注册,因此只需简单的修改函数另其始终放回非零值即可。修改如下:

004DEBD4      40            inc     eax
004DEBD5      90            nop
004DEBD6      90            nop
004DEBD7      90            nop
004DEBD8      90            nop

eax 始终非零,有点偷懒了。运行一下看看,果然所有功能均可使用了,而且软件启动时也不会弹出注册窗口了。

但是,在使用过程中确发现模拟考试,及课后练习所有题形只有一题,故破解还不完全。分析原因:软件在未注册情况下仍然可以使用课后练习功能,同样每种题形只用一体,同时查看其帮助得知,在未注册情况下软件不会完全显示习题。为了保证处理的一致性,软件的作者应该是使用了两个函数分别处理软件功能是否可用的判断及课后练习及模拟考试习题是否完全显示的逻辑处理。因此对习题的处理必须重新查找切入点。

8、查找习题开启的切入点。
观察其安装后的目录结构,发现在Data 目录下存在文件 Maindb.db 文件,从文件的大小及命名上分析可知,Maindb.db就是该程序的数据文件。用记事本打开,果然存在数据表的定义,而且在安装目录下有这样一个dll : KSBAOSQL.dll ,喔!SQL,似乎存在SQL语句的处理。马上进入 W32dsm 搜索 “Select”字符串。果然存在许多Select语句。逐一查看所有Select语句。来到如下地址:

* Possible StringData Ref from Code Obj  “WHERE A.[StyleID]=%d %s ORDER BY RANDOM() LIMIT %d”
mov    ecx,   offset    0051D46C

* Possible StringData Ref from Code Obj  “Select …(不写了,自己看一下,偷个懒)”
mov    edx,   dword   ptr[00597AF4]

查询与测试相关的两个表 AllTest 及 ATest,AllTest是所有测试题,ATest似乎是A选项的测试题。然后以一个参数限制其选择的题目总数 LIMIT %d 。这不正式我们需要的吗。哈哈,似乎找到点线索了。继续向下看,更加吸引人的字符串出现了。
* Possible StringData Ref from Code Obj “正在生成题…”
0051D898    Mov ecx, 0051D9E8

好就这里了。打开OllyICE,装载应用程序,在 0051D898 下断点。F9运行,进入程序后打开“模拟考试功能”,将除单选题外的所有题目数量删除(可以降低分析的复杂性),单击“开始考试”。程序断在了0051D898  B9 E8D95100   mov   ecx, 0051D9E8处。
Alt+F9 执行到返回,程序定位到 0051D414   E8 87000000   call    0051D4A0
0051D4A0 该函数就是 单选题生成函数了。

在0051D414处下断,重新运行函数,进入 0051D4A0。喔,此时EDX寄存器指向的地址似乎与查询密切相关,在数据窗口中跟随该寄存器的值:
010E91D4  53 45 4C 45 43 54 20 41 2E 5B 41 6C 6C 54 65 73  SELECT A.[AllTes
010E91E4  74 49 44 5D 2C 41 2E 45 70 6C 49 44 20 41 53 20  tID],A.EplID AS
010E91F4  5B 41 6C 6C 54 65 73 74 5F 45 70 6C 49 44 5D 2C  [AllTest_EplID],
010E9204  41 2E 49 6D 67 49 44 20 41 53 20 5B 41 6C 6C 54  A.ImgID AS [AllT
010E9214  65 73 74 5F 49 6D 67 49 44 5D 2C 42 2E 5B 41 54  est_ImgID],B.[AT
010E9224  65 73 74 49 44 5D 2C 42 2E 5B 4D 61 69 6E 74 69  estID],B.[Mainti
010E9234  74 6C 65 5D 2C 42 2E 5B 41 5D 2C 42 2E 5B 42 5D  tle],B.[A],B.
010E9244  2C 42 2E 5B 43 5D 2C 42 2E 5B 44 5D 2C 42 2E 5B  ,B.[C],B.[D],B.[
010E9254  45 5D 2C 42 2E 5B 46 5D 2C 42 2E 5B 41 6E 73 77  E],B.[F],B.[Answ
010E9264  65 72 5D 2C 42 2E 5B 49 74 65 6D 4E 75 6D 5D 2C  er],B.[ItemNum],
010E9274  43 2E 5B 45 78 70 6C 61 69 6E 5D 20 46 52 4F 4D  C.[Explain] FROM
010E9284  20 5B 41 6C 6C 54 65 73 74 5D 20 41 20 49 4E 4E   [AllTest] A INN
010E9294  45 52 20 4A 4F 49 4E 20 5B 41 54 65 73 74 5D 20  ER JOIN [ATest]
010E92A4  42 20 4F 4E 20 41 2E 5B 54 61 62 6C 65 49 44 5D  B ON A.[TableID]
010E92B4  3D 42 2E 5B 41 54 65 73 74 49 44 5D 20 4C 45 46  =B.[ATestID] LEF
010E92C4  54 20 4A 4F 49 4E 20 5B 45 78 70 6C 61 69 6E 5D  T JOIN [Explain]
010E92D4  20 43 20 4F 4E 20 41 2E 5B 45 70 6C 49 44 5D 3D   C ON A.[EplID]=
010E92E4  43 2E 5B 45 70 6C 49 44 5D 20 57 48 45 52 45 20  C.[EplID] WHERE
010E92F4  41 2E 5B 53 74 79 6C 65 49 44 5D 3D 31 20 20 4F  A.[StyleID]=1  O
010E9304  52 44 45 52 20 42 59 20 52 41 4E 44 4F 4D 28 29  RDER BY RANDOM()
010E9314  20 4C 49 4D 49 54 20 31 30                       LIMIT 10

这就是我们希望的查询语句了,并且考题数目多少也是我们定义的数量(LIMIT 10),看来未注册时限制考题数量只有一题(LIMIT 1)必然也是在该函数中动态判断后生成的,这下简单了,只要找到包含LIMIT 1 的Select语句就可以了。将栈锁定在ebp附近,观察局部变量的变化情况,一路走下去。来到如下位置:

0051D5E4     8B4D C8        mov     ecx, dword ptr [ebp-38]
0051D5E7     8B55 E4        mov     edx, dword ptr [ebp-1C]
0051D5EA     8B45 F8        mov     eax, dword ptr [ebp-8]
0051D5ED     E8 763BFCFF   call    004E1168
0051D5F2     8B55 E8        mov     edx, dword ptr [ebp-18]


当跟踪到0051D5F2时,发现 call 004E1168 函数调用修改了 ebp-18 这个局部变量,修改后的值为:
010DEE0C  53 45 4C 45 43 54 20 41 2E 5B 41 6C 6C 54 65 73  SELECT A.[AllTes
010DEE1C  74 49 44 5D 2C 41 2E 45 70 6C 49 44 20 41 53 20  tID],A.EplID AS
010DEE2C  5B 41 6C 6C 54 65 73 74 5F 45 70 6C 49 44 5D 2C  [AllTest_EplID],
010DEE3C  41 2E 49 6D 67 49 44 20 41 53 20 5B 41 6C 6C 54  A.ImgID AS [AllT
010DEE4C  65 73 74 5F 49 6D 67 49 44 5D 2C 42 2E 5B 41 54  est_ImgID],B.[AT
010DEE5C  65 73 74 49 44 5D 2C 42 2E 5B 4D 61 69 6E 74 69  estID],B.[Mainti
010DEE6C  74 6C 65 5D 2C 42 2E 5B 41 5D 2C 42 2E 5B 42 5D  tle],B.[A],B.
010DEE7C  2C 42 2E 5B 43 5D 2C 42 2E 5B 44 5D 2C 42 2E 5B  ,B.[C],B.[D],B.[
010DEE8C  45 5D 2C 42 2E 5B 46 5D 2C 42 2E 5B 41 6E 73 77  E],B.[F],B.[Answ
010DEE9C  65 72 5D 2C 42 2E 5B 49 74 65 6D 4E 75 6D 5D 2C  er],B.[ItemNum],
010DEEAC  43 2E 5B 45 78 70 6C 61 69 6E 5D 20 46 52 4F 4D  C.[Explain] FROM
010DEEBC  20 5B 41 6C 6C 54 65 73 74 5D 20 41 20 49 4E 4E   [AllTest] A INN
010DEECC  45 52 20 4A 4F 49 4E 20 5B 41 54 65 73 74 5D 20  ER JOIN [ATest]
010DEEDC  42 20 4F 4E 20 41 2E 5B 54 61 62 6C 65 49 44 5D  B ON A.[TableID]
010DEEEC  3D 42 2E 5B 41 54 65 73 74 49 44 5D 20 4C 45 46  =B.[ATestID] LEF
010DEEFC  54 20 4A 4F 49 4E 20 5B 45 78 70 6C 61 69 6E 5D  T JOIN [Explain]
010DEF0C  20 43 20 4F 4E 20 41 2E 5B 45 70 6C 49 44 5D 3D   C ON A.[EplID]=
010DEF1C  43 2E 5B 45 70 6C 49 44 5D 20 57 48 45 52 45 20  C.[EplID] WHERE
010DEF2C  41 2E 5B 53 74 79 6C 65 49 44 5D 3D 31 20 20 4F  A.[StyleID]=1  O
010DEF3C  52 44 45 52 20 42 59 20 52 41 4E 44 4F 4D 28 29  RDER BY RANDOM()
010DEF4C  20 4C 49 4D 49 54 20 31                          LIMIT 1

Select … LIMIT 1,哈,终于出现了,函数004E1168 就是最终SQL语句的装配函数了。那修改 004E1168 函数就可以了。其实没必要,观察发现,此时 [ebp-8] 局部变量还存放着最初的SQL 语句(Select…LIMIT 10),那是不是只要将 :
0051D5F2   8B55 E8   mov   edx, dword ptr [ebp-18]-----存放修改后的SQL语句。
改为:
0051D5F2   8B55 E8   mov   edx, dword ptr [ebp-8]-----存放最初的SQL语句。
就可以呢?

改改看猜测是否正确。修改后重新运行,10个单选题终于出来了。其它题目的破解都使用同样的做法。
2007-8-11 00:04
0
游客
登录 | 注册 方可回帖
返回
//