首页
社区
课程
招聘
[原创]HapptownCrackme003_Keygen.exe_Delphi版内联汇编
发表于: 2006-10-29 13:16 5194

[原创]HapptownCrackme003_Keygen.exe_Delphi版内联汇编

2006-10-29 13:16
5194
为了不违背HappyTowm的本意,不发破文,让别人也有练习的机会,所以只发注册机源码。
以下是HappyTown的Crackme003 的注册机。
本Crackme用到了浮点运算,我靠,不知道如何装载,
Laomms安在???指点一二。
本注册机采用了变通的办法,处理Round()函数。

//=============================================================//
//=====做一个给自已使用的 Delphi版本的注册机模板 ==============//
//========= wofan[OCN][PYG][DCG] 2006-10-28  ==================//
//=============================================================//
program Keygen;
uses
  windows,
  SysUtils,//用来支持:File_Dir:=ExtractFilePath(paramStr(0)); //提取程序所在目录
  ShellAPI, //仅仅是用它来支持链接
  Messages;
{$R KeygenRc.RES}
var
  Cap_Rect:TRECT;     //标题栏RECT,需要保存备用(移动Form),定义为全局变量
  h_BRUSH:HBRUSH;     //画刷标题栏的画刷
  h_BRUSH_2:HBRUSH;   //画边框的画刷
  File_Dir:String;    //该程序所在目录     
  h_Cur:HCURSOR;      //动画光标句柄
  L_Cur:HCURSOR;      //链接用的光标
  h_Icon:HICON;       //图标句柄
  mName:array[0..255] of byte;   //注册名
  mCode:Array[0..255]of char;     //注册码
//===============================================================
Const
//===============================================================
IDD_MAIN=101;       //主对话框控件
IDB_BMP=102;       //位图资源ID-看雪学院
IDI_ICON=103;       //图标资源ID-[OCN]
IDC_Cur=104;        //链接用的光标
//----------------------------------------------
IDC_ICON=1000;      //装载图标的图像控件
IDC_N =1001;      //注册名Label
IDC_Name =1002;      //注册名   Edit
IDC_C=1003;      //注册码Label
IDC_Code=1004;      //注册码   Edit
IDC_wofan=1005;      //破解人   Label
IDC_Time=1006;      //破解时间 Label
IDC_OK=1007;      //确定按钮
IDC_About=1008;      //关于按钮
IDC_Cancel=1009;     //取消按钮
IDC_Close=1010;      //标题栏上的关闭按扭
IDC_BMP= -1;        //装载位图的控件
//===============================================================

//=======================以下资源在发布时即时修改========================
//------------------------------------------------------------------------
AboutText='本Keygen模板由wofan[OCN]制作'+#13+'这是HappyTown系列Crackme的注册机之一'; //关于Messagebox的Text
AboutTitle='wofan[OCN]';                        //MessageBox的Title

MainCaption='Crackme003_Keygen';                       //主对话框的Caption
Time='2006-10-28';                              //发布时间
Author='wofan[OCN]';                            //发布者名号
//------------------------------------------------------------------------
//=======================================================================

//-----------------------------------------------------------------------
//=============  函数,过程,回调函数  ==================================
//=======================================================================

procedure wofanKeygen(hdlg:HWND);
var
  Title,text:string;
const
  temp:array[0..35] of char=('A','B','C','D','E','F',
  'G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V',
  'W','X','Y','Z','0','1','2','3','4','5','6','7','8','9');
Begin
  Title:='提示';
  Text:='注册名至少3位!';
  ZeroMemory(@mCode,sizeof(mCode));
  ZeroMemory(@mName,sizeof(mName));
  GetDlgItemText(hDlg,IDC_Name,@mName,sizeof(mName));

  asm
    LEA ESI,mName  //把注册名的地址传到ESI
    cmp eax,3      //EAX 是GetDlgItemText函数返回值,它是字串实际长度
    Jl @Err        //注册名不少于3位,这是HappyTowm规定的。
    mov edi,1
    mov ecx,eax
    mov ebx,0
@loop:
    xor eax,eax
    mov al,byte ptr ds:[ESI]
    inc  bx
    imul ax,bx
    add edi,eax
    inc esi
    dec cx
    jnz @loop
    imul edi,147D5H
    lea esi,mCode    //传注册码的地址
    lea ebx,temp     //传一张表的地址
    mov eax,edi
@Gen:
    cdq
    mov ecx,24H
    idiv ecx
    mov dl,byte ptr ds:[ebx+edx]
    mov byte ptr ds:[esi],dl  //查表得到相应的注册码
    inc esi

    xor edx,edx
    mov eax,edi
    mov ecx,3
    div ecx
/////////////////////////这里起着取Round()的作用
    cmp edx,1
    jbe @noAdd
    add eax,1
@noAdd:
    mov edi,eax
/////////////////////// 还不如不用汇编,我靠!
    test eax,eax
    jbe @End
    jmp @Gen
@Err:
    push 0
    MOV EAX,DWORD PTR SS:[Title]
    PUSH EAX
    MOV EAX,DWORD PTR SS:[Text]
    PUSH EAX
    PUSH MB_OK
    Call MessageBox      //提示:注册名长度至少要3位
@End:
  End;  //End ASM
