• 标 题:出几道关于crack的题给大家做做怎么样? (201字)
  • 作 者:guest
  • 时 间:2000-9-9 22:31:49
  • 链 接:http://bbs.pediy.com

1、
目标:L0phtcrack v2.5
难度:中等偏下
位置:http://www.l0pht.com/l0phtcrack/
要求:说明跟踪过程中关键的步骤、关键的代码;写出注册机;对于同一个serial来说它有几个unlock code?

要不要来点难的?

  • 标 题:破解过程如下。 (5千字)
  • 作 者:xiA Qin
  • 时 间:2000-9-10 7:51:56

目标:L0phtcrack v2.5
位置:http://www.l0pht.com/l0phtcrack/

作    者:xiA Qin
解密日前:2000年9月10日
解密工具:Trw2000 1.22

说    明:本文是在我的软件破解记录上整理出来的。如若有纰漏,请各位大侠多指教!

输入注册信息:

机器码:11363ea34    #此是软件自动生成的。
注册码:1234567890  #任意输入


下指令bpx hmemcpy    //下中断点 

按F5回到程序,按确定,这时会被Trw2000拦截到。

下指令bd *            //屏障中断点

下指令pmodule        //直接跳到程序的领空


按F10来到下面指令
.................

015F:0040630B  LEA      ECX,[ESP+E0]    //载入你输入的注册码的地址。
015F:00406312  PUSH    ECX
015F:00406313  MOV      ECX,EBX
015F:00406315  CALL    0044519A
015F:0040631A  LEA      EDX,[ESP+14]
015F:0040631E  PUSH    EDX
015F:0040631F  PUSH    BYTE +00
015F:00406321  MOV      ECX,ESI
015F:00406323  CALL    00445491
015F:00406328  PUSH    EAX             
015F:00406329  CALL    00401447        //计算注册码的的子程序CALL
015F:0040632E  ADD      ESP,BYTE +08
015F:00406331  LEA      EAX,[ESP+2C]    //下指令d eax,就可以看见第一个正确注册码。
015F:00406335  PUSH    EAX
015F:00406336  PUSH    BYTE +00
015F:00406338  MOV      ECX,EDI
015F:0040633A  CALL    00445491
015F:0040633F  PUSH    EAX
015F:00406340  CALL    00401447      //计算注册码的的子程序CALL
015F:00406345  MOV      EAX,[EBX]
015F:00406347  LEA      ECX,[ESP+1C]    //下指令d ecx,就可以看见第二个正确注册码。
015F:0040634B  PUSH    ECX
015F:0040634C  PUSH    EAX
015F:0040634D  CALL    00426260        //比较注册码的子程序CALL
015F:00406352  ADD      ESP,BYTE +10
015F:00406355  TEST    EAX,EAX        //用eax当注册旗标,EAX=1注册成功
015F:00406357  JZ      004063A2        //
015F:00406359  MOV      EAX,[EBX]
015F:0040635B  LEA      EDX,[ESP+2C]
015F:0040635F  PUSH    EDX
015F:00406360  PUSH    EAX
015F:00406361  CALL    00426260        //比较注册码的子程序CALL
015F:00406366  ADD      ESP,BYTE +08
015F:00406369  TEST    EAX,EAX        //用eax当注册旗标,EAX=1注册成功
015F:0040636B  JZ      004063A2
015F:0040636D  PUSH    BYTE +00
015F:0040636F  PUSH    BYTE +00
015F:00406371  PUSH    DWORD 00483530
015F:00406376  CALL    0045666B        //注册失败
015F:0040637B  PUSH    ESI
015F:0040637C  LEA      ECX,[ESP+E0]
015F:00406383  CALL    0044519A
015F:00406388  LEA      ECX,[ESP+80]
015F:0040638F  CALL    00443922
015F:00406394  CMP      EAX,BYTE +01
015F:00406397  JZ      NEAR 0040630B
015F:0040639D  JMP      0040644B
015F:004063A2  OR      ECX,BYTE -01
015F:004063A5  MOV      DWORD [EBP+C0],00
015F:004063AF  XOR      EAX,EAX
015F:004063B1  MOV      EDI,00483510
015F:004063B6  REPNE SCASB
015F:004063B8  NOT      ECX

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

按F8进去0040634D  CALL    00426260看看程序是如何比较注册码的。

