• 标 题:《赢证股市分析软件》V2.01 高级版的破解 (10千字)
  • 作 者:佳洁士
  • 时 间:2001-5-8 17:04:17
  • 链 接:http://bbs.pediy.com

《赢证股市分析软件》V2.01 高级版的破解


软件名称:《赢证股市分析软件》V2.01
发布日期:  2001.3.5
软件来源:《软件》杂志第4期配套光盘。
软件简介:
    《赢证股市分析软件》主要面向广大中小投资者,特别是上班族股民,为他们提供一种功能强大,价廉物美的炒股工具。
    
    软件分为共享版,标准版和高级版三个版本,用户可以完全免费地,无期限地试用共享版软件,充分体会软件强大的功能。如果用户感到软件的功能能够满足自己的需要,就可以注册成为标准版或高级版,以获取更多更全面的功能和厂家提供的更多服务内容。

    高级版是《赢证股市分析软件》系列产品中最优秀的版本。与标准版的唯一区别就是增加了“赢证红绿灯”信号。该信号是一种全新的选股方式,是由计算机通过对大量的历史数据进行智能分析总结出来的具有普遍规律性的选股法。经过实际验证,该信号能够获得非常准确清晰的买卖结果,以红绿灯的方式直接表现在K线图中。



【声明】
      我写这篇文章是以技术交流为主,希望大家在转载时能保持文章的完整性。


作    者:佳洁士
解密日前:2001年4月26日
解密工具:1、Trw2000 1.22
          2、W32Dasm 8.93 超级中文版


    从软件帮助文件的介绍上可以得知,软件的使用权限越高,功能越强大,而使用权限是同过注册码来确定的,小弟的功力太菜。追不到它的注册码。不得已用爆破手段来搞定它。

    找到我们的神兵利器W32Dasm 8.93 超级中文版反汇编《赢证股市分析软件》的主程序StockNT.exe。静态分析看看能够有什么收获。皇天不负有心人。让我找到了共享版、标准版、高级版等关键字符串。并记下了他们的内存地址(memory offset)。

共享版: 0042AE28  MOV      EAX,005135E0

标准版: 0042AE35  PUSH    DWORD 005135D0

高级版: 0042AE41  PUSH    DWORD 005135C0


我们可以利用在W32Dasm 8.93 超级中文版找到的内存地址(memory offset),在Trw2000中下中断点。

在TRW2000运行窗口用Browse选中StockNT.exe,然后用Loaf按钮装载。装载文件后,将中断在这文件的主函数(即程序的入口处)。

将中断点下在共享版上:bpx 0042AE28

..............
0167:0042ADE9  LEA      ECX,[EDI+EDI*4]
0167:0042ADEC  PUSH    BYTE +00
0167:0042ADEE  LEA      ECX,[ECX+ECX*4]
0167:0042ADF1  LEA      ECX,[EBX+ECX*4]
0167:0042ADF4  LEA      ECX,[ECX+ECX*4]
0167:0042ADF7  LEA      EDX,[ECX+ECX*4]
0167:0042ADFA  LEA      ECX,[EBP+EDX*4+00]
0167:0042ADFE  MOV      EDX,[EAX+1C]
0167:0042AE01  PUSH    ECX
0167:0042AE02  PUSH    DWORD 05C2            //将05C2压入堆栈.  关键哦!
0167:0042AE07  PUSH    EDX
0167:0042AE08  CALL    `USER32!SendMessageA`  ==>重点!!! 按F8进入此CALL.
0167:0042AE0E  TEST    EAX,EAX              试着下 EAX=1(这是以EAX为旗帜)
0167:0042AE10  JNZ      0042AE30              可以看见变成标准版。随便移动鼠标,
0167:0042AE12  CALL    004CFC96              又变回共享版了。
0167:0042AE17  MOV      ECX,[EAX+04]
0167:0042AE1A  CALL    00499610
0167:0042AE1F  TEST    EAX,EAX
0167:0042AE21  MOV      EAX,005135F0
0167:0042AE26  JNZ      0042AE2D
0167:0042AE28  MOV      EAX,005135E0    <<=共享版
0167:0042AE2D  PUSH    EAX
0167:0042AE2E  JMP      SHORT 0042AE46     
0167:0042AE30  CMP      EAX,BYTE +01        //比较EAX是不是等于1
0167:0042AE33  JNZ      0042AE3C            //不相等就跳,
0167:0042AE35  PUSH    DWORD 005135D0    <<=标准版
0167:0042AE3A  JMP      SHORT 0042AE46   
0167:0042AE3C  CMP      EAX,BYTE +02        //比较EAX是不是等于2
0167:0042AE3F  JNZ      0042AE4F            //不相等就跳,
0167:0042AE41  PUSH    DWORD 005135C0    <<=高级版
0167:0042AE46  LEA      ECX,[ESP+14]
0167:0042AE4A  CALL    004B7D9F
0167:0042AE4F  MOV      EAX,[ESP+10]
0167:0042AE53  MOV      EDX,[ESI]
0167:0042AE55  MOV      ECX,[EAX-08]
.....................

