首页
社区
课程
招聘
高手能否帮我分析一下这个软件的注册号算法,我都跟踪了一周了。
发表于: 2006-7-13 21:26 4134

高手能否帮我分析一下这个软件的注册号算法,我都跟踪了一周了。

2006-7-13 21:26
4134
本人为HR从业者,虽然公司有自已的ERP系统,但对网上的一些人力资源管理软件很感兴趣。近期发现了《总管理综合人事工资管理系统》,通过运行试用版,不禁漂亮的界面,人性的设计,全面的功能颇为折服。作为一个暴破爱好者,也想试一下可否破了它。实践证明,本人水平相当有限。特些向高手请教。
1、软件名称:《总管理综合人事工资管理系统》
2、类别:行业软件,人力资源管理。
3、用ASPACK2.12加壳,较容易处理。
4、用delphi编写,注册过程在hrms.dll中实现
5、使用次数限制,试用期间有窗口弹出。注册码限制:序列号+用户数+注册码。
注册信息写入注册表。
说明:其实网已有破解版本,但经试用,注册码不对。

尝试经过:

1、脱壳
较为顺利。
2、用OD载入,直接拦注册窗口。问题就出在这里,我试用了GetWindowTextA,GetWindowTextW,GetDlgItemTextA,GetDlgItemTextW,拦截均不成功。用bp messageBox可以拦下,但下一步的算法分析及寻找注册码工作却让我大费脑筋。才真正发现自己所知甚少,能力甚浅。还请高手帮忙分析一下。

程序我放在邮箱收件箱里:zld7643@126.com,密码:19760403.

今晚跟踪到1点钟,仍然未果,基本思路为:

既然GetWindowTextA,GetWindowTextW,GetDlgItemTextA,GetDlgItemTextW都拦不住,那么就说明,在按确定之前,注册信息已经被读进去了。于能过内存分析找到注册信息在内存中的存放位置,设内存断点,果然拦了下来。可是接下来的工作量却太大了,一点点的分析算法,有很多语句不知所云。

还是请高手帮忙吧。当然本人在得到帮助之前,依然会继续努力。

这段时间利用上班的时间又跟了两天,过程如下:
通过跟踪,初步确定:
1、在点注册按钮之前,程序已经将输入的注册信息读进去了分别存放在几个区域。
2、然后将读进去的数据由ASCII码转化为UNICODE码再分别存在另一个区域。
可是接下来,我差不多是一句一句的跟踪代码,却一点头绪也没有。
3、如果输入正确的注册信息,程序将注册信息放入注册表中,分为四个键值,分别为“注册名(或称序列号)”,“用户数”,“注册码”,其中注册码又分人两个值,CODE1和CODE2。
4、网上曾有过破解版本,但经试用破解不完全,有一个模块不能用。
高手点拨一下吧。
想请教
1、程序读进我输入的注册信息后,是如何运算的?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 210
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我不知道,这样的帖子在这里是否违规,如果不行,版主处理掉就行了。
2006-7-13 21:45
0
雪    币: 2506
活跃值: (1000)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
3
你可以把你在调试中遇到的问题提出来,看看大家能否帮助你。但是不能请求别人帮你破解,否则就违规了。
2006-7-13 22:53
0
雪    币: 151
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
在Hrms.dll中找到的

00C37482    8B80 D8020000            MOV     EAX, DWORD PTR [EAX+2D8]
00C37488    E8 2B63C7FF              CALL    008AD7B8
00C3748D    8B45 EC                  MOV     EAX, DWORD PTR [EBP-14]
// 检查序列号的长度
00C37490    E8 7BCEC3FF              CALL    00874310
00C37495    83F8 04                  CMP     EAX, 4

// 接下来把4段注册码连接起来
......

// 下面开始计算了
00C37546    8B55 E0                  MOV     EDX, DWORD PTR [EBP-20]
00C37549    A1 7025C600              MOV     EAX, DWORD PTR [C62570]
00C3754E    8B00                     MOV     EAX, DWORD PTR [EAX]
// 这个函数里面将注册码转换成HEX
00C37550    E8 C70FFFFF              CALL    00C2851C

......

00C375B4    8B55 D8                  MOV     EDX, DWORD PTR [EBP-28]
00C375B7    8D4D F2                  LEA     ECX, DWORD PTR [EBP-E]
00C375BA    A1 7025C600              MOV     EAX, DWORD PTR [C62570]
00C375BF    8B00                     MOV     EAX, DWORD PTR [EAX]
// 这个函数应该是关键了,因为后面就有个倒霉的跳转
00C375C1    E8 DA0BFFFF              CALL    00C281A0
00C375C8   /75 2E                    JNZ     SHORT 00C375F8
00C375CA   |6A 10                    PUSH    10
00C375CC   |B9 C077C300              MOV     ECX, 00C377C0        ;"错误"
00C375D1   |BA D477C300              MOV     EDX, 00C377D4        ;"注册码错误..."
00C375D6   |A1 0C22C600              MOV     EAX, DWORD PTR [C6220C]
00C375DB   |8B00                     MOV     EAX, DWORD PTR [EAX]
00C375DD   |E8 5275C9FF              CALL    008CEB34

所以跟进去看看,有一些很熟悉的字符串,这个似乎暗示了使用的RSA算法,
在早期的windows优化大师里面也有类似的代码,
它实际的算法可能需要进一步分析,毕竟静态分析就得到了这点收获。
2006-7-14 00:17
0
雪    币: 210
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
再试着看一下
2006-7-14 15:00
0
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
6
delphi的程序是用SendMessage传递WM_GETTEXT消息的,所以你的断点不起作用,可以在SendMessage处设条件断点。
还有,你为什么不用Dede呢?
在Dede反编译出的函数处下断不是更好吗?
2006-7-14 17:57
0
雪    币: 210
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不好意思,什么是DEDE,不了解。请指教
2006-7-16 17:19
0
游客
登录 | 注册 方可回帖
返回
//