End;
//浮点如何内联汇编?这个Crackme用到了浮点,但是不知如何汇编?
//从百度知道:完全使用浮点指令写程序几乎是不可能的。
//希望有大侠指导。
//先多谢了。
//=======================================================================
Function LinkProc(LinkCtl:HWND;uMsg,wParam,lParam:DWORD):LRESULT;stdcall;
Begin
  Result:=0;
  Case uMsg of
    WM_SETCURSOR:
    Begin
      SetCursor(L_Cur);
    End;
    WM_NCHITTEST:
    Begin
      Result:=1;
    End;
    WM_LBUTTONUP:
    Begin
      ShellExecute(0,nil,'http://www.pediy.com',nil,nil,0);//链接到:看雪学院
    End
    else
    Begin
      CallWindowProc(Pointer(GetWindowLong(LinkCtl,GWL_USERDATA)),LinkCtl,uMsg,wParam,lParam);
    End;
  end;
End;

procedure MoveToCentre(hDlg:HWND);   //窗口启动中在屏幕中心显示
Var
  D_Rect:TRECT;   //本程序的RECT
  S_Rect:Trect;   //DeskTop 的RECT,实际上就是SCREEN了。
  S_Hwnd:HWND;    //DeskTop 的句柄
Begin
  GetWindowRECT(hDlg,D_Rect);
  S_Hwnd:=GetDesktopwindow;
  GetWindowRect(s_Hwnd,S_Rect);
  moveWindow(hDlg,(S_Rect.right-D_Rect.Right)div 2 ,(S_Rect.Bottom-D_Rect.Bottom ) div 2,D_Rect.Right ,D_Rect.Bottom,true);
End;

Function GetOS:string;
var
  OS: OSVERSIONINFO;
  OS_Str:string;
begin
  ZeroMemory(@OS,sizeof(OS));
  OS.dwOSVersionInfoSize :=sizeof(OSVERSIONINFO);
  GetVerSionEx(OS);
  OS_Str:='你使用非Windows操作系统';
  if (OS.dwPlatformId = VER_PLATFORM_WIN32_NT) and
     (OS.dwMajorVersion = 5) and (OS.dwMinorVersion =1)
     then OS_str:='你使用WinXP'+' '+OS.szCSDVersion;
if (OS.dwPlatformId = VER_PLATFORM_WIN32_NT) and
     (OS.dwMajorVersion = 5) and
     (OS.dwMinorVersion =0)
     then OS_str:='你使用Win2K'+' '+OS.szCSDVersion;
if (OS.dwPlatformId = VER_PLATFORM_WIN32_NT) and
     (OS.dwMajorVersion = 4)
     then OS_str:='你使用WinNT'+' '+OS.szCSDVersion;
if (OS.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS)
     then OS_str:='你使用Win9X'+' '+OS.szCSDVersion;
Result:=OS_str;
end;

Procedure DialogInit(hDlg:HWND);
Begin
  SetDlgItemText(hDlg,IDC_Time,Time);
  SetDlgItemText(hDlg,IDC_wofan,Author);
  SetDlgItemText(hDlg,IDC_Name,Pchar('wofan'));
  setWindowText(hDlg,mainCaption);
  if h_Cur<>0 then
  Begin
    SetClassLong(hDlg,GCL_HCURSOR,h_Cur);          //设置动画光标
    SetClassLong(GetDlgItem(hDlg,IDC_Name),GCL_HCURSOR,h_Cur); //各个控件有同样的光标
    SetClassLong(GetDlgItem(hDlg,IDC_Code),GCL_HCURSOR,h_Cur);
    SetClassLong(GetDlgItem(hDlg,IDC_OK),GCL_HCURSOR,h_Cur);
    SetClassLong(GetDlgItem(hDlg,IDC_About),GCL_HCURSOR,h_Cur);
    SetClassLong(GetDlgItem(hDlg,IDC_Cancel),GCL_HCURSOR,h_Cur);
  End;                     

  SendMessage(hDlg,WM_SETICON,ICON_SMALL,h_Icon);//设置图标 ,ICON_SMALL=0  ICON_Big=1, ICON_Small2=2
  setfocus(getDlgItem(hDlg,IDC_Name));           //使注册名的Edit控件获得焦点
End;

Function MainProc(hDlg:HWND;uMsg,wParam,lParam:DWORD):LRESULT;stdcall;  //加上stdcall 这是回调函数
var
  sPaint:PaintStruct;  //用来获取DC
  Cap_PT:TPOINT;       //点结构,用来保存鼠标点击位置,确定是否可以移动Form
  DC:HDC;              //场景句柄

  LinkHwnd:HWND;       //链接
  SetLongRet:LONGINT;  //链接
Begin
  Result:=0;    //初始化函数返回值,返回零
  Case uMsg of
    WM_INITDIALOG:
    Begin
      DialogInit(hDlg);
      MoveToCentre(hDlg);
      
      LinkHwnd:=GetDlgItem(hDlg,IDC_BMP);
      SetLongRet:=SetWindowLong(LinkHWND,GWL_WNDPROC,Longword(@LinkProc));
      SetWindowLong(LinkHWND,GWL_USERDATA,SetLongRet);
    End;

    WM_LBUTTONDOWN:
    Begin
      Cap_PT.X:=lParam and $FFFF;
      Cap_PT.Y:=lParam SHR 16;
      if PTInRect(Cap_Rect,Cap_PT) then
      Begin
        PostMessage(hDlg,WM_NCLBUTTONDOWN,HTCAPTION,0); //转换消息,单击Form如同单击标题栏
      End;
    End;

    WM_Paint:
    Begin
      GetClientRect(hDlg,Cap_Rect);
      DC:=BeginPaint(hDlg,sPaint);
      FrameRect(DC,Cap_Rect,h_Brush_2);   //画外框
      Cap_Rect.Bottom:=Cap_Rect.Top+25;
      Cap_Rect.Left:=Cap_Rect.Left+2;
      Cap_Rect.Top:=Cap_Rect.Top+2;
      Cap_Rect.Right :=Cap_Rect.Right -2;
      FillRect(DC,Cap_Rect,h_Brush);    //填充标题栏
     
      if h_Icon<>0 Then
      Begin
        DrawIconEx(DC,4,4,h_Icon,$10,$10,0,0,3);
      End;
      SetBKMode(DC,TRANSPARENT);   //设置背景透明,标题栏的画出的文字背景色不再是难看的白色
      DrawText(DC,MainCaption,-1,Cap_Rect,DT_CENTER OR DT_SINGLELINE OR DT_VCENTER); //居中单行绘制文本
      EndPaint(hDlg,sPaint);
    End;

    WM_COMMAND:
    Begin
      Case wParam and $FFFF of
        IDC_OK:
        Begin
          wofanKeygen(hDlg);
          SetDlgItemText(hdlg,IDC_Code,@mCode);
        End;
        IDC_About:
        Begin
          MessageBox(hDlg,pchar(AboutText+#13+GetOS),AboutTitle,MB_OK or MB_ICONINFORMATION);
        End;
        IDC_Cancel:
        Begin
          EndDialog(hDlg,0);
        End;
        IDC_Close:
        Begin
          EndDialog(hDlg,0);
        End;
        IDC_Name:
        Begin
          Case wParam shr 16 of
            EN_CHANGE:
            Begin
              wofanKeygen(hDlg);
              SetDlgItemText(hdlg,IDC_Code,@mCode);
            End;
          End;  //end---wParam shr 16 of---- case
        End; //End ----IDC_Name ----Begin
      End; //End----WM_Command----Case
    End; //End ----WM_Command---- Begin
  End; //End ---Umsg----case
End; //End -----Function

Begin
  h_Brush:=CreateSolidBrush($C0C0D0);     //这里可以设置画刷
  h_Brush_2:=CreateSolidBrush($1F1F1F);
  File_Dir:=ExtractFilePath(paramStr(0)); //提取程序所在目录
  h_Cur:=loadCursorFromFile(pchar(file_Dir+'[OCN]Mouse.ani'));
  L_Cur:=LoadCursor(hInstance,MakeintResource(IDC_Cur));
  h_Icon:=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON));
  DialogBox(hInstance,LPCTSTR(IDD_MAIN),0,@MainProc);
  DeleteObject(h_Brush);
  DeleteObject(h_Brush_2);
  ExitProcess(0);
End.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 222
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
不能内联汇编,就直接用汇编好了,看这个代码与汇编代码差别不大
2006-10-29 15:11
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
3
这是HappyTown的第五个Crackme的注册机

(附注:他的第四个Crackme注册算法与注册名无关)

//=============================================================//
//=====做一个给自已使用的 Delphi版本的注册机模板 ==============//
//========= wofan[OCN][PYG][DCG] 2006-10-28  ==================//
//=============================================================//
program Keygen;
uses
  windows,
  SysUtils,//用来支持:File_Dir:=ExtractFilePath(paramStr(0)); //提取程序所在目录
  ShellAPI, //仅仅是用它来支持链接
  Messages;
{$R KeygenRc.RES}
var
  Cap_Rect:TRECT;     //标题栏RECT,需要保存备用(移动Form),定义为全局变量
  h_BRUSH:HBRUSH;     //画刷标题栏的画刷
  h_BRUSH_2:HBRUSH;   //画边框的画刷
  File_Dir:String;    //该程序所在目录     
  h_Cur:HCURSOR;      //动画光标句柄
  L_Cur:HCURSOR;      //链接用的光标
  h_Icon:HICON;       //图标句柄
  mName:array[0..255] of byte;   //注册名
  mCode:Array[0..255]of byte;     //注册码
//===============================================================
Const
//===============================================================
IDD_MAIN=101;       //主对话框控件
IDB_BMP=102;       //位图资源ID-看雪学院
IDI_ICON=103;       //图标资源ID-[OCN]
IDC_Cur=104;        //链接用的光标
//----------------------------------------------
IDC_ICON=1000;      //装载图标的图像控件
IDC_N =1001;      //注册名Label
IDC_Name =1002;      //注册名   Edit
IDC_C=1003;      //注册码Label
IDC_Code=1004;      //注册码   Edit
IDC_wofan=1005;      //破解人   Label
IDC_Time=1006;      //破解时间 Label
IDC_OK=1007;      //确定按钮
IDC_About=1008;      //关于按钮
IDC_Cancel=1009;     //取消按钮
IDC_Close=1010;      //标题栏上的关闭按扭
IDC_BMP= -1;        //装载位图的控件
//===============================================================

//=======================以下资源在发布时即时修改========================
//------------------------------------------------------------------------
AboutText='本Keygen模板由wofan[OCN]制作'+#13+'这是HappyTown系列Crackme的注册机之一'; //关于Messagebox的Text
AboutTitle='wofan[OCN]';                        //MessageBox的Title

MainCaption='Crackme005_Keygen';                       //主对话框的Caption
Time='2006-10-29';                              //发布时间
Author='wofan[OCN]';                            //发布者名号
//------------------------------------------------------------------------
//=======================================================================

//-----------------------------------------------------------------------
//=============  函数,过程,回调函数  ==================================
//=======================================================================

procedure wofanKeygen(hdlg:HWND);
var
  Title,text:string;
const
  temp:array[0..25]of char=('~','!','@','#','$','%','^','&',
  '*','(',')','_','+','|','\','=','-','/','?','.',
  ',','>','<',';',':','`');
Begin
  Title:='提示';
  Text:='注册名至少4位!';
  ZeroMemory(@mCode,sizeof(mCode));
  ZeroMemory(@mName,sizeof(mName));
  GetDlgItemText(hDlg,IDC_Name,@mName,sizeof(mName));
  asm
    LEA ESI,mName  //把注册名的地址传到ESI
    cmp eax,4   //EAX 是GetDlgItemText函数返回值,它是字串实际长度
    JL @Err
    test al,1    //效验奇偶
    Je @Noadd
    mov byte ptr ds:[esi+eax],'*'
    inc eax
@Noadd:
    lea ebx,temp  //临时字串的地址
    lea edi,mCode //注册码
    shr eax,1     //分组
@loop:
    push eax      //把分组压栈,暂时保存
    xor eax,eax
    movzx eax,byte ptr ds:[esi] //注册名ASCII码,逐个来
    shl eax,2
    mov ecx,1AH
    xor edx,edx
    div ecx
    mov al,byte ptr ds:[ebx+edx]
    mov byte ptr ds:[edi],al
    inc esi
    inc edi
    xor eax,eax
    movzx eax,byte ptr ds:[esi]
    lea eax,dword ptr ds:[eax+eax*2]
    mov ecx,1AH
    xor edx,edx
    div ecx
    mov al,byte ptr ds:[ebx+edx]
    mov byte ptr ds:[edi],al
    inc edi
    pop eax
    dec eax
    jnz @loop
    jmp @End
@Err:
    push 0
    MOV EAX,DWORD PTR SS:[Title]
    PUSH EAX
    MOV EAX,DWORD PTR SS:[Text]
    PUSH EAX
    PUSH MB_OK
    Call MessageBox      //提示:注册名长度至少要4位
@End:
  End;  //End ASM
End;

//=======================================================================
Function LinkProc(LinkCtl:HWND;uMsg,wParam,lParam:DWORD):LRESULT;stdcall;
Begin
  Result:=0;
  Case uMsg of
    WM_SETCURSOR:
    Begin
      SetCursor(L_Cur);
    End;
    WM_NCHITTEST:
    Begin
      Result:=1;
    End;
    WM_LBUTTONUP:
    Begin
      ShellExecute(0,nil,'http://www.pediy.com',nil,nil,0);//链接到:看雪学院
    End
    else
    Begin
      CallWindowProc(Pointer(GetWindowLong(LinkCtl,GWL_USERDATA)),LinkCtl,uMsg,wParam,lParam);
    End;
  end;
End;

procedure MoveToCentre(hDlg:HWND);   //窗口启动中在屏幕中心显示
Var
  D_Rect:TRECT;   //本程序的RECT
  S_Rect:Trect;   //DeskTop 的RECT,实际上就是SCREEN了。
  S_Hwnd:HWND;    //DeskTop 的句柄
Begin
  GetWindowRECT(hDlg,D_Rect);
  S_Hwnd:=GetDesktopwindow;
  GetWindowRect(s_Hwnd,S_Rect);
  moveWindow(hDlg,(S_Rect.right-D_Rect.Right)div 2 ,(S_Rect.Bottom-D_Rect.Bottom ) div 2,D_Rect.Right ,D_Rect.Bottom,true);
End;

Function GetOS:string;
var
  OS: OSVERSIONINFO;
  OS_Str:string;
begin
  ZeroMemory(@OS,sizeof(OS));
  OS.dwOSVersionInfoSize :=sizeof(OSVERSIONINFO);
  GetVerSionEx(OS);
  OS_Str:='你使用非Windows操作系统';
  if (OS.dwPlatformId = VER_PLATFORM_WIN32_NT) and
     (OS.dwMajorVersion = 5) and (OS.dwMinorVersion =1)
     then OS_str:='你使用WinXP'+' '+OS.szCSDVersion;
if (OS.dwPlatformId = VER_PLATFORM_WIN32_NT) and
     (OS.dwMajorVersion = 5) and
     (OS.dwMinorVersion =0)
     then OS_str:='你使用Win2K'+' '+OS.szCSDVersion;
if (OS.dwPlatformId = VER_PLATFORM_WIN32_NT) and
     (OS.dwMajorVersion = 4)
     then OS_str:='你使用WinNT'+' '+OS.szCSDVersion;
