开发平台:codeblocks win32 GUI
功能说明:首先,可以自动生成6位口令,然后点击暴力破解按钮,开始对自动生成的口令进行暴力破解。并输出破解次数。
界面展示:
func.c:
#include "func.h"
void respond_password_generated()
{
srand((unsigned)time(0));
int n[6] = {0};
int i;
for(i=0; i<6; i++)
{
n[i] = rand()%10;
strr[i] = n[i]+'0';
}
}
int respond_violence(int c)
{
c = 0;
char b[7];
int i, j;
for(i=0; i<=999999; i++)
{
int k = i;
for(j=5; j>=0; j--)
{
b[j] = k%10+'0';
k/=10;
}
if(!strcmp(strr, b))
{
break;
}
c++;
}
return c;
}
main.c:
#include
#include "func.h"
#define num 2
/*
Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。
每个窗口都有一个消息处理函数。
在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。
客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。这样,每当有消息产生时,
就会去调用这个消息处理函数。通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息,
其他的,则送回到系统的缺省消息处理函数中去。
系统会将针对这个程序的消息依次放到程序的“消息队列”中,由程序自己依次取出消息,
在分发到对应的窗口中去。因此,建立窗口后,将进入一个循环。在循环中,取出消息、派发消息,
循环往复,直到取得的消息是退出消息。循环退出后,程序即结束。
*/
//消息处理函数 。参数:窗口句柄,消息,消息参数,消息参数
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
/*
hinstance - 该参数为Windows 为应用程序生成的实例句柄。实例是用来跟踪资源的指针。
hprevinstance 当前已不再使用该参数,之前用来跟踪应用程序的前一个实例,即程序的父亲的程序实例。
ipcmdline - 一个以NULL结尾的字符串,类似于标准main(int argc,char** argv)中的命令行参数,
但没有单独的argc来指示命令行参数数量。
ncmdshow—— 最后一个参数是启动期间传递给应用程序的一个整数,指出如何打开程序的窗口。
事实上,基本没用,但ncmdshow的值一般会用于ShowWindows()中使用,用来设置新建子窗口的形式。
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("MyWindows");//窗口类名称
HWND hwnd;
MSG msg;
//定制"窗口类"结构
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;//关联消息处理函数
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);//画刷
//将客户区的背景颜色改成和按钮一样 +1是为了防止出现NULL
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
return 0;
}
//建立窗口
hwnd = CreateWindow(szAppName,//窗口类名称
TEXT("PasswordBreak"),//窗口标题
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU,//窗口风格
/*三个参数的含义:
产生一个层叠的窗口,一个层叠的窗口有一个标题条和一个边框,与 WS_TILED 风格相同
创建一个有标题框的窗口(包含了 WS_BODER 风格)
创建一个在标题条上带有窗口菜单的窗口,必须同时设定 WS_CAPTION 风格
*/
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//转换消息
DispatchMessage(&msg);//派发消息
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
TCHAR *str[num] = {TEXT("自动生成六位口令"), TEXT("暴力破解六位口令"), TEXT("音乐")};
static int cxchar, cychar;
static HWND hwndButton[num];
//存放子窗口的句柄
int i, id, co;
static int winner = -1, flag = 0, Count = 0;//标记哪个选项被选中
switch (message)
{
case WM_CREATE:
cxchar = LOWORD(GetDialogBaseUnits());
cychar = HIWORD(GetDialogBaseUnits());
/*
获取字体的横/纵坐标:返回值是一个8位16进制数,高4位存放字体的高度,低4位存放字体的宽度,
可以通过以下语句了获取字体的高和宽
GetDialogBaseUnits函数返回的水平基本单位同系统字体中字符以像素为单位的平均宽度相等;
垂直基本单位同系统字体中字符的以像素为单位的平均高度相等;
对于一个没有使用系统字体的对话框基本单位相等于对话框字体字符以像素为单位的平均宽度和平均高度。
*/
GetWindowRect(hwnd, &rect);
MoveWindow(hwnd, rect.left, rect.top, 40*cxchar, 20*cychar, TRUE);
/*
hWnd是窗口的句柄。
X是窗口在X轴的位置。
Y是窗口在Y辆的位置。
nWidth是窗口的宽度。
nHeight是窗口的高度。
bRepaint是设置是否重画窗口和父窗口。
当设置为TRUE时,就进行重画。当设置为FALSE时,
就不进行重画,需要手功进行更新指定的区域。
*/
for(i=0; ihInstance, NULL);
}
CreateWindow(TEXT("button"), TEXT("选项"),
BS_GROUPBOX | WS_CHILD | WS_VISIBLE,
3*cxchar, cychar/10,30*cxchar, 37*cychar/4,
hwnd, (HMENU)(num+1), ((LPCREATESTRUCT)lParam)->hInstance, NULL);
CreateWindow(TEXT("button"), TEXT("提交"),
BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE,
5*cxchar, 13*cychar,
//按钮的上下位置
9*cxchar, 9*cychar/4,
//按钮的长和宽
hwnd, (HMENU)(num+2), ((LPCREATESTRUCT)lParam)->hInstance, NULL);
CreateWindow(TEXT("button"), TEXT("破解次数"),
BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE,
20*cxchar, 13*cychar,
//按钮的左右和上下位置
9*cxchar, 9*cychar/4,
//按钮的长和宽
hwnd, (HMENU)(num+3), ((LPCREATESTRUCT)lParam)->hInstance, NULL);
return 0;
case WM_COMMAND:
id = LOWORD(wParam);//获取子窗口控件的id
if(id < num)
{
winner = id;//选中哪个选项
}
switch(id)
{
case num+2://如果点了提交的按钮
if(winner==-1)
{
MessageBox(hwnd, TEXT("没有选中任何选项!"), TEXT("提示"), MB_OK);
}
else if(winner == 0)//如果点了自动生成6位口令
{
flag = 1;
respond_password_generated();
CHAR szdemo[20] = "\0";
sprintf(szdemo, TEXT("%s %s"), TEXT("生成的口令是:"), strr);
MessageBox(hwnd, TEXT(szdemo), TEXT("提示"), MB_OK);
}
else if(winner == 1)
{
if(flag)
{
respond_violence();
MessageBox(hwnd, TEXT("口令已破解"), TEXT("提示:"), MB_OK);
}
else
{
MessageBox(hwnd, TEXT("未生成口令!"), TEXT("提示:"), MB_OK);
}
}
break;
case num+3://如果点了显示破解次数的按钮
{
co = respond_violence(Count);
// printf("%d\n", co);
//printf("%s\n", strr);
CHAR szdemo1[40] = "\0";
sprintf(szdemo1, TEXT("%s %d"), TEXT("尝试的次数为:"), co);
MessageBox(hwnd, TEXT(szdemo1), TEXT("提示"), MB_OK);
break;
}
}
return 0;
// case WM_PAINT:
// hdc = BeginPaint(hwnd, &ps);
// GetClientRect(hwnd, &rect);
//
// EndPaint(hwnd, &ps);
// return 0;
// case WM_LBUTTONDOWN:
//// MessageBox(hwnd, TEXT("哎呀~我被按了一下~"), TEXT("好舒服~"), MB_OK);
// return 0;
case WM_DESTROY:
PostQuitMessage(0);
//当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
func.h:
#ifndef FUNC_H_INCLUDED
#define FUNC_H_INCLUDED
#include
#include
#include
#include
char strr[10];//这里面存的是自动生成的6位口令
//static int Count = 0;//这是要统计破解的次数
void respond_password_generated();
int respond_violence();
#endif // FUNC_H_INCLUDED