Hex Edit 2.1.13 for Win95
Cracked by Hambo.H
Written in 4:09 98-1-2

这是一个Hex的编辑器,很好用,与Ultra Edit有得比!!
Crack的方法也很简单,是程序会将你输入的S/N(是一个数值,
不含字母)转换成16进制。S/N是由Name生成一个16进制数值
,然后与你输入的(转换后的)进行比较。^_^
需要说明的是,我Crack的时候,这个软件已经过期了,是在
程序开头的时候Crack的,如果你也要再跟一次,请先将日期
调到使该软件过期的时间再跟,否则可能有所不同。

费话少说,开始啦......

01)首先设BPX GetWindowTextA
   然后回到程序,在Name输入"Hambo.H"
   在Registration输入"1122334455"
   其16进制值是0x42e576f7
   按一下OK,将会被SoftIce拦截下,然后BD *
   关掉所下的BreakPoint。
   按以下F12将看到如下程序:

0137:00428567  PUSH    EAX
0137:00428568  CALL    004217C9
0137:0042856D  PUSH    EAX
0137:0042856E  PUSH    ESI
0137:0042856F  CALL    [USER32!GetWindowTextA]
上面的Call是读取Name
0137:00428575  MOV     ECX,[EBP+10]   <--返回在此位置
0137:00428578  PUSH    FF
0137:0042857A  CALL    004217A1      
0137:0042857F  JMP     0042858C
0137:00428581  MOV     EAX,[EBP+10]
0137:00428584  PUSH    DWORD PTR [EAX]
0137:00428586  PUSH    ESI
0137:00428587  CALL    00426C81
0137:0042858C  POP     EDI
0137:0042858D  POP     ESI
0137:0042858E  POP     EBP


再按一下F12会见到如下程序:

0137:00401D38  LEA     EAX,[ESI+5C]
0137:00401D3B  PUSH    EAX
0137:00401D3C  PUSH    00000407
0137:00401D41  PUSH    EDI
0137:00401D42  CALL    00428540
0137:00401D47  ADD     ESI,60     <--返回在此位置
0137:00401D4A  PUSH    ESI
0137:00401D4B  PUSH    00000408
0137:00401D50  PUSH    EDI
0137:00401D51  CALL    004284E2  <--这是读取Registration,以及将其转换为Hex
0137:00401D56  POP     EDI
0137:00401D57  POP     ESI
0137:00401D58  RET     0004

按两次F12

0137:00401DB9  MOV     EDI,[EAX+04]
0137:00401DBC  PUSH    01
0137:00401DBE  MOV     ECX,ESI
0137:00401DC0  CALL    00420173
0137:00401DC5  TEST    EAX,EAX    
0137:00401DC7  JZ      00401E03
0137:00401DC9  MOV     EAX,[ESI+60]   <--换算后的Registration的值"0x42e576f7"
0137:00401DCC  MOV     ECX,[ESI+5C]   <--Name所在的地址
0137:00401DCF  PUSH    EAX
0137:00401DD0  PUSH    ECX
0137:00401DD1  MOV     ECX,EDI
0137:00401DD3  CALL    004038B0   <--用Name进行计算和比较
0137:00401DD8  TEST    EAX,EAX
0137:00401DDA  JZ      00401DF5


2)现在主要的工作是进入Call 004038B0找出注册码,好进去....
  运行到
0137:00401DD3  CALL    004038B0
然后按F8进入

0137:004038B0  MOV     EAX,[ESP+04]  <--Name所存放的地址
0137:004038B4  SUB     ESP,00000100  <--由这个0x100可以看出Name可以输入255个字符
0137:004038BA  LEA     ECX,[ESP+00]
0137:004038BE  PUSH    EBX
0137:004038BF  PUSH    00000100
0137:004038C4  PUSH    EAX
0137:004038C5  PUSH    ECX
0137:004038C6  CALL    0040AF00  <--将Name拷贝到CX指向的地址
0137:004038CB  ADD     ESP,0C
0137:004038CE  LEA     EDX,[ESP+04]
0137:004038D2  PUSH    EDX
0137:004038D3  CALL    0041B150   <--将Name转换为大写
0137:004038D8  ADD     ESP,04
0137:004038DB  MOV     ECX,00000004

下面一段是进行S/N的计算,根据Name来算:
=============================================
0137:004038E0  MOV     EAX,ECX
0137:004038E2  CDQ
0137:004038E3  XOR     EAX,EDX
0137:004038E5  SUB     EAX,EDX
0137:004038E7  AND     EAX,03
0137:004038EA  XOR     EAX,EDX
0137:004038EC  SUB     EAX,EDX
0137:004038EE  MOV     DL,[ECX+ESP+04]
0137:004038F2  MOV     BL,[EAX+ESP+04]
0137:004038F6  LEA     EAX,[EAX+ESP+04]
0137:004038FA  XOR     BL,DL
0137:004038FC  INC     ECX
0137:004038FD  CMP     ECX,00000100
0137:00403903  MOV     [EAX],BL
0137:00403905  JL      004038E0
===============================================

0137:00403907  MOV     EAX,[ESP+04]  <--看看这里,注册码就在这里"0x42056f07"
0137:0040390B  TEST    EAX,EAX
0137:0040390D  JGE     00403911
0137:0040390F  NEG     EAX
0137:00403911  CMP     EAX,[ESP+0000010C]  <--将算到的数值(在AX里)与你输入的(换算后的)想比较
0137:00403918  JNZ     0040392D   <--不相等则跳转
0137:0040391A  TEST    EAX,EAX
0137:0040391C  JZ      0040392D
0137:0040391E  MOV     EAX,00000001
0137:00403923  POP     EBX
0137:00403924  ADD     ESP,00000100
0137:0040392A  RET     0008
0137:0040392D  XOR     EAX,EAX
0137:0040392F  POP     EBX
0137:00403930  ADD     ESP,00000100
0137:00403936  RET     0008

3)整理得:
 Name: Hambo.H
 Registration: 1107652359  (这是将0x42056f07转换回十进制得来的)


4)其实它算注册码的程序很简单,就是循环将前四个字符与后面的进行XOR
  运算,然后存回前四个。
下面是用Turbo C 2.0写的注册器:

#include <stdio.h>
#include <string.h>

void main()
{
 unsigned int i,j,l=0;
 unsigned char name[255];
 unsigned long int sn;
 clrscr();
 printf("Hex Edit 2.1 for Win95 KeyMaker\n");
 printf("Programming by Hambo.H  Cracked by Hambo.H\n");
 printf("Shenzhen China Jan 2 1998\n\n");
 printf("Please Enter Your Name(1-255 Chars): ");
 scanf("%s",name);
 j=0;
 l=strlen(name);
 strupr(name);
 for (i=4;i<l;i++)
 {
  name[j]=name[j]^name[i];
  j++;
  j=j&3;
 }
 sn=name[0]+name[1]*0x100+name[2]*0x10000+name[3]*0x1000000;
 printf("\nRegistration: %ld\n",sn);
}


5)这个软件在注册方面的程序是有一些问题的,你只要是Name小于4个
  字符的,就是用计算器和ASCII表也能很容易算出S/N.
  如:Name为"H"或"h",那它的S/N就是"72",这就是"H"的ASCII码。
      Name为"Hamb","Hamb"对应的大写的ASCII码是0x48 0x41 0x4d 0x42
      则S/N(十六进制)为0x424d4148, 将它换算为十进制就是1112359240。