if (OS.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS)
     then OS_str:='你使用Win9X'+' '+OS.szCSDVersion;
Result:=OS_str;
end;

Procedure DialogInit(hDlg:HWND);
Begin
  SetWindowText(hDlg,mainCaption);
  SetDlgItemText(hDlg,IDC_Time,Time);
  SetDlgItemText(hDlg,IDC_wofan,Author);
  SetDlgItemText(hDlg,IDC_Name,Pchar('wofan'));
  
  if h_Cur<>0 then
  Begin
    SetClassLong(hDlg,GCL_HCURSOR,h_Cur);          //设置动画光标
    SetClassLong(GetDlgItem(hDlg,IDC_Name),GCL_HCURSOR,h_Cur); //各个控件有同样的光标
    SetClassLong(GetDlgItem(hDlg,IDC_Code),GCL_HCURSOR,h_Cur);
    SetClassLong(GetDlgItem(hDlg,IDC_OK),GCL_HCURSOR,h_Cur);
    SetClassLong(GetDlgItem(hDlg,IDC_About),GCL_HCURSOR,h_Cur);
    SetClassLong(GetDlgItem(hDlg,IDC_Cancel),GCL_HCURSOR,h_Cur);
  End;                     

  SendMessage(hDlg,WM_SETICON,ICON_SMALL,h_Icon);//设置图标 ,ICON_SMALL=0  ICON_Big=1, ICON_Small2=2
  setfocus(getDlgItem(hDlg,IDC_Name));           //使注册名的Edit控件获得焦点
End;

Function MainProc(hDlg:HWND;uMsg,wParam,lParam:DWORD):LRESULT;stdcall;  //加上stdcall 这是回调函数
var
  sPaint:PaintStruct;  //用来获取DC
  Cap_PT:TPOINT;       //点结构,用来保存鼠标点击位置,确定是否可以移动Form
  DC:HDC;              //场景句柄

  LinkHwnd:HWND;       //链接
  SetLongRet:LONGINT;  //链接
Begin
  Result:=0;    //初始化函数返回值,返回零
  Case uMsg of
    WM_INITDIALOG:
    Begin
      DialogInit(hDlg);
      MoveToCentre(hDlg);
      
      LinkHwnd:=GetDlgItem(hDlg,IDC_BMP);
      SetLongRet:=SetWindowLong(LinkHWND,GWL_WNDPROC,Longword(@LinkProc));
      SetWindowLong(LinkHWND,GWL_USERDATA,SetLongRet);
    End;

    WM_LBUTTONDOWN:
    Begin
      Cap_PT.X:=lParam and $FFFF;
      Cap_PT.Y:=lParam SHR 16;
      if PTInRect(Cap_Rect,Cap_PT) then
      Begin
        PostMessage(hDlg,WM_NCLBUTTONDOWN,HTCAPTION,0); //转换消息,单击Form如同单击标题栏
      End;
    End;

    WM_Paint:
    Begin
      GetClientRect(hDlg,Cap_Rect);
      DC:=BeginPaint(hDlg,sPaint);
      FrameRect(DC,Cap_Rect,h_Brush_2);   //画外框
      Cap_Rect.Bottom:=Cap_Rect.Top+25;
      Cap_Rect.Left:=Cap_Rect.Left+2;
      Cap_Rect.Top:=Cap_Rect.Top+2;
      Cap_Rect.Right :=Cap_Rect.Right -2;
      FillRect(DC,Cap_Rect,h_Brush);    //填充标题栏
     
      if h_Icon<>0 Then
      Begin
        DrawIconEx(DC,4,4,h_Icon,$10,$10,0,0,3);
      End;
      SetBKMode(DC,TRANSPARENT);   //设置背景透明,标题栏的画出的文字背景色不再是难看的白色
      DrawText(DC,MainCaption,-1,Cap_Rect,DT_CENTER OR DT_SINGLELINE OR DT_VCENTER); //居中单行绘制文本
      EndPaint(hDlg,sPaint);
    End;

    WM_COMMAND:
    Begin
      Case wParam and $FFFF of
        IDC_OK:
        Begin
          wofanKeygen(hDlg);
          SetDlgItemText(hdlg,IDC_Code,@mCode);
        End;
        IDC_About:
        Begin
          MessageBox(hDlg,pchar(AboutText+#13+GetOS),AboutTitle,MB_OK or MB_ICONINFORMATION);
        End;
        IDC_Cancel:
        Begin
          EndDialog(hDlg,0);
        End;
        IDC_Close:
        Begin
          EndDialog(hDlg,0);
        End;
        IDC_Name:
        Begin
          Case wParam shr 16 of
            EN_CHANGE:
            Begin
              wofanKeygen(hDlg);
              SetDlgItemText(hdlg,IDC_Code,@mCode);
            End;
          End;  //end---wParam shr 16 of---- case
        End; //End ----IDC_Name ----Begin
      End; //End----WM_Command----Case
    End; //End ----WM_Command---- Begin
  End; //End ---Umsg----case
End; //End -----Function

Begin
  h_Brush:=CreateSolidBrush($C0C0D0);     //这里可以设置画刷
  h_Brush_2:=CreateSolidBrush($1F1F1F);
  File_Dir:=ExtractFilePath(paramStr(0)); //提取程序所在目录
  h_Cur:=loadCursorFromFile(pchar(file_Dir+'[OCN]Mouse.ani'));
  L_Cur:=LoadCursor(hInstance,MakeintResource(IDC_Cur));
  h_Icon:=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON));
  DialogBox(hInstance,LPCTSTR(IDD_MAIN),0,@MainProc);
  DeleteObject(h_Brush);
  DeleteObject(h_Brush_2);
  ExitProcess(0);
