首页
社区
课程
招聘
[原创]XX迷你进销存医药版注册码算法分析(适合初级)
发表于: 2007-3-27 12:17 21681

[原创]XX迷你进销存医药版注册码算法分析(适合初级)

2007-3-27 12:17
21681

【文章标题】: XX迷你进销存医药版注册码算法分析
【文章作者】: csshrb
【作者邮箱】: [email]csshrb2004@yahoo.com.cn[/email]
【作者主页】: www.freeoffice.com.cn
【作者QQ号】: 69780955
【软件名称】: XX迷你进销存医药版
【软件大小】: 5.61M
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 无
【编写语言】: VFP9.0
【使用工具】: VFPupker,foxtools,ollydbg,
【操作平台】: win
【软件介绍】: 一个小型的医药进销存管理软件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  一、用PEID查壳,显示nothing found,用ollydbg手动脱壳。
  二、用VFPupker反编译脱壳文件可的到VFP的工程文件。
  三、用foxtools反编译,得到如下代码。
  
  set ENGINEBEHAVIOR 70
  set safety off
  set century on
  set date YMD
  set sysmenu off
  set talk off
  set status bar off
  set confirm on
  set deleted on
  set multilocks on
  set exact on
  set resource off
  set procedure to proc  ADDITIVE
  set default to JUSTPATH(SYS(16,0))
  _screen.picture = "BANK.JPG"
  _screen.windowstate = 2
  _SCREEN.addproperty("cTitle")
  _SCREEN.addproperty("cPath")
  _SCREEN.addproperty("cUser")
  _SCREEN.addproperty("cCPUID")
  _SCREEN.addproperty("lReg")
  _SCREEN.addproperty("cHb")
  _SCREEN.addproperty("Ver")
  _screen.ver = "V2.20"
  _screen.cpath = SYS(5)+CURDIR()
  _screen.ctitle = "星空软件"
  _screen.caption = "超越迷你进销存 医药版"+_SCREEN.ver
  _screen.icon = "lighton.ico"
  _screen.visible = .t.
  if  not DIRECTORY("data")
     MESSAGEBOX("本程序运行目录下不存在数据文件目录“data”,系统将自动退出。",16,"系统自检...")
     quit
  endif
  if  not checkdata()
     MESSAGEBOX("数据自检失败!引起此原因可能是由于突然断电或意外死机造成的数据损坏。"+CHR(13)+"请使用数据修复工具检查数据库!"+CHR(13)+CHR(13)+"如果修复后问题此窗口仍然出现,请与我们联系!"+CHR(13)+CHR(13)+"技术支持:0631-5625456",16,"数据自检失败")
     if FILE("repair.exe")
        run /n repair
     endif
     quit
  endif
  if DIRECTORY("cytemp")
     lnxw = MESSAGEBOX("在上次软件运行过程中可能出现过死机或断电等意外问题,系统非正常退出。"+CHR(13)+CHR(13)+"为了保证数据安全,系统将进行数据库校验! "+CHR(13)+CHR(13)+"注意,校验完成后系统将自动退出。请重新登录运行系统。",64,"系统启动自检")
     delete file cytemp\*.*
     rd cytemp
     do verify
  else
     md cytemp
     close databases all
     copy file data\*.* to cytemp
  endif
  declare integer DiskID32 in DiskID32.DLL string @, string @          注意:取得磁盘物理ID为机器码
  a = REPLICATE(CHR(0),31)
  b = REPLICATE(CHR(0),31)
  retval = DISKID32(@A,@B)
  _screen.ccpuid = ALLTRIM(LEFT(B,AT(CHR(0),B)-1))
  for n = 1 to 10
     if EMPTY(_SCREEN.ccpuid)
        _screen.ccpuid = ALLTRIM(LEFT(B,AT(CHR(0),B)-1))
     else
        exit
     endif
  endfor
  if EMPTY(_SCREEN.ccpuid)
     _screen.ccpuid = "FA780203"                                      如磁盘物理ID为空机器码为FA780203                        
  endif
  lczcm = "AAAAA"
  set procedure to proc  ADDITIVE
  if  not FILE("reginfo.mem")
     _screen.lreg = .f.
  else
     restore from reginfo additive
     if regedit(_SCREEN.ccpuid,427) <> LCZCM                         比较注册码,调用到函数regedit
        _screen.lreg = .f.
     else
        _screen.lreg = .t.                                            注册码正确则通过
     endif
  endif
  set safety off
  select 0
  use data\销售出库
  if AFIELDS(AA) <> 14
     on shutdown quit
     MESSAGEBOX("你所使用的数据格式比较老,必需升级才能使用!",16,"提示")
     do form scx\update
     read events
     quit
  endif
  use  in 销售出库
  if _SCREEN.lreg = .f.
     use data\销售出库 exclusive
     pack
     count  to lnsum
     if LNSUM > 500
        MESSAGEBOX("对不起,未注册版本不能无限制地使用本软件。请与软件供应商联系!",16,"软件试用期已过")
        do form scx\zc  with 1
        read events
     endif
  endif
  use data\system
  _screen.chb = HBFH
  use
  set help to myhelp.chm
  on key label F3 do usepos
  on error do myerror
  on shutdown do myShutDown
  _SCREEN.addproperty("jbzl")
  _SCREEN.addproperty("cgrk")
  _SCREEN.addproperty("xsck")
  _SCREEN.addproperty("xsthh")
  _SCREEN.addproperty("qtkcbd")
  _SCREEN.addproperty("szlr")
  _SCREEN.addproperty("ywbb")
  _SCREEN.addproperty("ywls")
  _SCREEN.addproperty("xtwh")
  do form scx\sfyz
  read events
  
  
  procedure regedit
  parameters inmsg,inusers                                       inmsg为你的机器的磁盘物理ID
  private nstep,nmod, outmsg, cbaseid
  cbaseid = "SDFSDFSDFSLFDKGL09345-=2389234"                             此处为生成码
  inmsg = PADR(ALLTRIM(INMSG),25,"0")                                不足25位,在右补0
  if INMSG == ""
     return ""
  ENDIF
  
  outmsg = ""
  for nstep = 1 to LEN(INMSG)                                     循环机器码的次数 25次
     nmod = MOD(NSTEP,LEN(CBASEID))                               取余数1-25/30的余数
     outmsg = OUTMSG+CHR(keymove(ASC(SUBSTR(INMSG,NSTEP,1))+ASC(SUBSTR(CBASEID,NMOD,1))-INUSERS)) 生成注册码,keymove函数是保证注册码
                                                                                                  为合法字符即大写的英文字母,交叉取机
                                                                                                  码和生成码。
  endfor
  return SUBSTR(OUTMSG,1,5)+"-"+SUBSTR(OUTMSG,6,5)+"-"+SUBSTR(OUTMSG,11,5)+"-"+SUBSTR(OUTMSG,16,5)+"-"+SUBSTR(OUTMSG,21,E)
  
  procedure keymove
  parameters inno
  do while .t.
     do case
     case INNO < 65
        inno = INNO+26
     case INNO > 90
        inno = INNO-26
     otherwise
        exit
     endcase
  enddo
  return INNO
  
