首页
社区
课程
招聘
[原创]某人事档案管理系统的注册算法分析
发表于: 2006-4-11 11:22 3453

[原创]某人事档案管理系统的注册算法分析

2006-4-11 11:22
3453
【软件名称】人事档案管理系统V5.0(网络版)
【应用平台】Win9x/NT/2000/XP
【软件大小】19m
【软件限制】未注册时,会不定期跳出要求注册的穸口。
【保护方式】注册码
【破解说明】只是为了爱好,没有别。
【分析工具】Olldbg,PBKILLER
【破解作者】LRLZZGS
【软件简介】人事档案管理系统采用了现在非常流行的可视化编程语言PowerBuilder 6.5及其配套的本地数据库系统Sybase SQL Anywhere Database进行开发,根据人事档案管理的实际需要及其个性化需求,实现了人事档案综合管理的功能;一方面给档案管理人员提供了一个直观方便、易于操作的界面,大大提高地原有的工作效率;另一方面又大大丰富了原有人事档案管理的职能,增加分离了职称评定、联系方式、户籍党籍、个人简历和集体户档案五块内容,使其更加适应新的人事档案管理的需要。并且由于采用了专用数据库操作系统,使大批量的数据操作(包括浏览、查询、统计)变得非常方便和快捷。
  下载后,用PEID查无壳,PowerBuilder写的,直接用OD 跟,进入注册界面输入假码1234567812345678并下断点LSTRCMPA直接断在10C7210A处同时在EAX处出现真码,嘿嘿,明码比对。
然后用PBKILLER反编找到它的识别码和注册码的生成过程。就如此了,注册机我就不做了。免得侵权

10C720F4     50            push eax
10C720F5     FF15 B811D610 call dword ptr ds:[<&USER32.CharLo>; USER32.CharLowerA
10C720FB     C2 0800       retn 8
10C720FE     90            nop
10C720FF     90            nop
10C72100 P>  8B4424 0C     mov eax,dword ptr ss:[esp+C]
10C72104     8B4C24 08     mov ecx,dword ptr ss:[esp+8]
10C72108     50            push eax
10C72109     51            push ecx
10C7210A     FF15 000ED610 call dword ptr ds:[<&KERNEL32.lstr>; kernel32.lstrcmpA
                                                                          EAX 0098A968 ASCII "88X88Q4I9I3A37Q6"
                                                                          ECX 00983AE8 ASCII "1234567812345678"
10C72110     C2 0C00       retn 0C
10C72113     90            nop
10C72114     90            nop

识别码生成过程:
string ls_begin
string ls_end
string ls_char
integer li_length
integer li_index
long li_asc

ls_begin = fs_begin
li_length = len(ls_begin)

do while li_length < 8
        ls_begin = ls_begin + ls_begin
        li_length = len(ls_begin)
loop

for li_index = 1 to 4
        ls_char = mid(ls_begin,li_index,li_index)
        li_asc = asc(ls_char)
        li_asc = (li_asc * li_asc) * li_asc

        if mod(li_index,3) = 0 then
                li_asc = mod(li_asc,58)
                li_asc = mod(li_asc,10)
                li_asc = li_asc + 48
        else
                li_asc = mod(li_asc,91)
                li_asc = mod(li_asc,26)
                li_asc = li_asc + 65
        end if

        ls_end = ls_end + char(li_asc)
next

for li_index = 5 to 8
        ls_char = mid(ls_begin,li_index,li_index)
        li_asc = asc(ls_char)
        li_asc = li_asc * li_asc

        if mod(li_index,3) = 0 then
                li_asc = mod(li_asc,91)
                li_asc = mod(li_asc,26)
                li_asc = li_asc + 65
        else
                li_asc = mod(li_asc,58)
                li_asc = mod(li_asc,10)
                li_asc = li_asc + 48
        end if

        ls_end = ls_end + char(integer(li_asc))
next

return ls_end

注册码的生成过程:

string ls_begin
string ls_end
string ls_char
integer li_length
integer li_index
long li_asc

ls_begin = fs_begin
li_length = len(ls_begin)

do while li_length < 16
        ls_begin = ls_begin + ls_begin
        li_length = len(ls_begin)
loop

for li_index = 1 to 6
        ls_char = mid(ls_begin,li_index,li_index)
        li_asc = asc(ls_char)
        li_asc = li_asc * li_asc

        if mod(li_index,3) = 0 then
                li_asc = mod(li_asc,91)
                li_asc = mod(li_asc,26)
                li_asc = li_asc + 65
        else
                li_asc = mod(li_asc,58)
                li_asc = mod(li_asc,10)
                li_asc = li_asc + 48
        end if

        ls_end = ls_end + char(integer(li_asc))
next

for li_index = 7 to 12
        ls_char = mid(ls_begin,li_index,li_index)
        li_asc = asc(ls_char)
        li_asc = (li_asc * li_asc) * li_asc

        if mod(li_index,2) = 0 then
                li_asc = mod(li_asc,91)
                li_asc = mod(li_asc,26)
                li_asc = li_asc + 65
        else
                li_asc = mod(li_asc,58)
                li_asc = mod(li_asc,10)
                li_asc = li_asc + 48
        end if

        ls_end = ls_end + char(integer(li_asc))
next

for li_index = 13 to 16
        ls_char = mid(ls_begin,li_index,li_index)
        li_asc = asc(ls_char)
        li_asc = ((li_asc * li_asc) * li_asc) * li_asc

        if mod(li_index,3) = 0 then
                li_asc = mod(li_asc,91)
                li_asc = mod(li_asc,26)
                li_asc = li_asc + 65
        else
                li_asc = mod(li_asc,58)
                li_asc = mod(li_asc,10)
                li_asc = li_asc + 48
        end if

        ls_end = ls_end + char(integer(li_asc))
next

return ls_end

有不当之处,请各位大大提出。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 175
活跃值: (2331)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
又是PowerBuilder写的
2006-4-11 11:36
0
雪    币: 215
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
PB写得软件不要用明码比较,否则很容易找到明码!
非明码比较时,加密函数最好放到动态连接库里,即使用PBKILL反编译出,反推也不一定能出函数!
PB软件发布时最好用混淆器加密一下,这样PBKILL也看不到了!
2006-4-11 12:29
0
雪    币: 50
活跃值: (145)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
4
那样的话分析起来就麻烦啦
2006-4-11 15:26
0
游客
登录 | 注册 方可回帖
返回
//