首页
社区
课程
招聘
[原创]做个Keygen模板,准备好好分析一下HappyTowm的Crackme
发表于: 2006-10-28 12:32 5785

[原创]做个Keygen模板,准备好好分析一下HappyTowm的Crackme

2006-10-28 12:32
5785
准备从头到尾分析一下HappyTown的Crackme,关键是要做出注册机。从最简单的做起,这是第一个。
//=============================================================//
//=====做一个给自已使用的 Delphi版本的注册机模板 ==============//
//========= wofan[OCN][PYG][DCG] 2006-10-26  ==================//
//=============================================================//
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='Crackme001_Keygen';                       //主对话框的Caption
Time='2006-10-28';                              //发布时间
Author='wofan[OCN]';                            //发布者名号
//------------------------------------------------------------------------
//=======================================================================

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

Function wofanKeygen(hdlg:HWND):longword;
var
  Title,text:string;
Begin
  Title:='提示';
  Text:='注册名至少3位!';
  result:=0;
  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,17496H
    mov @result,edi
    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      //提示:注册名长度至少要3位
@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
  SetDlgItemText(hDlg,IDC_Time,Time);
  SetDlgItemText(hDlg,IDC_wofan,Author);
  SetDlgItemText(hDlg,IDC_Name,Pchar('wofan[OCN][PYG][DCG]'));
  
  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
          SetDlgItemText(hdlg,IDC_Code,pchar(inttostr(wofanKeygen(hDlg))));
        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
              SetDlgItemText(hdlg,IDC_Code,pchar(inttostr(wofanKeygen(hDlg))));
            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.

//----------------------------------
部分资源:
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_MAIN DIALOGEX 0, 0, 160, 138
STYLE WS_POPUP
FONT 9, "宋体", 0, 0, 0x1
BEGIN
    CONTROL         102,IDC_BMP,"Static",SS_BITMAP,29,17,129,47
    ICON            IDI_ICON,IDC_ICON,4,32,21,21
    CTEXT           "注册名:",IDC_N,7,73,33,8
    CTEXT           "注册码:",IDC_C,7,93,33,8
    EDITTEXT        IDC_Name,41,69,114,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_Code,41,91,114,14,ES_AUTOHSCROLL
    CTEXT           "Made by wofan[OCN]",IDC_wofan,14,125,73,8,0,
                    WS_EX_TRANSPARENT
    LTEXT           "2006-10-28",IDC_Time,104,125,41,8
    PUSHBUTTON      "确定",IDC_OK,3,108,43,14,BS_FLAT
    PUSHBUTTON      "关于",IDC_About,58,108,43,14,BS_FLAT
    PUSHBUTTON      "取消",IDC_Cancel,113,108,43,14,BS_FLAT
    PUSHBUTTON      "X",IDC_Close,144,2,14,14,BS_FLAT
END

/////////////////////////////////////////////////////////////////////////////

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
2
HappyTowm的第二个Crackme,这也是个VB程序。
以下是主要代码

Function wofanKeygen(hdlg:HWND):longword;
var
  Title,text:string;
Begin
  Title:='提示';
  Text:='注册名至少3位!';
  result:=0;
  ZeroMemory(@mName,sizeof(mName));
  GetDlgItemText(hDlg,IDC_Name,@mName,sizeof(mName));
  asm
    LEA ESI,mName  //把注册名的地址传到ESI
    cmp eax,2      //EAX 是GetDlgItemText函数返回值,它是字串实际长度
    Jl @Err        
    mov edi,1
    mov ecx,eax
@loop:
    xor eax,eax
    mov al,byte ptr ds:[ESI]
    add edi,eax
    inc esi
    dec cx
    jnz @loop
    imul edi,310H
    xor edi,26A2F285H
    mov @result,edi
    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      //提示:注册名长度至少要2位
@End:
  End;  //End ASM
End;
2006-10-28 13:00
0
雪    币: 313
活跃值: (250)
能力值: ( LV9,RANK:650 )
在线值:
发帖
回帖
粉丝
3
希望继续下去
2006-10-28 15:09
0
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
学习一下!!
2006-10-28 16:02
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
5
支持中------
2006-10-28 20:07
0
雪    币: 110
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哇,不是人来的,汇编注册机 ,我不会啊
2006-10-29 12:49
0
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
7
CrackMe都整上KeyGen了。。。。
2006-10-29 15:31
0
雪    币: 3697
活跃值: (4257)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
8
爽啊。。。。
2006-10-29 17:28
0
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
9
支持你,
2006-10-31 11:26
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
10
keygen模板真漂亮.支持! 谢谢共享.
2006-11-2 15:02
0
雪    币: 323
活跃值: (589)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
11
很不错,继续。。。
2006-11-2 16:01
0
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
12
感谢支持,呵,你们是不知道我的苦恼, 我已经被HappyTown的第二十九个Crackme击溃了,现决定暂时休整,继续闭关!
如果有时间限定的话,我该说是多少天?多少月?
未可知也……
2006-11-3 03:07
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好漂亮的模板呀,一定要记得回来哟!
2006-11-5 18:15
0
游客
登录 | 注册 方可回帖
返回
//