--------------------------------------------------------------------------------
【经验总结】
  该软件的注册算法大致如下:
    1、将不足25位机器码在右边补0
    2、设置循环生成注册码
    3、交叉取机码和生成码,其中生成码减去传入参数inusers,截取字符串开始为取1-25/30的余数
    4、返回前25位为注册码
    5、注册机已编写完毕
  由于本人用PB编程只好用PB编写注册机了。以下为代码:
        string outmsg, cbaseid,inmsg
        int nstep,inusers
        long nmod
        //inmsg=trim(sle_jqm.text)
        inmsg="你的机器码"
        inusers=427
        cbaseid = "SDFSDFSDFSLFDKGL09345-=2389234"
        outmsg = ""
        for nstep = 1 to LEN(INMSG)
           nmod = MOD(NSTEP,LEN(CBASEID))
         outmsg = OUTMSG+CHAR(keymove(ASC(MID(INMSG,NSTEP,1))+ASC(MID(CBASEID,NMOD,1))-INUSERS))
        end for
        sle_xlh.text=outmsg
        key函数
        do while true
          choose case inno
           case is <65
              inno = inno+26
              case Is > 90
              inno = inno - 26
           case else
                        exit
          end choose

        loop
        return inno
  以上分析的比较简单,希望大家不要见笑!!
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年03月26日 13:01:01


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

