您的位置:首页 > 其它

win32 (sdk) 安全的使用字符,防止字符缓冲区溢出。

2016-11-20 10:36 197 查看
wsprintf ,lstrlen,lstrcpy,lstrcat函数可以操作字符串,但是会有字符缓冲区溢出的情况,会被攻击,是不安全的,微软提供了StringCchPrintf,StringCchLength,StringCchCopy,StringCchCat  四个函数安全的 防止缓冲区溢出的函数。

1.c

//wsprintf ,lstrlen,lstrcpy,lstrcat 是不安全的
//打印10行字符串到窗口上 要求每行显示行号
#include<Windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParram, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
TCHAR * appname = TEXT("涵涵");
TCHAR *title = TEXT("涵涵");
MSG uMsg;
WNDCLASS WndCls;
HWND hWnd;
WndCls.cbClsExtra = NULL;
WndCls.cbWndExtra = NULL;
WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //BRUSH画刷 Stock库存
WndCls.hCursor = NULL;
WndCls.hIcon = NULL;
WndCls.hInstance = hInstance;
WndCls.lpfnWndProc = WndProc;
WndCls.lpszClassName = appname;
WndCls.lpszMenuName = NULL;
WndCls.style = CS_VREDRAW | CS_HREDRAW;
//----------------
RegisterClass(&WndCls);
hWnd = CreateWindow(appname,
title,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
/*
这里 把 hWnd设置 成 NULL 就可以抓取 整个程序的所有消息 (包括 所有窗口 和所有线程)
PostQuitMessage(0)函数 发送的消息是直接给 线程的消息队列
GetMessage获取 WM_QUIT后 就使while(0) 程序 就结束了
如果 不为 NULL就 无法获取 WM_QUIT
*/
while (GetMessage(&uMsg, NULL, 0, 0)) //最大条数 最小条数
{
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
return uMsg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc; //Handle Device Context
RECT rect;
LPSTR outStr = TEXT("I Love You!");
int i;
switch (uMsg)
{

case WM_PAINT:

hdc = GetDC(hWnd);
for (i = 0; i < 10; i++)
{
TextOut(hdc, 1, i*30, outStr, 11);
}
ReleaseDC(hWnd, hdc);
break; //多条 语句 最好是 加case break;(标准做法)

case WM_DESTROY:

PostQuitMessage(1);

break;

default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
break;
}
return 0;

}

2.c

//打印10行字符串到窗口上 要求每行显示行号
#include<Windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParram, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
TCHAR * appname = TEXT("涵涵");
TCHAR *title = TEXT("涵涵");
MSG uMsg;
WNDCLASS WndCls;
HWND hWnd;
WndCls.cbClsExtra = NULL;
WndCls.cbWndExtra = NULL;
WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //BRUSH画刷 Stock库存
WndCls.hCursor = NULL;
WndCls.hIcon = NULL;
WndCls.hInstance = hInstance;
WndCls.lpfnWndProc = WndProc;
WndCls.lpszClassName = appname;
WndCls.lpszMenuName = NULL;
WndCls.style = CS_VREDRAW | CS_HREDRAW;
//----------------
RegisterClass(&WndCls);
hWnd = CreateWindow(appname,
title,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
/*
这里 把 hWnd设置 成 NULL 就可以抓取 整个程序的所有消息 (包括 所有窗口 和所有线程)
PostQuitMessage(0)函数 发送的消息是直接给 线程的消息队列
GetMessage获取 WM_QUIT后 就使while(0) 程序 就结束了
如果 不为 NULL就 无法获取 WM_QUIT
*/
while (GetMessage(&uMsg, NULL, 0, 0)) //最大条数 最小条数
{
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
return uMsg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc; //Handle Device Context
RECT rect;
TCHAR outStr[12];
int i;
switch (uMsg)
{

case WM_PAINT:

hdc = GetDC(hWnd);
for (i = 0; i < 9; i++)
{
wsprintf(outStr, TEXT("%d%s"), i + 1, TEXT("I Love You"));
TextOut(hdc, 1, i*30, outStr, lstrlen(outStr));
}
ReleaseDC(hWnd, hdc);
break; //多条 语句 最好是 加case break;(标准做法)

case WM_DESTROY:

PostQuitMessage(1);

break;

default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
break;
}
return 0;

}

3.c//打印10行字符串到窗口上 要求每行显示行号
//StringCchPrintf
//StringCchLength
//StringCchCopy
//StringCchCat 上面四个函数是微软提供的安全的 防止缓冲区溢出的函数
#include<Windows.h>
#include<strsafe.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParram, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
TCHAR * appname = TEXT("涵涵");
TCHAR *title = TEXT("涵涵");
MSG uMsg;
WNDCLASS WndCls;
HWND hWnd;
WndCls.cbClsExtra = NULL;
WndCls.cbWndExtra = NULL;
WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //BRUSH画刷 Stock库存
WndCls.hCursor = NULL;
WndCls.hIcon = NULL;
WndCls.hInstance = hInstance;
WndCls.lpfnWndProc = WndProc;
WndCls.lpszClassName = appname;
WndCls.lpszMenuName = NULL;
WndCls.style = CS_VREDRAW | CS_HREDRAW;
//----------------
RegisterClass(&WndCls);
hWnd = CreateWindow(appname,
title,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
/*
这里 把 hWnd设置 成 NULL 就可以抓取 整个程序的所有消息 (包括 所有窗口 和所有线程)
PostQuitMessage(0)函数 发送的消息是直接给 线程的消息队列
GetMessage获取 WM_QUIT后 就使while(0) 程序 就结束了
如果 不为 NULL就 无法获取 WM_QUIT
*/
while (GetMessage(&uMsg, NULL, 0, 0)) //最大条数 最小条数
{
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
return uMsg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc; //Handle Device Context
RECT rect;
TCHAR outStr[12];
int i;
size_t iTarget;
switch (uMsg)
{

case WM_PAINT:

hdc = GetDC(hWnd);
for (i = 0; i < 9; i++)
{
StringCchPrintf(outStr, 12, TEXT("%d%s"), i + 1, TEXT("I Love You"));
StringCchLength(outStr, 12, &iTarget);
TextOut(hdc, 1, i*30, outStr, iTarget);
}
ReleaseDC(hWnd, hdc);
break; //多条 语句 最好是 加case break;(标准做法)

case WM_DESTROY:

PostQuitMessage(1);

break;

default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
break;
}
return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: