• 标 题:一连几个软件都无头绪,真不爽,搞个算法来解解气! (3千字)
  • 作 者:LILITH[CNCG]
  • 时 间:2001-12-16 17:27:21
  • 链 接:http://bbs.pediy.com

捷径点点通 2.00注册算法分析!
  
[作 者]:LILITH[CNCG]
[时 间]:2001-12-15
[软 件]:捷径点点通2.00
[软件简介]:大多数人都喜欢走“捷径”,本软件就是为此目的而设计的。当您在地图上选择了“出发地”(起始坐标点)和“目的地”(终止坐标点),然后再点击一下“开始计算最短路径”,接着等待几秒钟,本软件就会自动为您指出“出发地”和“目的地”之间的最短路径,让您轻松找到“捷径”。
[下 载]:http://www.csdn.net/soft/openfile.asp?kind=1&id=13091
[保护方式]:注册码
[破解工具]:trw2000

这是我的第一个算法分析,首先感谢PaulYoung大侠的指点,令我这等菜鸟尝到了注册算法的甜头,如有不对的地方还请各路英雄指正,呵呵……GO!

还是老办法,用TRW2000下断点bpx hmemcpy,中断后7下F12,来到……
0177:004736BA  LEA      EDX,[EBP-10]  \\光标停在这里……
0177:004736BD  MOV      EAX,[EBP-04]
0177:004736C0  MOV      EAX,[EAX+03A0]
0177:004736C6  CALL    004379CC
0177:004736CB  MOV      EAX,[EBP-0C]
0177:004736CE  CALL    00404C1C
0177:004736D3  MOV      [EBP-20],EAX
0177:004736D6  LEA      EAX,[EBP-08]
0177:004736D9  CALL    00404964
0177:004736DE  MOV      EDI,[EBP-20]
0177:004736E1  TEST    EDI,EDI      \\验证输入注册名的位数
0177:004736E3  JNG      0047371D      \\为零则跳
0177:004736E5  MOV      ESI,01        \\ESI初始值为1
0177:004736EA  MOV      EAX,[EBP-0C]
0177:004736ED  XOR      EBX,EBX             \\EBX始值为零
0177:004736EF  MOV      BL,[EAX+ESI-01]       \\取注册名第一位字母的十六进制值
0177:004736F3  IMUL    EAX,[EBP-20],BYTE +6B  \\用注册名位数与6B相乘,结果保存入EAX
0177:004736F7  ADD      EAX,EBX               \\将得出的数与字母的十六进制数相加
0177:004736F9  CDQ   
0177:004736FA  IDIV    ESI     \\将计算结果除以ESI的值,即除1,结果仍保存到EAX
0177:004736FC  MOV      EBX,EAX \\将结果存入EBX
0177:004736FE  LEA      EDX,[EBP+FFFFFE10]
0177:00473704  MOV      EAX,EBX
0177:00473706  CALL    00408C2C
0177:0047370B  MOV      EDX,[EBP+FFFFFE10]
0177:00473711  LEA      EAX,[EBP-08]
0177:00473714  CALL    00404C24
0177:00473719  INC      ESI     \\ESI递增
0177:0047371A  DEC      EDI     \\EDI递减
0177:0047371B  JNZ      004736EA  \\继续往上跳,循环取注册名的第二,三位,直至取完
0177:0047371D  CMP      DWORD [EBP-08],BYTE +00
0177:00473721  JZ      NEAR 004738A1
0177:00473727  MOV      EAX,[EBP-08]
0177:0047372A  MOV      EDX,[EBP-10]
0177:0047372D  CALL    00404D60       \\取完后到这里形成注册码,下D EDX可看到真的注册码。
0177:00473732  JNZ      NEAR 004738A1  \\完成验证,跳转。

总结:此程序通过注册名的长度来计注册码,就是说,注册名越长,注册码也就越长。输入注册名后,程序按位取注册名的字母来计算注册码。先用6B(DEC=107)乘上注册名的位数,如我用CNCG,所以为4,得出的数加上依次取得的每位字符的十六进制值,再除以ESI的值(ESI初始值为1),就得出注册码,例如我的注册名为CNCG,则计算方法是:
C=6b(107)*4+67/1=495 (4为注册名长度;67是C的十六进制值,1是ESI的值,ESI递增1)
N=6b(107)*4+78/2=253
C=6b(107)*4+67/3=165
G=6b(107)*4+71/4=124
  