015F:00426260  PUSH    EBP
015F:00426261  MOV      EBP,ESP
015F:00426263  PUSH    EDI
015F:00426264  PUSH    ESI
015F:00426265  PUSH    EBX
015F:00426266  MOV      ESI,[EBP+0C]
015F:00426269  MOV      EDI,[EBP+08]
015F:0042626C  LEA      EAX,[0065D8B8]
015F:00426272  CMP      DWORD [EAX+08],BYTE +00
015F:00426276  JNZ      004262B3
015F:00426278  MOV      AL,FF
015F:0042627A  MOV      EDI,EDI
015F:0042627C  OR      AL,AL    <<--|逐位比较真假注册码。
015F:0042627E  JZ      004262AE    |
015F:00426280  MOV      AL,[ESI]    |
015F:00426282  INC      ESI          |
015F:00426283  MOV      AH,[EDI]    |
015F:00426285  INC      EDI     |
015F:00426286  CMP      AH,AL        |
015F:00426288  JZ      0042627C <<--|
015F:0042628A  SUB      AL,41
015F:0042628C  CMP      AL,1A
。    。      。        。     
。    。      。        。         
。    。      。        。         
015F:00426321  CALL    0042048F
015F:00426326  ADD      ESP,BYTE +04
015F:00426329  MOV      EAX,EBX
015F:0042632B  POP      EBX
015F:0042632C  POP      ESI
015F:0042632D  POP      EDI
015F:0042632E  LEAVE 
015F:0042632F  RET   



==============================================
按F8进入00406329  CALL    00401447进行算法分析:

015F:00403EC0  SUB      ESP,BYTE +0C
015F:00403EC3  MOV      EAX,[ESP+10]
015F:00403EC7  PUSH    BYTE +08
015F:00403EC9  INC      EAX          //EAX=EAX+1
015F:00403ECA  PUSH    EAX
015F:00403ECB  LEA      ECX,[ESP+08]
015F:00403ECF  PUSH    ECX
015F:00403ED0  CALL    0041BCC0     
015F:00403ED5  LEA      EDX,[ESP+1C]
015F:00403ED9  PUSH    EDX
015F:00403EDA  LEA      EAX,[ESP+10]
015F:00403EDE  PUSH    DWORD 00483078
015F:00403EE3  PUSH    EAX
015F:00403EE4  MOV      BYTE [ESP+20],00
015F:00403EE9  CALL    0041BED1     
015F:00403EEE  MOV      ECX,[ESP+28]  //将[ESP+28]移入寄存器ECX。
015F:00403EF2  XOR      ECX,34729803  //ecx=ecx xor 34729803。
015F:00403EF8  MOV      EAX,ECX      //将寄存器ECX的值移入寄存器eax. 
015F:00403EFA  SHL      EAX,1B        //eax逻辑左移27位
015F:00403EFD  SHR      ECX,05        //ecx逻辑右移5位
015F:00403F00  ADD      EAX,ECX      //EAX=EAX+ECX
015F:00403F02  MOV      ECX,[ESP+2C]
015F:00403F06  XOR      EAX,12426571  //eax=eax xor 12426571
015F:00403F0B  PUSH    EAX
015F:00403F0C  PUSH    DWORD 00483070
015F:00403F11  PUSH    ECX
015F:00403F12  MOV      [ESP+34],EAX
015F:00403F16  CALL    0041BE7F
015F:00403F1B  XOR      EAX,EAX
015F:00403F1D  ADD      ESP,BYTE +30
015F:00403F20  RET   

算法总结:
1、将机器码11363ea34转换成1363ea34,也就是取后8位。
2、与34729803做异或运算。
3、逻辑左移27位相加逻辑右移5位
4、在与12426571做异或运算。

计算公式:
A xor 34729803=B
[(B shl 27)+(B SHR 5)] XOR 12426571=C


比如:我的计算机的机器码是11363ea34
      取机器码的后8位,就是1363ea34

1363EA34 XOR 34729803=27117237

[(27117237 SHL 27)+(27117237 SHR 5)] XOR 12426571=[B8000000+1388B91] XOR 12426571=
B9388B91 XOR 12426571=AB7AEEE0



整理一下 (由于每台电脑的机器码不同,所以我的注册码,你可能不能使用):

机器码:11363ea34
注册码:AB7AEEE0
        524a3b72

注册信息在注册表中:
[HKEY_CURRENT_USER\Software\L0pht\L0phtCrack]
"Registration"="524a3b72"

  • 标 题:这对你来说已经很简单了 (1千字)
  • 作 者:1212
  • 时 间:2000-9-11 9:00:29

只需要生成第一个unlock code即可,第二个unlock code实际上可以不必追究了。

                long Serial, Unlock;

                int  len;
                char SerialStr[64];
                char UnlockStr[64];

                len = GetDlgItemTextA(hDlg, IDC_SERIAL, SerialStr, sizeof(SerialStr));
                if ( len != 9)
                {
                    SetDlgItemTextA(hDlg, IDC_UNLOCK, "There must be 9 chars in your serial.");
                    return FALSE;
                }

                sscanf(SerialStr+1, "%08lx", &Serial);
                _asm
                {
                    pushad

                    MOV      ECX,[Serial]
                    XOR      ECX,0x34729803
                    MOV      EAX,ECX
                    SHL      EAX,0x1B
                    SHR      ECX,0x05
                    ADD      EAX,ECX
                    XOR      EAX,0x12426571
                    mov      [Unlock], eax

                    popad
                }

                sprintf(UnlockStr, "%08lx", Unlock);
                SetDlgItemTextA(hDlg, IDC_UNLOCK, UnlockStr);