• 标 题:EmEditor 3.28 简体中文版
  • 作 者:风马
  • 时 间:2003/03/07 08:19pm
  • 链 接:http://bbs.pediy.com

目标软件: EmEditor 3.28 简体中文版

文件大小: 1086 KB

使用平台: Win9x/NT/2000/XP

软件授权: 共享软件

使用限制: 功能限制

文件大小: 1086 KB

下载地址: http://www.emurasoft.com/pub/eme328cs.exe


软件简介: 大名鼎鼎的 EmEditor 是一款优秀的文字处理软件,与同类软件相比,它具有轻便快速的优点。它的功能非常强大,不管你的文章是否含有换行符、即使容量为几MB的文件也可以很快地打开编辑;通过插件导入支持,几乎可实现所有的特殊功能;键盘、工具列、菜单、字型和色彩等的自订功能,实现轻松编辑。EmEditor还获得了“Designed for Windows”徽标认证,可在各操作系统下获得最佳的性能体验。网页设计者用它来编辑HTML或者Perl程序文件,程序员用它来编辑源程序,普通用户用它作为记事本——这正是它的出众之处。新版本更新内容:在检索,替换以及在文档中检索的时候,增加了利用正规表现的方法,增加了“终了后关闭”的勾选栏;解决了在tag jump时,如果文件不存在,会出现的异常结束的问题;勾选“以空格代替tab插入”后,如果输入tab,就会自动将tab变为空格;在命令栏中增加了“不增加最近使用过的文档的快速路径”选项。

使用工具: TRW2000 v1.22

破解过程:

输入序列号:1000-2000-3000-4000,记为SN(1)-SN(2)-SN(3)-SN(4)。

Hmemcpy 设断,来到:

CMP      EAX,03F1
JNZ      004196DE
PUSH     BYTE +01
CALL     00418CF1
MOV      ESI,EAX
CMP      ESI,EBX
JZ       004196C7
PUSH     ESI
CALL     004194AA           / * Shit!竟然不符合人体工程学!追进!* /
CMP      EAX,EBX
JNG      004196A4           / * 跳走就 Game Over !* /
XOR      ECX,ECX
CMP      EAX,BYTE +02
SETZ     CL
MOV      [00447B74],EAX
PUSH     BYTE +40
ADD      ECX,0455
JMP      SHORT 004196BA
JZ       004196C0
XOR      ECX,ECX
CMP      EAX,BYTE -02
SETNZ    CL
PUSH     BYTE +30
DEC      ECX
AND      ECX,BYTE +03
ADD      ECX,0454
PUSH     ECX
CALL     0041ABEA             / * Call 对话框 * /
PUSH     ESI
CALL     `ADVAPI32!RegCloseKey`
LEA      ECX,[EBP+08]
CALL     0040C0AA
XOR      EAX,EAX
MOV      [004499A4],BL
INC      EAX
POP      ESI
POP      EBX
LEAVE  
RET      04

PUSH     EBP
MOV      EBP,ESP
SUB      ESP,BYTE +30
PUSH     ESI
PUSH     BYTE +02
PUSH     DWORD 004464F8
LEA      EAX,[EBP-30]
PUSH     DWORD 0043FBB8
PUSH     EAX
CALL     `USER32!wsprintfA`
MOV      ESI,[0043F004]
AND      DWORD [EBP-04],BYTE +00
ADD      ESP,BYTE +10
LEA      EAX,[EBP-04]
PUSH     EAX
PUSH     BYTE +00
LEA      EAX,[EBP-08]
PUSH     EAX
PUSH     BYTE +00
LEA      EAX,[EBP-30]
PUSH     EAX
PUSH     DWORD [EBP+08]
CALL     ESI
TEST     EAX,EAX
JNZ      0041951F
CMP      DWORD [EBP-08],BYTE +03
JNZ      0041951F
CMP      DWORD [EBP-04],BYTE +08
JNZ      0041951F
LEA      EAX,[EBP-04]
PUSH     EAX
LEA      EAX,[EBP-10]
PUSH     EAX
LEA      EAX,[EBP-08]
PUSH     EAX
PUSH     BYTE +00
LEA      EAX,[EBP-30]
PUSH     EAX
PUSH     DWORD [EBP+08]
CALL     ESI
TEST     EAX,EAX
JNZ      0041951F
LEA      EAX,[EBP-10]
PUSH     EAX
CALL     00423EDA          / * 兵来将挡,“你”来我访!* /
JMP      SHORT 00419521
XOR      EAX,EAX
POP      ESI
LEAVE  
RET      04