看到共享版、标准版、高级版的区别了吗! 他们都是以EAX的值作为判断共享版、标准版、高级版的!

也就是说:当EAX=0 为共享版
          当EAX=1 为标准版
          当EAX=2 为高级版


向上看看,看何处使EAX可为1、2 。可以找到这里:

0167:0042AE08  CALL    `USER32!SendMessageA` 
0167:0042AE0E  TEST    EAX,EAX      <<-强制使EAX=1,软件将变成标准版。
0167:0042AE10  JNZ      0042AE30        强制使Eax=2,软件会变成高级版。

如果在上述部位强制使EAX=1。虽然在使用权限中会变成了标准版、高级版,但是还是有很多的功能不能正常使用。比如红绿灯功能就不能使用,也就是说软件表面上变成是标准版、高级斑,但同实际上还是共享版。只是文字改变了。可以肯定程序在某处有全局变量注册旗帜。

现在要做的事情就是找到这个注册旗帜!!!

按F8进入0167:0042AE08  CALL    `USER32!SendMessageA`
这时将来到系统文件USER32.dll的邻空。
按F10慢慢走,看看程序要把我们带到什么地方?
....................
0167:BFF559E6  CALL    BFF55000
0167:BFF559EB  PUSH    DWORD [ESP+04]
0167:BFF559EF  CALL    BFF5506B
0167:BFF559F4  TEST    EAX,EAX
0167:BFF559F6  JZ      BFF55A5E
0167:BFF559F8  TEST    BYTE [EAX+2F],02
0167:BFF559FC  JZ      BFF55A5E
0167:BFF559FE  MOV      CX,[FS:28]
0167:BFF55A06  CMP      [EAX+20],CX
0167:BFF55A0A  JNZ      BFF55A5E
0167:BFF55A0C  MOV      EDX,[BFF5D5D2]
0167:BFF55A12  ADD      EDX,1112
0167:BFF55A18  CMP      WORD [EDX+0A],BYTE +00
0167:BFF55A1D  JNZ      BFF55A5E
0167:BFF55A1F  CMP      WORD [EDX+1A],BYTE +00
0167:BFF55A24  JNZ      BFF55A5E
0167:BFF55A26  PUSH    EAX
0167:BFF55A27  PUSH    CX
0167:BFF55A29  PUSH    WORD 00
0167:BFF55A2D  CALL    `KERNEL32!MapSL`
0167:BFF55A32  MOV      ECX,EAX
0167:BFF55A34  POP      EAX
0167:BFF55A35  ADD      ECX,BYTE +5E
0167:BFF55A38  CMP      WORD [ECX+0A],BYTE +00
0167:BFF55A3D  JNZ      BFF55A5E
0167:BFF55A3F  CMP      WORD [ECX+1A],BYTE +00
0167:BFF55A44  JNZ      BFF55A5E
0167:BFF55A46  MOV      CX,[EAX+2A]
0167:BFF55A4A  MOV      ES,CX
0167:BFF55A4D  MOVZX    EAX,WORD [EAX+28]
0167:BFF55A51  MOV      EAX,[ES:EAX+02]
0167:BFF55A55  PUSH    DS
0167:BFF55A56  POP      ES
0167:BFF55A57  CALL    BFF5500C
0167:BFF55A5C  JMP      EAX          <<==回到StockNT.exe
......................

经过上面不长不短的代码。突然从系统文件USER32.dll的领空返回到了StockNT.exe的领空。

这可是软件的关键的部位,好好的分析一下。
......................