End.
上传的附件:
2006-10-29 16:11
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
4
这是HappyTown的Crackme007的注册机源码。
我以为是最符合作者本意的注册机了。

//=============================================================//
//=====做一个给自已使用的 Delphi版本的注册机模板 ==============//
//========= wofan[OCN][PYG][DCG] 2006-10-28  ==================//
//=============================================================//
program Keygen;
uses
  windows,
  SysUtils,//用来支持:File_Dir:=ExtractFilePath(paramStr(0)); //提取程序所在目录
  ShellAPI, //仅仅是用它来支持链接
  Messages;
{$R KeygenRc.RES}
var
  Cap_Rect:TRECT;     //标题栏RECT,需要保存备用(移动Form),定义为全局变量
  h_BRUSH:HBRUSH;     //画刷标题栏的画刷
  h_BRUSH_2:HBRUSH;   //画边框的画刷
  File_Dir:String;    //该程序所在目录     
  h_Cur:HCURSOR;      //动画光标句柄
  L_Cur:HCURSOR;      //链接用的光标
  h_Icon:HICON;       //图标句柄
  mName:array[0..255] of byte;   //注册名
  mCode:Array[0..255]of byte;     //注册码
//===============================================================
Const
//===============================================================
IDD_MAIN=101;       //主对话框控件
IDB_BMP=102;       //位图资源ID-看雪学院
IDI_ICON=103;       //图标资源ID-[OCN]
IDC_Cur=104;        //链接用的光标
//----------------------------------------------
IDC_ICON=1000;      //装载图标的图像控件
IDC_N =1001;      //注册名Label
IDC_Name =1002;      //注册名   Edit
IDC_C=1003;      //注册码Label
IDC_Code=1004;      //注册码   Edit
IDC_wofan=1005;      //破解人   Label
IDC_Time=1006;      //破解时间 Label
IDC_OK=1007;      //确定按钮
IDC_About=1008;      //关于按钮
IDC_Cancel=1009;     //取消按钮
IDC_Close=1010;      //标题栏上的关闭按扭
IDC_BMP= -1;        //装载位图的控件
//===============================================================

//=======================以下资源在发布时即时修改========================
//------------------------------------------------------------------------
AboutText='本Keygen模板由wofan[OCN]制作'+#13+'这是HappyTown系列Crackme的注册机之一'; //关于Messagebox的Text
AboutTitle='wofan[OCN]';                        //MessageBox的Title

MainCaption='Crackme007_Keygen';                       //主对话框的Caption
Time='2006-10-29';                              //发布时间
Author='wofan[OCN]';                            //发布者名号
//------------------------------------------------------------------------
//=======================================================================

//-----------------------------------------------------------------------
//=============  函数,过程,回调函数  ==================================
//=======================================================================

procedure wofanKeygen(hdlg:HWND);
var
  Title,text:string;
Begin
  Title:='提示';
  Text:='注册名至少4位!';
  ZeroMemory(@mCode,sizeof(mCode));
  ZeroMemory(@mName,sizeof(mName));
  GetDlgItemText(hDlg,IDC_Name,@mName,sizeof(mName));
  asm
    LEA ESI,mName  //把注册名的地址传到ESI
    cmp eax,4
    JL @Err
    xor ecx,ecx
    mov ecx,eax
    lea edi,mCode
    push eax      //还要保存注册名长度,备用
    xor eax,eax
    mov al,byte ptr ss:[esi+1]
    mov byte ptr ss:[edi+7],al
    mov al,byte ptr ss:[esi+ecx-2]
    mov byte ptr ss:[edi+8],al
    mov byte ptr ss:[edi+15],al
    mov eax,ecx
    mov ebx,3
    xor edx,edx
    idiv ebx
    mov eax,edx
    add eax,30H
    mov byte ptr ss:[edi+11],al
    mov byte ptr ss:[edi],48H
    mov byte ptr ss:[edi+1],54H
    mov byte ptr ss:[edi+2],2DH
    mov byte ptr ss:[edi+3],37H
    xor eax,eax
    xor ebx,ebx
@total:
    movzx ebx,byte ptr ss:[esi]
    add eax,ebx
    inc esi
    dec cl
    jnz @total  //累加注册名ASCII码
    xor edx,edx
    pop ecx
    push ecx    //注册名长度下面还要用到,再次PUSH
    idiv ecx
    mov byte ptr ss:[edi+5],al
    inc eax
    mov byte ptr ss:[edi+12],al
    mov byte ptr ss:[edi+9],35H
    mov byte ptr ss:[edi+$0A],35H
    mov byte ptr ss:[edi+4],35H
    mov byte ptr ss:[edi+6],35H
    xor eax,eax
    xor edx,edx
    xor ecx,ecx
    mov eax,10AH
    pop ecx
    sub eax,ecx
    movzx ecx,byte ptr ss:[edi+12]
    sub eax,ecx
    push eax
    mov ecx,2
    idiv ecx
    mov byte ptr ss:[edi+13],al
    pop ecx
    sub ecx,eax
    mov byte ptr ss:[edi+14],cl
    jmp @End