将4个数串依次起来就是495253165124,这就是注册码了,呵呵……
至此,软件已经成功注册,我的废话也到此结束了,最后,再次感谢PaulYoung大侠的教导!BYE……

  • 标 题:KAO,想不劳而获!!TC注册机!!! (250字)
  • 作 者:plyg
  • 时 间:2001-12-17 10:17:50

#include "stdio.h"
main()
{
  char name[80];
  int namelen,i=0;
  puts("\nPlease input your name:");
  scanf("%s",name);
  namelen=strlen(name);
  puts("Your regcode is:");
  for(i=0;name[i];i++)printf("%d",(0x6b*namelen+name[i])/(i+1));
}

  • 标 题:补上一脚:MASM32注册机! (4千字)
  • 作 者:WenXinJY
  • 时 间:2001-12-17 11:05:32

;jjkg.asm
.386
.model flat,stdcall
option casemap:none
include hd.h
  _WinMain Proto  :DWORD,:DWORD,:DWORD,:DWORD
  Calculation Proto

.const
  DLG_MAIN  equ    1000
  IDC_UN    equ    1001
  IDC_SN    equ    1002
  ID_GEN    equ    1003
  ID_EXIT  equ    1004

.data
MsgCap        db "捷径点点通 2. 5 注册机                by WenXinJY",0
MsgName      db "请输入您的用户名!",0
hInstance    dd 0
UserLen      dd 0
szFormat      db "%i",0
UserID        db 80 dup (0)
SNtmp        db 10 dup (0)
SN            db 200 dup (0)

.radix 16

.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _WinMain,NULL
invoke ExitProcess,NULL

_WinMain  proc    uses ebx edi esi, \
          hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
         
          mov    eax,wMsg
          .if    eax == WM_CLOSE
                invoke    EndDialog,hWnd,NULL
          .elseif eax == WM_INITDIALOG
                  invoke SetWindowText,hWnd,ADDR MsgCap
                  invoke SendDlgItemMessage,hWnd,IDC_SN,EM_SETREADONLY,TRUE,NULL
          .elseif eax == WM_COMMAND
                  mov eax,wParam
                  .IF lParam!=0 
                      .if eax==ID_GEN
                          invoke RtlZeroMemory,addr SN,200 ;注意这里,否则第二次生成的注册码会串在第一次的后面,呵呵
                          invoke GetDlgItemText, hWnd, IDC_UN, addr UserID, 80
                          .if  eax!=NULL
                              mov UserLen,eax
                              invoke Calculation
                              invoke SetDlgItemText, hWnd, IDC_SN, addr SN
                          .else
                              invoke MessageBox,NULL,addr MsgName,addr MsgCap,MB_OK or MB_ICONEXCLAMATION
                          .endif
                      .elseif eax==ID_EXIT
                          invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
                      .endif
                  .ENDIF
          .else
                  mov eax,FALSE
                  ret
          .endif
          mov eax,TRUE
          ret
_WinMain  ENDP       


Calculation Proc
            pushad
            mov ebx,UserLen
            mov eax,6bh
            mul ebx
            mov ebx,eax
            xor ebp,ebp
Next:
            mov eax,ebx
            add al, UserID[ebp]
            adc eax,0  ;加上,取进位
            cdq  ;加上,否则非法操作时别找我
            inc ebp
            div ebp
            push eax
            push offset szFormat
            push offset SNtmp
            call wsprintf
            add esp,4*3
            invoke lstrcat,addr SN,addr SNtmp
            Dec UserLen
            jnz Next
            popad
            ret
Calculation Endp
            End start
;=========================================jjkg.rc
#include <\masm32\include\resource.h>
#define DLG_MAIN  1000
#define IDC_UN    1001
#define IDC_SN    1002
#define ID_GEN    1003
#define ID_EXIT  1004
2      icon      key.ico
DLG_MAIN DIALOG 64,53,240,52
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "捷径点点通 2. 5 注册机                by WenXinJY"
FONT 9, "宋体"
{
DEFPUSHBUTTON "注册", ID_GEN, 200, 8, 30, 14
PUSHBUTTON "退出", ID_EXIT, 200, 26, 30, 14
EDITTEXT IDC_UN, 40, 10, 150, 12, WS_BORDER | WS_TABSTOP
EDITTEXT IDC_SN, 40, 29, 150, 13, WS_BORDER | WS_TABSTOP
LTEXT "用户名:", -1, 8, 12, 30, 10
LTEXT "注册码:", -1, 8, 30, 30, 9
}
;===============================hd.h
      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      include \masm32\include\gdi32.inc
      include \masm32\include\comctl32.inc
      include \masm32\include\comdlg32.inc
      include \masm32\include\shell32.inc
      include \masm32\include\advapi32.inc

      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
      includelib \masm32\lib\gdi32.lib
      includelib \masm32\lib\comctl32.lib
      includelib \masm32\lib\comdlg32.lib
      includelib \masm32\lib\shell32.lib
      includelib \masm32\lib\advapi32.lib

  • 标 题:再补:VB注册机! (416字)
  • 作 者:eCool[BCG]
  • 时 间:2001-12-17 11:30:01