EAX=004B440A  EBX=00000005  ECX=C174DC30  EDX=000194C4  ESI=0079F7DC       
EDI=000007D1  EBP=00000008  ESP=0079F730  EIP=004B440A  o d I s Z a P c   
CS=0167  DS=016F  SS=016F  ES=016F  FS=0FAF  GS=0000  SS:0079FA04=000005C2 看这儿! ==================================================byte==============PROT========
0030:00000000 9E 0F C9 D8 65 04 70 00-16 00 E9 CD 65 04 70 00  ....e.p.....e.p.
0030:00000010 65 04 70 00 54 FF 00 F0-08 80 00 F0 6F EF 00 F0  e.p.T.......o...
0030:00000020 00 00 EF 08 8C 19 CA CE-6F EF 00 F0 6F EF 00 F0  ........o...o...
0030:00000030 6F EF 00 F0 6F EF 00 F0-9A 00 E9 CD 65 04 70 00  o...o.......e.p.
==========================================================================ROT32

0167:004B4409  RET                                                            
0167:004B440A  PUSH      EBP                                                  
0167:004B440B  MOV      EBP,ESP                                               
0167:004B440D  CMP      DWORD PTR [EBP+0C],00000360                           
0167:004B4414  JNZ      004B441B                                             
0167:004B4416  PUSH      01                                 
0167:004B4418  POP      EAX                             
0167:004B4419  JMP      004B4435                                             
0167:004B441B  PUSH      DWORD PTR [EBP+08]                                   
0167:004B441E  CALL      004B4385                                             
0167:004B4423  PUSH      DWORD PTR [EBP+14]                                   
0167:004B4426  PUSH      DWORD PTR [EBP+10]                                   
0167:004B4429  PUSH      DWORD PTR [EBP+0C]                                   
0167:004B442C  PUSH      DWORD PTR [EBP+08]                                   
0167:004B442F  PUSH      EAX                                                   
0167:004B4430  CALL      004B419D                                             
0167:004B4435  POP      EBP                                                   
0167:004B4436  RET      0010                                                 
0167:004B4439  MOV      EAX,004B440A                                         
0167:004B443E  RET                                                             
0167:004B443F  MOV      EAX,004E24A0                                         
0167:004B4444  CALL      004A3488                                             
0167:004B4449  SUB      ESP,40                                               
0167:004B444C  PUSH      EBX                                                  
0167:004B444D  PUSH      ESI                                                
====================================STOCKNT!.text+000B3409======================
Break due to BPX #0167:0042AE02  (ET=2.31 seconds)                             
:pagein n 23.txt                                                               

.................

0167:004B440A  PUSH      EBP                                                 
0167:004B440B  MOV      EBP,ESP                   
0167:004B440D  CMP      DWORD PTR [EBP+0C],00000360    取堆栈的值与0360作比较               
0167:004B4414  JNZ      004B441B                                             
0167:004B4416  PUSH      01            //将01压入堆栈        <<=注册旗帜哦   
0167:004B4418  POP      EAX            //从堆栈取出01到EAX                   
0167:004B4419  JMP      004B4435                                             


    [EBP+0C]=05C2,05C2是不是很眼熟,在什么地方见过。找一找?
   
把0167:004B440D  CMP  DWORD PTR [EBP+0C],00000360 改成0167:004B440D  CMP  DWORD PTR [EBP+0C],000005C2。来改变软件的跳转方向。

    按F5回到程序,这时可以发现软件在使用权限上已经变成了标准版。试一试各种功能。都可以正常使用(除红绿灯功能外)。从前面的分析我们知道!高级版与标准版的区别!只是EAX值的不同,EAX=2就是高级版。


0167:004B440D  CMP      DWORD PTR [EBP+0C],000005C2                           
0167:004B4414  JNZ      004B441B                                             
0167:004B4416  PUSH      01                    改为:PUSH 02               
0167:004B4418  POP      EAX                             
0167:004B4419  JMP      004B4435                                         

  这样一来,不就使EAX=2了嘛。看使用权限中是不是就变成了高级版。 试一下高级版中的红绿灯功能。可以正常使用了。


最后整理一下:

高级版的修改方法:
找到:817D0C6003000075056A01
改成:------C205----------02          注:“ - ” 表示不用改!



                                                  佳洁士
                                                2001.04.26




后记:在写《赢证股市分析软件》破解记录时,发现一个有趣的现象。我写破解录时喜欢把软件的名称作为文件名称,比如说:"赢证股市分析软件.txt".此时再运行赢证,赢证会提示软件已经在运行之中。不知这算不算软件的Bug。


广告: 我们的目标,没有加密!  -----佳洁士