@Err:
    push 0
    MOV EAX,DWORD PTR SS:[Title]
    PUSH EAX
    MOV EAX,DWORD PTR SS:[Text]
    PUSH EAX
    PUSH MB_OK
    Call MessageBox      //提示:注册名长度至少要4位
@End:
  End;  //End ASM
End;

//=======================================================================
Function LinkProc(LinkCtl:HWND;uMsg,wParam,lParam:DWORD):LRESULT;stdcall;
Begin
  Result:=0;
  Case uMsg of
    WM_SETCURSOR:
    Begin
      SetCursor(L_Cur);
    End;
    WM_NCHITTEST:
    Begin
      Result:=1;
    End;
    WM_LBUTTONUP:
    Begin
      ShellExecute(0,nil,'http://www.pediy.com',nil,nil,0);//链接到:看雪学院
    End
    else
    Begin
      CallWindowProc(Pointer(GetWindowLong(LinkCtl,GWL_USERDATA)),LinkCtl,uMsg,wParam,lParam);
    End;
  end;
End;

procedure MoveToCentre(hDlg:HWND);   //窗口启动中在屏幕中心显示
Var
  D_Rect:TRECT;   //本程序的RECT
  S_Rect:Trect;   //DeskTop 的RECT,实际上就是SCREEN了。
  S_Hwnd:HWND;    //DeskTop 的句柄
Begin
  GetWindowRECT(hDlg,D_Rect);
  S_Hwnd:=GetDesktopwindow;
  GetWindowRect(s_Hwnd,S_Rect);
  moveWindow(hDlg,(S_Rect.right-D_Rect.Right)div 2 ,(S_Rect.Bottom-D_Rect.Bottom ) div 2,D_Rect.Right ,D_Rect.Bottom,true);
End;

Function GetOS:string;
var
  OS: OSVERSIONINFO;
  OS_Str:string;
begin
  ZeroMemory(@OS,sizeof(OS));
  OS.dwOSVersionInfoSize :=sizeof(OSVERSIONINFO);
  GetVerSionEx(OS);
  OS_Str:='你使用非Windows操作系统';
  if (OS.dwPlatformId = VER_PLATFORM_WIN32_NT) and
     (OS.dwMajorVersion = 5) and (OS.dwMinorVersion =1)
     then OS_str:='你使用WinXP'+' '+OS.szCSDVersion;
if (OS.dwPlatformId = VER_PLATFORM_WIN32_NT) and
     (OS.dwMajorVersion = 5) and
     (OS.dwMinorVersion =0)
     then OS_str:='你使用Win2K'+' '+OS.szCSDVersion;
if (OS.dwPlatformId = VER_PLATFORM_WIN32_NT) and
     (OS.dwMajorVersion = 4)
     then OS_str:='你使用WinNT'+' '+OS.szCSDVersion;
if (OS.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS)
     then OS_str:='你使用Win9X'+' '+OS.szCSDVersion;
Result:=OS_str;
end;

Procedure DialogInit(hDlg:HWND);
Begin
  SetWindowText(hDlg,mainCaption);
  SetDlgItemText(hDlg,IDC_Time,Time);
  SetDlgItemText(hDlg,IDC_wofan,Author);
  SetDlgItemText(hDlg,IDC_Name,Pchar('wofan'));
  
  if h_Cur<>0 then
  Begin
    SetClassLong(hDlg,GCL_HCURSOR,h_Cur);          //设置动画光标
    SetClassLong(GetDlgItem(hDlg,IDC_Name),GCL_HCURSOR,h_Cur); //各个控件有同样的光标
    SetClassLong(GetDlgItem(hDlg,IDC_Code),GCL_HCURSOR,h_Cur);
    SetClassLong(GetDlgItem(hDlg,IDC_OK),GCL_HCURSOR,h_Cur);
    SetClassLong(GetDlgItem(hDlg,IDC_About),GCL_HCURSOR,h_Cur);
    SetClassLong(GetDlgItem(hDlg,IDC_Cancel),GCL_HCURSOR,h_Cur);
  End;                     

  SendMessage(hDlg,WM_SETICON,ICON_SMALL,h_Icon);//设置图标 ,ICON_SMALL=0  ICON_Big=1, ICON_Small2=2
  setfocus(getDlgItem(hDlg,IDC_Name));           //使注册名的Edit控件获得焦点
End;

Function MainProc(hDlg:HWND;uMsg,wParam,lParam:DWORD):LRESULT;stdcall;  //加上stdcall 这是回调函数
var
  sPaint:PaintStruct;  //用来获取DC
  Cap_PT:TPOINT;       //点结构,用来保存鼠标点击位置,确定是否可以移动Form
  DC:HDC;              //场景句柄

  LinkHwnd:HWND;       //链接
  SetLongRet:LONGINT;  //链接
