• 标 题:人事信息综合管理系统 Ver3.2 (完全版本)的破解过程 (7千字)
  • 作 者:zyw[BCG]
  • 时 间:2002-1-20 19:11:49
  • 链 接:http://bbs.pediy.com

人事信息综合管理系统 Ver3.2  (完全版本)的破解过程
破解:zyw[BCG]
软件简介:软件以中组部《干部履历表》为蓝本,软件实行注册使用,对注册用户提供无限制升级服务。主程序的升级不会影响数据的安全。该软件可以稳定运行于Windows9X、Me、Windows2000 、Windows XP
下载地址:http://my8995.myetang.com/down/pdhs.exe  3760kb
注册价格:50 元/套目标:找出注册码
破解工具:language2000 ,UnFoxAll ,Ultraedit ,
目标:找出成为合法的注册用户的注册码
++++++++++++++++++++++++++++++++++++++++++++++++++++++
安装完毕后想用language2000查看一下,在打开时看主文件是一个狐狸头,language2000报是vc++程序,用UnFoxAll 2.00版反编译成功,有一个rs_zhuce.sct文件,用Ultraedit打开源程序:

......

Caption = "开始注册"
MousePointer = 99
MouseIcon = hand-m.cur
Name = "Command2"
  PROCEDURE Click
text_sn=thisform.text1.value+thisform.text2.value+thisform.text3.value+thisform.text4.value
if len(alltrim(text_sn))=16.and.int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))<=14
    sn_sub=int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))
    if sn_sub<>0
      sn=substr(text_sn,sn_sub,1)
      else
      sn=substr(text_sn,15,1)&&如果取值为0,第15位是Z
    endif 
do case
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=0.and.sn='Z'.and.substr(text_sn,16,1)='0'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=1.and.sn='A'.and.substr(text_sn,16,1)='1'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t. 
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=2.and.sn='B'.and.substr(text_sn,16,1)='2'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=3.and.sn='C'.and.substr(text_sn,16,1)='3'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=4.and.sn='D'.and.substr(text_sn,16,1)='4'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=5.and.sn='E'.and.substr(text_sn,16,1)='5'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=6.and.sn='F'.and.substr(text_sn,16,1)='6'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=7.and.sn='G'.and.substr(text_sn,16,1)='7'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=8.and.sn='H'.and.substr(text_sn,16,1)='8'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=9.and.sn='I'.and.substr(text_sn,16,1)='9'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=10.and.sn='J'.and.substr(text_sn,16,1)='0'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=11.and.sn='K'.and.substr(text_sn,16,1)='1'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=12.and.sn='L'.and.substr(text_sn,16,1)='2'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=13.and.sn='M'.and.substr(text_sn,16,1)='3'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=14.and.sn='N'.and.substr(text_sn,16,1)='4'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
  OTHERWISE
        =messagebox('注册序号不正确,无法完成注册,请索取正确的注册号',0+16,'提示') 
  endcase
else
    =messagebox('注册序号不正确或不完整,无法完成注册,请索取正确的注册号',0+16,'提示')   
endif
thisform.release

......

程序根据安装序号(随机出)对应注册码,本机安装序号是:20020112120831
分析:1 看安装序号soft_sn第13,14位相加为几? 本机的是:3+1=4
      2 到条件是4的case看
case int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))=4.and.sn='D'.and.substr(text_sn,16,1)='4'
        =messagebox('注册成功。祝贺您成为合法的注册用户,您将获得无限制的免费升级服务。',0+64,'提示')
        select rs_user
        replace sp with .t.
        sp_time=.t.       
成功条件:注册码中有字符"D" (sn="D") and 注册码第16位=4

向上看
text_sn=thisform.text1.value+thisform.text2.value+thisform.text3.value+thisform.text4.value
以上一句是:注册码值的算法

if len(alltrim(text_sn))=16.and.int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))<=14
以上一句是:注册码位位都要输入 and ????(不知什么用)

    sn_sub=int(val(substr(soft_sn,13,1)))+int(val(substr(soft_sn,14,1)))
以上一句是:sn_sub=安装序号的第13,14位相加取整 本机的是:3+1=4

    if sn_sub<>0
      sn=substr(text_sn,sn_sub,1)
以上二句是:sn值的算法 本机的sn是"D" 则sn=substr(test_sn,4,1)="D"

推断出注册码值可能是:000D-0000-0000-0004 ?

输入该码,成功注册!!! 朋友可对号入座(case),便能注册^_^

总结一下:  Name    :zyw[BCG]
            安装序号:20020112120831
            注册码  :000D-0000-0000-0004
     
  文章纯粹研究该软件的注册过程,已很久无发布信息了,看了一下论坛有很多的新朋友,真是可喜可贺!
最后,恭祝大家新年快乐!万事胜意!今天“大寒”,广州市很冷******
        破解人:        zywicbc
                Beginner's Cracking Group
            2001.01.12  18:30

  • 标 题:都是作者偷懒惹的祸! (1千字)
  • 作 者:- Aming -
  • 时 间:2002-1-20 22:11:26

作者没有将调试信息去掉,Method 有源代码的存在,导致被人轻易发现。对大多数面向对象的语言来说,总是对象与事件对应的,表单的空壳都可以给别人轻易得到(VB、DELPHI、VFP等),我们最关心的是代码泄露问题。
表单代码加密的方法大概有以下几种:
1、去掉调试信息。
经过这种方法处理后的表单,在VFP的设计环境中看不到代码的存在,且修改后的表单不能正常保存,直至反编译者的硬盘充满为止。但经过重新编译再打开表单就可以看到所有代码。 Compile Form *.SCX
2、重复步骤一,把“重新编译可见代码”的后门堵上。
方法 A:修改代码指针,表单照样正常运行,但无论你怎么再重新编译,照样看不到代码;
方法 B:在 Method 中设下“陷阱”,表单可正常运行且不会让别人看到代码,但只要反编译者企图用重新编译表单的方法来获取源代码的话,表单会自动破坏,再次打开表单时VFP会说是一个无效的编译表单然后退出;
方法 C:在表单中加入伪事件,也就是平常所说的Anti技术了,可以令REFOX反编译时内存溢出,UNFOXALL在反编译时出现蓝屏,使用VFP重新编译时VFP出现非法操作;
方法 D:给编译后的表单作“手术”,采用明文类REFOX8 I+的代码偏移,理论上可做 4295033104 种(位)不同的偏移,不进行(懂得)复位计算的反编译者当然无从下手了。^_^
    当然,你可以把A、B、C、D整合在一起用,这样肯定会令反编译者大感头疼,即使对手是一个很有经验的反编译者。最后,祝VFP作者们好运!
                                        Aming
                        于广州寒冷的夜,想着 Lynn 和惦着 YY 的夜