Dim lngLen As String
  Dim strSN As String
  Dim strTmp As String
  Dim i As Long
  Dim j As Long
 
  strTmp = InputBox("请输入用户名")
  lngLen = Len(strTmp)
  If lngLen <= 0 Then
    MsgBox "用户名不能为空!"
    Exit Sub
  End If
 
  strSN = ""
  For i = 1 To lngLen
    j = Asc(Mid(strTmp, i, 1))
    strSN = strSN & CStr((107 * lngLen + j) \ i)
  Next i
   
  MsgBox "注册码为:" & strSN

  • 标 题:我来插一脚,来个delphi的,哈哈~~~~~~ (745字)
  • 作 者:crackjack[CCG]
  • 时 间:2001-12-18 3:43:47

procedure TForm1.Button1Click(Sender: TObject);
var  //定义变量关键词
  name:string;    //定义存放注册名的字符串变量
  namelen:integer;    //定义注册名长度
  code:array of integer;  //定义存放注册码的动态数组,在用动态数组时,在程序中一定要分配空间
  i:integer;      //定义循 环变量
  reg:string;    //注册码
begin
  name:=edit1.Text ; //取注册名
  namelen:=strlen(pchar(name));  //计算注册名长度
  setlength(code,namelen);    //给动态数组code分配数量为namelen长度的空间
  reg:='';              //初始化注册码
  for i:=1 to namelen do
  begin
    code[i-1]:= (107*namelen+ord(name[i])) div i;  //计算注册码
    reg:=reg+inttostr(code[i-1]);  //将注册码转换成字符串
  end;
  edit2.Text :=reg;    //显示注册码
end;

  • 标 题:我又来趁热闹,来个VFP的,嘻嘻~~~~~~ (240字)
  • 作 者:幸运星星
  • 时 间:2001-12-18 10:40:55

acce "请输入用户名:" to N
L = Len(N)
If L <= 0 
    MessageBox("用户名不能为空!")
    retu
EndIf
C = ""
For i = 1 To L
    j = Asc(subs(N, i, 1))
    C = C+allt(Str(int((107*L + j)/i)))
endf
MessageBox("注册码为:" +C)

  • 标 题:想要最小的注册机的进来!!!!编译出来只98字节!!!!!够不够变态???? (894字)
  • 作 者:WenXinJY
  • 时 间:2001-12-18 19:33:40

;==============masm16kg.asm===========
;编译方法(当然得用masm 5.0或其他16位编译器啦):
;masm masm16kg;
;link masm16kg;
;debug masm16kg.exe --> rcx将16F改为6F --> n masm16kg.com --> w --> q
;运行你的作品吧。

code segment
    assume cs:code,ds:code,ss:code
    org 100h
start:
    mov ah,9
    mov dx,offset Msg
    int 21h
    mov ah,0ah
    mov dx,offset szName
    int 21h
    xor cx,cx
    lea si,Buf
    mov ax,107
    mov bl,ReadLen
    mul bl
    mov bp,ax
    mov ah,9
    mov dx,offset Msg2
    int 21h
Next:
    xor ax,ax
    lodsb
    add ax,bp
    inc cx
    xor dx,dx
    div cx
    push cx
    xor cx,cx
Next1:
    test ax,ax
    jz Disp
    xor dx,dx
    mov di,10
    div di
    add dl,'0'
    push dx
    inc cx
    jmp Next1
Disp:
    pop dx
    mov ah,2
    int 21h
    loop Disp
    pop cx
    cmp cl,bl
    jl Next
    int 20h

Msg db "Name:$"
Msg2 db 0ah,"Code:",24h
szName Label byte
NameLen  db 82
ReadLen  db 80
Buf      Label byte
code ends
    end start