Begin
  Result:=0;    //初始化函数返回值,返回零
  Case uMsg of
    WM_INITDIALOG:
    Begin
      DialogInit(hDlg);
      MoveToCentre(hDlg);
      
      LinkHwnd:=GetDlgItem(hDlg,IDC_BMP);
      SetLongRet:=SetWindowLong(LinkHWND,GWL_WNDPROC,Longword(@LinkProc));
      SetWindowLong(LinkHWND,GWL_USERDATA,SetLongRet);
    End;

    WM_LBUTTONDOWN:
    Begin
      Cap_PT.X:=lParam and $FFFF;
      Cap_PT.Y:=lParam SHR 16;
      if PTInRect(Cap_Rect,Cap_PT) then
      Begin
        PostMessage(hDlg,WM_NCLBUTTONDOWN,HTCAPTION,0); //转换消息,单击Form如同单击标题栏
      End;
    End;

    WM_Paint:
    Begin
      GetClientRect(hDlg,Cap_Rect);
      DC:=BeginPaint(hDlg,sPaint);
      FrameRect(DC,Cap_Rect,h_Brush_2);   //画外框
      Cap_Rect.Bottom:=Cap_Rect.Top+25;
      Cap_Rect.Left:=Cap_Rect.Left+2;
      Cap_Rect.Top:=Cap_Rect.Top+2;
      Cap_Rect.Right :=Cap_Rect.Right -2;
      FillRect(DC,Cap_Rect,h_Brush);    //填充标题栏
     
      if h_Icon<>0 Then
      Begin
        DrawIconEx(DC,4,4,h_Icon,$10,$10,0,0,3);
      End;
      SetBKMode(DC,TRANSPARENT);   //设置背景透明,标题栏的画出的文字背景色不再是难看的白色
      DrawText(DC,MainCaption,-1,Cap_Rect,DT_CENTER OR DT_SINGLELINE OR DT_VCENTER); //居中单行绘制文本
      EndPaint(hDlg,sPaint);
    End;

    WM_COMMAND:
    Begin
      Case wParam and $FFFF of
        IDC_OK:
        Begin
          wofanKeygen(hDlg);
          SetDlgItemText(hdlg,IDC_Code,@mCode);
        End;
        IDC_About:
        Begin
          MessageBox(hDlg,pchar(AboutText+#13+GetOS),AboutTitle,MB_OK or MB_ICONINFORMATION);
        End;
        IDC_Cancel:
        Begin
          EndDialog(hDlg,0);
        End;
        IDC_Close:
        Begin
          EndDialog(hDlg,0);
        End;
        IDC_Name:
        Begin
          Case wParam shr 16 of
            EN_CHANGE:
            Begin
              wofanKeygen(hDlg);
              SetDlgItemText(hdlg,IDC_Code,@mCode);
            End;
          End;  //end---wParam shr 16 of---- case
        End; //End ----IDC_Name ----Begin
      End; //End----WM_Command----Case
    End; //End ----WM_Command---- Begin
  End; //End ---Umsg----case
End; //End -----Function

Begin
  h_Brush:=CreateSolidBrush($C0C0D0);     //这里可以设置画刷
  h_Brush_2:=CreateSolidBrush($1F1F1F);
  File_Dir:=ExtractFilePath(paramStr(0)); //提取程序所在目录
  h_Cur:=loadCursorFromFile(pchar(file_Dir+'[OCN]Mouse.ani'));
  L_Cur:=LoadCursor(hInstance,MakeintResource(IDC_Cur));
  h_Icon:=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON));
  DialogBox(hInstance,LPCTSTR(IDD_MAIN),0,@MainProc);
  DeleteObject(h_Brush);
  DeleteObject(h_Brush_2);
  ExitProcess(0);
End.
2006-10-29 18:13
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
5
只好用了Laomms的那个函数:
function cacl(eax: integer):integer;
var
      code:integer;
      ebx,ecx:double;
  begin
     ebx:=Sin(eax) / Cos(eax);
     ecx:=ebx* 10;
     code:=Trunc(ecx);
     Result:=code;
  end;

Loamms是这样处理Tan()函数的。真绝。
精采的地方是别人的,贴代码都不好意思了。
休息一下。
上传的附件:
2006-10-30 13:22
0
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
6
wofan[OCN],建议你把这些帖子拆分,否则不方便加精处理。
2006-10-31 10:45
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
最初由 happytown 发布
wofan[OCN],建议你把这些帖子拆分,否则不方便加精处理。

兄弟可以对贴子折分的。
2006-10-31 10:58
0
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
8
最初由 小虾 发布
兄弟可以对贴子折分的。


想偷个懒都被你盯上了。
2006-10-31 11:01
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
9
最初由 happytown 发布
wofan[OCN],建议你把这些帖子拆分,否则不方便加精处理。

原本想汇总的。
现在你说拆分,
我还不知道怎么拆分呢。发出去的贴子,我还能编辑吗?
2006-10-31 15:28
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
10
最初由 happytown 发布
想偷个懒都被你盯上了。

呵呵,想偷懒看来你也是偷懒不成了。
2006-10-31 16:33
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
最初由 wofan[OCN] 发布
原本想汇总的。
现在你说拆分,
我还不知道怎么拆分呢。发出去的贴子,我还能编辑吗?

只有版主以上的成员才有折分贴子的权限。
2006-10-31 16:34
0
游客
登录 | 注册 方可回帖
返回
//