【说明】应用密码学系列的CrackeMe现在采用方法的是先提供编译好的程序给大家实验,然后我会逐一写出破文,CrackMe的源码也会跟在破文的后面发布出来。代码写的很烂的说,大家凑合着看吧。
// CRC32CrackMe.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
HINSTANCE hInst;
HICON hIcon;
HWND hMain;
//比较两个字符串
BOOL GetStrCmp(LPCTSTR OneStr,LPCTSTR TwoStr)
{
char str1[256]={0};
char str2[256]={0};
lstrcpy(str1,OneStr);
lstrcpy(str2,TwoStr);
if (strlen(str1)==strlen(str2))
{
for(int i=0;i<strlen(str1);i++)
{
if (str1[i]!=str2[i])
{
return FALSE;
}
}
return TRUE;
}
else
{
return FALSE;
}
}
//动态生成CRC32的码表
unsigned long Crc32Table[256];
void GetCRC32Table()
{
int i,j;
unsigned long Value;
for (i = 0; i < 256; i++)
{
Value = i;
for (j = 0; j < 8; j++)
{
if (Value & 1)
Value = (Value >> 1) ^ 0xEDB88320;
else
Value >>= 1;
}
Crc32Table[i] = Value;
}
}
//获取字符串CRC32校验值
void GetCrc32(LPCTSTR InStr,LPTSTR OutStr)
{
GetCRC32Table();
ULONG crc=0xffffffff;
unsigned char* buffer;
buffer = (unsigned char*)InStr;
int len=strlen(InStr);
for(int i=0; i<len; i++)
{
crc = (crc >> 8) ^ Crc32Table[(crc & 0xFF) ^ *buffer++];
}
char value[10]={0};
//转换成16进制字符串
itoa(crc^0xffffffff,value,16);
//小写字符转换成大写字符
for(i=0;i<strlen(value);i++)
{
value[i]=toupper(value[i]);
}
lstrcpy(OutStr,value);
}
//窗口过程
LRESULT DlgProc(HWND hDlg,UINT uiMsg,WPARAM wParam,LPARAM lParam)
{
char szUser[256]={0};
char szCode[256]={0};
char szTemp[256]={0};
switch(uiMsg)
{
case WM_INITDIALOG:
//加载图标
hIcon = LoadIcon(hInst,(LPCTSTR)IDI_ICON);
SendMessage(hDlg,WM_SETICON,TRUE,(WPARAM)hIcon);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_TRIALBTN:
//取用户并判断是否为空
GetDlgItemText(hDlg,IDC_EDIT1,szUser,256);
if (strlen(szUser)<1)
{
MessageBox(hDlg,"用户名不能为空请输入!","注册提示",MB_OK | MB_ICONINFORMATION);
return FALSE;
}
//取注册码并判断是否为空
GetDlgItemText(hDlg,IDC_EDIT2,szCode,256);
if (strlen(szCode)<1)
{
MessageBox(hDlg,"注册码不能为空请输入!","注册提示",MB_OK | MB_ICONINFORMATION);
return FALSE;
}
GetCrc32(szUser,szTemp);
if (GetStrCmp(szCode,szTemp)==TRUE)
{
MessageBox(hDlg,"恭喜你,注册码正确!","注册提示",MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox(hDlg,"注册码错误,继续加油!","注册提示",MB_OK | MB_ICONINFORMATION);
}
break;
case IDC_CLOSEBTN:
EndDialog(hDlg,0);
break;
default:
break;
}
break;
case WM_CLOSE:
EndDialog(hDlg,0);
break;
}
return FALSE;
}
//入口函数
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hInst=GetModuleHandle(0);
DialogBoxParam(hInst,MAKEINTRESOURCE(IDD_MAINDLG),0,(DLGPROC)DlgProc,0);
ExitProcess(0);
return 0;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)