PUSH     ESI
MOV      ESI,[ESP+08]
MOVZX    EAX,WORD [ESI]    / * SN(1)的十六进制值送入 EAX * /
PUSH     BYTE +0A          / * 0xA 入栈 * /
CDQ    
POP      ECX               / * ECX 出栈 * /
IDIV     ECX               / * 除以 ECX * /
CMP      EAX,AB            / * 比较商是否等于0xAB * /
JZ       00423EF4          / * 是就进入下一步计算 * /
OR       EAX,BYTE -01
JMP      SHORT 00423F12    / * 否则返回 * /


从上面我们知道: SN(1)/0xA=0xAB,即 SN(1)=0xAB*0xA=0x6AE。

哎,等等先~!我以前校队球衣号码是7号,那就:SN(1)=0x6AE+0x7=0x6B5 吧 :)!

重新填入注册信息继续:

PUSH     EDI
MOV      DI,[ESI+06]
PUSH     ESI
CALL     00423DD1          / * 可疑呀~~~ * /
CMP      EAX,BYTE +01      / * EAX 必须等于 1 哦 * /
JNZ      00423F11          / * 跳走就 Game Over !

PUSH     ECX
PUSH     ESI
MOV      ESI,[ESP+0C]
MOV      AX,[ESI+02]       / * SN(2) 送入 AX * /
AND      WORD [ESI+06],BYTE +00
CMP      AX,270F
JA       NEAR 00423ED2     / * 大于 0x270F 就 Game Over !
MOV      DX,[ESI+04]       / * SN(3) 送入 DX * /
CMP      DX,270F
JA       NEAR 00423ED2     / * 大于0x270F 就跳向 423ED2 * /
TEST     AX,AX             / * 测试 SN(2) * /
JZ       NEAR 00423ECE     / * 为空就跳向 423ECE * /
CMP      AX,08AE           / * 比较 AX 是否等于 0x8AE * /
JZ       NEAR 00423ECE     / * 为空就跳向 423ECE * /
CMP      AX,162E           / * 比较 AX 是否等于 0x162E * /
JZ       NEAR 00423ECE     / * 为空就跳向 423ECE * /
CMP      AX,2516           / * 比较 AX 是否等于 0x2516 * /
JZ       NEAR 00423ECE     / * 为空就跳向 423ECE * /
XOR      ECX,ECX           / * ECX 清零 * /
MOV      CX,[ESI]          / * SN(1)送入 CX * /
CMP      CX,06AE           / * 比较是否等于 0x6AE * /
MOV      [ESP+04],ECX      / * ECX 的值送入[ESP+4]处 * /
JZ       NEAR 00423ECE     / * 是就送你回姥姥家!
CMP      AX,0B2C           / * 比较 SN(2)是否等于 0xB2C  * /
JZ       NEAR 00423ECE     / * 是就 Game Over !
CMP      AX,1F80           / * 比较 SN(2)是否等于 0x1F80  * /
JZ       NEAR 00423ECE     / * 是就 Game Over !
PUSH     EBX
MOVZX    EAX,AX            / * SN(2)的值送入 EAX * /
PUSH     EBP
PUSH     EDI
MOVZX    EDI,DX            / * SN(3)的值送入 EDI * /
MOV      [ESP+18],EAX      / * EAX 的值送入 [ESP+18]处 * /
PUSH     BYTE +64          / * 0x64 入栈 * /
POP      EBX               / * EBX 出栈 * /
MOV      EAX,EDI           / * EDI 送入 EAX * /
CDQ    
IDIV     EBX               / * 除以 EBX * /
PUSH     BYTE +0A          / * 0xA 入栈 * /
POP      EBP               / * EBP 出栈 * /
MOVZX    ECX,CX            / * SN(1)送入 ECX * /
PUSH     BYTE +64
MOV      EBX,EAX           / * EAX 送入 EBX * /
MOV      EAX,ECX           / * ECX 送入 EAX * /
CDQ    
IDIV     EBP               / * 除以 EBP * /
MOV      EDX,[ESP+1C]      / * SN(2)送入 EDX * /
ADD      EDX,EBX           / * EDX + EBX * /
ADD      EAX,EDX           / * EAX + EDX * /
ADD      EAX,EDI           / * EAX + EDI * /
CDQ    
POP      EDI               / * SN(3)出栈 * /
IDIV     EDI               / * 除以 EDI * /
MOV      EAX,[ESP+18]      / * SN(2)送入 EAX * /
PUSH     BYTE +64          / * 0x64 入栈 * /
POP      EBX               / * EBX 出栈 * /
PUSH     BYTE +64
POP      EBP               / * EBP 出栈 * /
PUSH     EBP
MOV      DI,[EDX*4+00446B10]   / * 查表取值 * /
CDQ    
IMUL     DI,DI,BYTE +64    / * 乘以 0x64 * /
IDIV     EBX               / * 除以 EBX * /
MOV      EBX,EAX           / * EAX 送入 EBX * /
MOV      EAX,ECX           / * ECX 送入 EAX * /
CDQ    
IDIV     EBP               / * 除以 EBP * /
ADD      ECX,EBX           / * ECX + EBX * /
ADD      EAX,ECX           / * EAX + ECX * /
POP      ECX               / * ECX 出栈 * /
CDQ    
IDIV     ECX               / * 除以 ECX * /
ADD      DI,[EDX*4+00446B10]   / * 查表取值 * /
CMP      WORD [ESP+10],06B3    / * 比较 SN(1) 是否等于 0x6B3 * /
MOV      [ESI+06],DI       / * DI 的值 送入 ESI+06 处 * /
POP      EDI               / * SN(4)出栈 * /
POP      EBP
POP      EBX
JZ       00423EC9          / * 是就跳向教学注册版本 * /
CMP      WORD [ESP+04],06B2    / * 比较SN(1)是否等于 0x6B2 * /
JZ       00423EC9          / * 是就跳向教学注册版本 * /
XOR      EAX,EAX           / * 否则将 EAX 清零 * /
INC      EAX               / * EAX + 1 * /
JMP      SHORT 00423ED5    / * 成功返回 * /
PUSH     BYTE +02          / * 0x2 入栈 * /
POP      EAX               / * EAX 出栈 * /
JMP      SHORT 00423ED5
PUSH     BYTE -02          / * 0xFFFFFFFE 入栈 * /
JMP      SHORT 00423ECB
OR       EAX,BYTE -01      / * EAX 与 0xFFFFFFFF 做与运算 * /
POP      ESI
POP      ECX
RET      04                / * 返回 * /