收藏
免费 7
支持
分享
最新回复 (30)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
VPF反编译怎么象看源代码一样。。。。。。。
2007-3-27 14:04
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
是我粘到记事本里,规距了一下!反编译后只有两个有用的prg排了一下!
2007-3-27 14:07
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
不知道什么时候能用论坛的ftp!有什么条件吗?
2007-3-27 16:33
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
5
长知识了今早上,嘿嘿原来foxtools这个软件能把vfp分析得如此清晰,哇靠。非常感谢楼主分享。
还有,pb源码不错
2007-3-29 08:38
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
其实破解软件,对要破的的软件功能了解一些对破解来说是非常有帮助的!比如上面的软件是VFP编写的,要是能反编译就的能读VFP了。还好,有GOOGLE可以搜索哈 能看懂。看来汇编应该是万能的了。本人开始学习汇编了!争取能看懂反汇编的结果!
2007-3-29 09:27
0
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
太猛了,完全不用OD啊
2007-3-29 11:23
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
哈 对付VFP的程序主要还是看怎么脱壳或解密,的到工程文件,就什么都好办了。
2007-3-29 12:37
0
雪    币: 224
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
VF软件没有什么深度
由于能反编译成源码。
vf和PB一样都属于没有技术的语言,你抄我的,我抄你的。
也拥有大量初级用户,水平永过提不高。
写不出来的时候就反一个写好的改一改。
所以中国的进销存医院管理,只要是vf和pb开发的都大同小异, 你能做出来我就能反出来。
看来微软放弃vf是对的。
不知道sysbase公司什么时候放弃pb.
2007-3-29 13:09
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
楼上说的,有不同看法!VFP和PB的程序能完全反编译吗?恐怕不能
要是破解的话,这两种调试还是很麻烦的。再说一般软件的加密本省就没什么技术含量。所以破解容易。如果要是报加密算法封装到DLL
你这么反编译啊 !论坛力关于PB的破解非常少。我觉得pb的破解还是有一定难度的!就像VB!
2007-3-29 20:18
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
那位有PB软件调试破解的心得能分享一下吗?
2007-3-30 09:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
的却VF,PB反编译后 读起来比ASM简单些,毕竟是高级语言,呵呵
2007-3-30 10:13
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
还是希望出现更好的反编译工具啊!!
2007-4-1 14:32
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
高级语言不知道那个好破解一些!还是看自己熟悉那种语言,就觉得那个好破吧!!
2007-4-2 19:27
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
15
真强悍学习 收藏先```
2007-4-2 23:14
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
说实话我新手
一点都看不明白
2007-4-2 23:37
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
偶跟你一样的说~看不懂
2007-4-3 13:12
0
雪    币: 178
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
看看阿    。
2007-4-3 19:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
小强~~~~~~~~~~~~~~~~~~
2007-4-4 00:43
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
小强是什么意思?
2007-4-4 09:09
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
自己帮忙看看!难得啊!有这么好的反编译软件?
2007-4-6 10:57
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
初学者!顶!
2007-4-6 13:41
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
温度怎么降下了了!
2007-4-15 20:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
二级语言就是汇编语言。正如以上朋友所说,汇编是万能的,学好他才是根本。但是初学者还是要学如VB。VC之类的语言的。这样更能理解语句的意思!
2007-4-16 10:47
0
雪    币: 188
活跃值: (32)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
自持用一下!!
2007-4-25 15:09
0
游客
登录 | 注册 方可回帖
返回
//