解了,如下 (4千字)

发布者:Editor
发布于:2000-06-02 15:17

1、这个东西似乎用Aspack压缩的,脱壳很容易。咱不讨论这个。
2、它用MeltICE的方法来检测SoftICE,即
      CreateFileA("\\\\.\\SICE", ...)
      CreateFileA("\\\\.\\NTICE", ...)
  所以只要用bpx CreateFileA do "d *(esp+4)"设断点,等看见它欲打开SoftICE的driver时,把上面的文件名改掉糊弄它即可。用FrogsICE欺骗也行。
3、输入注册码之后它并不立即判断,而是用WritePrivateProfileStringA( )写入c:\windows\update.ini中,下次启动的时候再判断。
4、用bpx GetPrivateProfileStringA do "d *(esp+8)"设断点,然后再启动它,等看见它读NAME和SERIAL时,让它读出来,然后用BPR监视读出来的NAME和SERIAL,就会看见判断注册码的整个过程。
  它先计算NAME的累加和,然后每次用wsprintfA( )生成注册码中的两个字符,总共有12字符。

0167:0042EBD6  MOV      BL,[EAX+ESP+1C]
0167:0042EBDA  ADD      DL,BL          //求累加和
0167:0042EBDC  INC      EAX
0167:0042EBDD  CMP      EAX,ECX
0167:0042EBDF  JL        0042EBD6
0167:0042EBE1  MOV      [ESP+10],DL
......
0167:0042EC2B  MOV      ESI,[ESP+10]
0167:0042EC2F  MOV      EDI,[ESP+18]
0167:0042EC33  MOV      ECX,[ESP+14]
0167:0042EC37  LEA      EAX,[EBX+ESP+1C]
0167:0042EC3B  XOR      EDX,EDX
0167:0042EC3D  MOV      DL,[EAX+ECX]
0167:0042EC40  XOR      ECX,ECX
0167:0042EC42  MOV      CL,[EAX]
0167:0042EC44  XOR      EDX,ECX
0167:0042EC46  XOR      EDX,EDI
0167:0042EC48  XOR      EDX,ESI
0167:0042EC4A  PUSH      EDX
0167:0042EC4B  LEA      EDX,[ESP+00000120]
0167:0042EC52  PUSH      0047E198          //格式字符串 "%02x"
0167:0042EC57  PUSH      EDX
0167:0042EC58  CALL      [USER32!wsprintfA]
0167:0042EC5E  LEA      EDI,[ESP+00000128]
0167:0042EC65  OR        ECX,-01
0167:0042EC68  XOR      EAX,EAX
0167:0042EC6A  ADD      ESP,0C
0167:0042EC6D  REPNZ SCASB
0167:0042EC6F  NOT      ECX
0167:0042EC71  SUB      EDI,ECX
0167:0042EC73  MOV      ESI,EDI
0167:0042EC75  MOV      EDI,[ESP+00000224]
0167:0042EC7C  MOV      EDX,ECX
0167:0042EC7E  OR        ECX,-01
0167:0042EC81  REPNZ SCASB
0167:0042EC83  MOV      ECX,EDX
0167:0042EC85  DEC      EDI
0167:0042EC86  SHR      ECX,02
0167:0042EC89  REPZ MOVSD
0167:0042EC8B  MOV      ECX,EDX
0167:0042EC8D  AND      ECX,03
0167:0042EC90  INC      EBX
0167:0042EC91  CMP      EBX,EBP
0167:0042EC93  REPZ MOVSB
0167:0042EC95  JL        0042EC2B    //循环
   
  它还要将这12个字符中的首字符用相邻两字符交换位置的方法放到第8个字符的位置上。并将这12个字符中的前7个字符都与0x67相或。
0167:0042ECA2  OR        ESI,-01
0167:0042ECA5  LEA      EAX,[ECX+01]
0167:0042ECA8  SUB      ESI,ECX
0167:0042ECAA  MOV      DL,[EAX]
0167:0042ECAC  MOV      CL,[EAX-01]
0167:0042ECAF  OR        DL,67
0167:0042ECB2  OR        CL,67
0167:0042ECB5  MOV      [EAX-01],DL    //交换位置
0167:0042ECB8  MOV      [EAX],CL        //交换位置
0167:0042ECBA  INC      EAX
0167:0042ECBB  LEA      ECX,[EAX+ESI]
0167:0042ECBE  CMP      ECX,EBP
0167:0042ECC0  JL        0042ECAA

  再把你输入的假注册码的前7个字符也与0x67相或,然后就比较。
0167:00428862  REPNZ SCASB
0167:00428864  NOT      ECX
0167:00428866  DEC      ECX
0167:00428867  LEA      EDI,[ESP+00000164]
0167:0042886E  MOV      EDX,ECX
0167:00428870  OR        ECX,-01
0167:00428873  REPNZ SCASB
0167:00428875  NOT      ECX
0167:00428877  DEC      ECX
0167:00428878  CMP      ECX,EDX  //比较真假注册码的长度,为12
0167:0042887A  JZ        004288A6
0167:0042887C  PUSH      6C
0167:0042887E  CALL      004531B7
..............
0167:004288BA  MOV      AL,[ECX+ESP+000000E4]
0167:004288C1  MOV      DL,[ECX+ESP+00000164]
0167:004288C8  CMP      AL,DL          //比较
0167:004288CA  JNZ      004288CF
0167:004288CC  DEC      ECX
0167:004288CD  JNS      004288BA
0167:004288CF  LEA      EDI,[ESP+000000E4]
0167:004288D6  OR        ECX,-01
0167:004288D9  XOR      EAX,EAX
0167:004288DB  XOR      EDX,EDX
0167:004288DD  REPNZ SCASB
0167:004288DF  NOT      ECX
0167:004288E1  DEC      ECX
0167:004288E2  JZ        00428977
0167:004288E8  MOV      CL,[EDX+ESP+00000164]
0167:004288EF  MOV      AL,[EDX+ESP+000000E4]
0167:004288F6  CMP      CL,AL          //比较
0167:004288F8  JNZ      00428912

  也就是说,它不是直接比较注册码,而是把真假注册码都与0x67相或之后再进行比较。

Name:  Netguy/CrackingForFun
Code:  3c8d99e3dfc0


声明:该文观点仅代表作者本人,转载请注明来自看雪