XOR      EAX,EAX           / * EAX 清零 * /
CMP      DI,[ESI+06]       / * 关键比较 * /
SETZ     AL                / * 相等就将 AL 置 1 * /
LEA      EAX,[EAX+EAX-01]  / * 将 EAX+EAX-1 的值保存到 EAX * /
POP      EDI
POP      ESI
RET      04                / * 返回 * /


附表:

0030:00446B10 26 00 00 00 5B 00 00 00-62 00 00 00 36 00 00 00 &...[...b...6...
0030:00446B20 34 00 00 00 60 00 00 00-13 00 00 00 35 00 00 00 4...`.......5...
0030:00446B30 19 00 00 00 54 00 00 00-3F 00 00 00 44 00 00 00 ....T...?...D...
0030:00446B40 4C 00 00 00 38 00 00 00-5D 00 00 00 33 00 00 00 L...8...]...3...
0030:00446B50 56 00 00 00 61 00 00 00-42 00 00 00 21 00 00 00 V...a...B...!...
0030:00446B60 3E 00 00 00 2D 00 00 00-23 00 00 00 0E 00 00 00 >...-...#.......
0030:00446B70 1E 00 00 00 5F 00 00 00-57 00 00 00 12 00 00 00 ...._...W.......
0030:00446B80 1B 00 00 00 17 00 00 00-22 00 00 00 58 00 00 00 ........"...X...
0030:00446B90 2C 00 00 00 63 00 00 00-5C 00 00 00 18 00 00 00 ,...c...\.......
0030:00446BA0 37 00 00 00 41 00 00 00-59 00 00 00 4D 00 00 00 7...A...Y...M...
0030:00446BB0 15 00 00 00 5A 00 00 00-53 00 00 00 0B 00 00 00 ....Z...S.......
0030:00446BC0 05 00 00 00 1C 00 00 00-10 00 00 00 2E 00 00 00 ................
0030:00446BD0 49 00 00 00 40 00 00 00-0D 00 00 00 07 00 00 00 I...@...........
0030:00446BE0 50 00 00 00 3D 00 00 00-32 00 00 00 46 00 00 00 P...=...2...F...
0030:00446BF0 0A 00 00 00 43 00 00 00-2B 00 00 00 00 00 00 00 ....C...+.......
0030:00446C00 3B 00 00 00 48 00 00 00-5E 00 00 00 4E 00 00 00 ;...H...^...N...
0030:00446C10 51 00 00 00 1F 00 00 00-20 00 00 00 3A 00 00 00 Q....... ...:...
0030:00446C20 01 00 00 00 2A 00 00 00-45 00 00 00 55 00 00 00 ....*...E...U...
0030:00446C30 4A 00 00 00 02 00 00 00-52 00 00 00 27 00 00 00 J.......R...'...
0030:00446C40 03 00 00 00 4B 00 00 00-08 00 00 00 3C 00 00 00 ....K.......<...
0030:00446C50 0F 00 00 00 14 00 00 00-24 00 00 00 25 00 00 00 ........$...%...
0030:00446C60 28 00 00 00 29 00 00 00-16 00 00 00 1D 00 00 00 (...)...........
0030:00446C70 1A 00 00 00 11 00 00 00-2F 00 00 00 39 00 00 00 ......../...9...
0030:00446C80 09 00 00 00 47 00 00 00-06 00 00 00 4F 00 00 00 ....G.......O...
0030:00446C90 04 00 00 00 31 00 00 00-0C 00 00 00 30 00 00 00 ....1.......0...
0030:00446CA0 01 00 00 00 01 00 00 00-FF FF FF FF FF FF FF FF ........

呵呵,好像长征一样!不过总算写完了!:)

写了个小程序,删掉了前面的地址,这下初学者朋友就不会“偷懒”了!:)

总结一下吧:

 1:序列号只能为数字;

 2:SN(1)<> 0x6AE、0x6B2、0x6B3;

 3:SN(2)<>0xB2C、0x1F80、0x8AE、0x162E、0x2516;

 4:(SN(1)/0xA+SN(2)+SN(3)/0x64+SN(3)) MOD 0x64;

 5:根据步骤 4 的结果查表取值,然后乘以 0x64;

 6:(SN(1)+SN(1)/0x64+SN(2)/0x64)) MOD 0x64;

 7:根据步骤 6 的结果查表;
 
 8:SN4 = 步骤 5 的结果 + 步骤 7 的结果。

剩下的工作就是写注册机了:

#include <stdlib.h>
main()
{ int sn1,sn2,sn3,sn4,i,p,q,data[]={0x26,0x5B,0x62,0x36,0x34,0x60,0x13,0x35,0x19,0x54,0x3F,0x44,0x4C,0x38,0x5D,0x33,0x56,0x61,0x42,0x21,0x3E,0x2D,0x23,0x0E,0x1E,0x5F,0x57,0x12,0x1B,0x17,0x22,0x58,0x2C,0x63,0x5C,0x18,0x37,0x41,0x59,0x4D,0x15,0x5A,0x53,0x0B,0x05,0x1C,0x10,0x2E,0x49,0x40,0x0D,0x07,0x50,0x3D,0x32,0x46,0x0A,0x43,0x2B,0x00,0x3B,0x48,0x5E,0x4E,0x51,0x1F,0x20,0x3A,0x01,0x2A,0x45,0x55,0x4A,0x02,0x52,0x27,0x03,0x4B,0x08,0x3C,0x0F,0x14,0x24,0x25,0x28,0x29,0x16,0x1D,0x1A,0x11,0x2F,0x39,0x09,0x47,0x06,0x4F,0x04,0x31,0x0C,0x30,0x01,0x01,0xFF};

 clrscr();  

 randomize();
 
 printf("*****************************************************\n");
 printf("*                  EmEditor 3.28 Keygen             *\n");
 printf("*                     Made by fengma                *\n");
 printf("*                  Mail:fengma@2911.net             *\n");
 printf("*****************************************************\n");

 printf("\nYour registration code:");

 for(i=0;;i++)
   {sn1=random(10)+0x6AE;
    if(sn1/0xA==0xAB&&(sn1)!=0x6AE&&(sn1)!=0x6B2&&(sn1)!=0x6B3&&(sn1)!=0x0)
       break;
   }
 printf("%d",sn1);

 printf("-");


 for(i=0;;i++)
   {sn2=random(10000);
    if((sn2)!=0xB2C&&(sn2)!=0x1F80&&(sn2)!=0x8AE&&(sn2)!=0x162E&&(sn2)!=0x2516&&(sn2)!=0x0)
       break;
   }
  if     (sn2<10)   printf("000%d",sn2);
  else if(sn2<100)  printf("00%d",sn2);
  else if(sn2<1000) printf("0%d",sn2);
  else              printf("%d",sn2);

 printf("-");

 sn3=random(10000);
  if     (sn3<10)   printf("000%d",sn3);
  else if(sn3<100)  printf("00%d",sn3);
  else if(sn3<1000) printf("0%d",sn3);
  else              printf("%d",sn3);

 printf("-");

 p=(sn1/0xA+sn2+sn3/0x64+sn3)%0x64;
 q=(sn1+sn1/0x64+sn2/0x64)%0x64;
 sn4=data[p]*0x64+data[q];
  if     (sn4<10)   printf("000%d",sn4);
  else if(sn4<100)  printf("00%d",sn4);
  else if(sn4<1000) printf("0%d",sn4);
  else              printf("%d",sn4);

 printf("\n");

 getch();
}


fengma[BCG] Cracked

17:48 02-15-2003