加密解密之利用子类化技术拓展EDIT控(附图)

2010-3-19    来源:安全中国    我要评论
   | |

导读:EDIT控件提供的Number属性往往无法满足要求,它只能接受数字输入,而经常要求只接受16进制输入,而利用子类化技术则能处理特定窗体的绝大部分消息。

关键词:加密解密 子类化技术 EDIT控件 窗体消息 EDIT功能拓展

 
正在加载数据...

  前言:EDIT控件提供的“Number”属性往往无法满足要求,它只能接受数字输入,而经常要需求只接受16进制输入。可以用多种方法(子类化技术,钩子函数,开辟新线程),这里选择子类化技术。

  一 认识子类化技术

    把一个窗体子类化其实就是使用SetWindowLong为该窗体设计一个新的窗体过程,然后可以在该窗体函数中处理特定的消息,而那些不关心的消息可以通过CallWindowProc传递给系统默认的处理。(有关这方面的介绍网上很多,不过多介绍)

    从功能上来说,子类化技术有点类似于钩子函数(SetWindowHookEx),都可以对一些特定的消息自由处理。但在两者有着本质的区别,钩子函数是针对系统的消息传递机制,而子类化技术则是针对特定的窗体。利用钩子函数可以处理某一类或几类的消息,而利用子类化技术则能处理特定窗体的绝大部分消息。因而在使用时应区分被处理对象的范围,然后再选择采用哪种技术。

  二 体验子类化技术

  资源模板:一个对话框(IDD_TEST_SAMPLE)和一个EDIT控件(IDC_TEST).


  测试程序 (程序简单,不作介绍):
#include "resource.h"
#include <TChar.h>
#include <windows.h>

/**********************************
*  Global variable
***********************************/

LONG DefWndProc = NULL ;

/**********************************
*  Sub function pre-definition
***********************************/

LRESULT CALLBACK EditNewProc ( HWND hEdit, UINT uMsg, WPARAM wParam, LPARAM lParam ) ;
BOOL CALLBACK TestSampleProc ( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) ;


/**********************************
*  main function
***********************************/

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
   // TODO: Place code here.
  DialogBox ( hInstance, MAKEINTRESOURCE(IDD_TEST_SAMPLE), 0, TestSampleProc ) ;

  return 0;
}

/**********************************
*  Detail of sub function
***********************************/

LRESULT CALLBACK EditNewProc ( HWND hEdit, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  return CallWindowProc ( (WNDPROC)DefWndProc, hEdit, uMsg, wParam, lParam ) ;
}

 

BOOL CALLBACK TestSampleProc ( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )

  LONG DlgWndProc, EditWndProc ;
  TCHAR buf[128] ;

  switch ( message )
  {
  case WM_INITDIALOG:
    DlgWndProc = GetWindowLong ( hDlg, GWL_WNDPROC ) ;
    EditWndProc = GetWindowLong ( GetDlgItem(hDlg,IDC_TEST), GWL_WNDPROC ) ;
     
    wsprintf ( buf, _TEXT("DlgWndProc  : %08X\nEditWndProc : %08X\nDefWndProc:%08X\n"), \
      DlgWndProc, EditWndProc, DefWndProc ) ;
    MessageBox ( hDlg, buf, _TEXT("子类化之前"), 0 ) ;

    DefWndProc = SetWindowLong (
      GetDlgItem(hDlg,IDC_TEST), GWL_WNDPROC, (long)EditNewProc ) ;
    return true ;

  case WM_COMMAND:
    switch ( LOWORD(wParam) )
    {
    case IDCANCEL:
      EndDialog ( hDlg, 0 ) ;
      return true ;
    }
    break ;

  case WM_LBUTTONDOWN:
    DlgWndProc = GetWindowLong ( hDlg, GWL_WNDPROC ) ;
    EditWndProc = GetWindowLong ( GetDlgItem(hDlg,IDC_TEST), GWL_WNDPROC ) ;
     
    wsprintf ( buf, _TEXT("DlgWndProc  : %08X\nEditWndProc : %08X\nDefWndProc:%08X\n"), \
      DlgWndProc, EditWndProc, DefWndProc ) ;
    MessageBox ( hDlg, buf, _TEXT("子类化之后"), 0 ) ;

    return false ;
  }

  return false ;
}
  测试结果 :

加密解密之利用子类化技术拓展EDIT控

  测试说明 :左图==》DlgWndProc和EditWndProc实际上就是系统默认的对话框处理函数体和
                    编辑框处理函数体。DefWndProc是用来保存编辑框的默认处理函数的入口,
                          程序中把它初始化为0。
            右图==》DefWndProc保存了系统默认的编辑框处理函数体;
                    EditWndProc即为新添加的函数的入口地址。

  三。进入主题--EDIT功能拓展
功能需求 :1)。输入字符个数不大于8
           2)。可输入的合法字符(0--9,A--F,a--f)
设计概要 :
1)。由于EDIT功能拓展需要处理是字符,所以选择处理的对象为
WM_CHAR :     TCHAR chCharCode = (TCHAR) wParam ; // character code
2)。确保用户输入的字符的合法性
if ( ( chCharCode >= 0X30 && chCharCode <= 0X39 ) || \     ( chCharCode >= 0X41 && chCharCode <= 0X46 ) || \     ( chCharCode >= 0X61 && chCharCode <= 0X66 )  ){              //合法            }
3)。保证EDIT中的字符个数不大于8
TCHAR tEditText[9] ;
int iCharacterNum = GetWindowText ( hEdit, tEditText, sizeof(tEditText)/sizeof(TCHAR) ) ;
if ( iCharacterNum < 8 )
{
  //符合要求,继续接受字符
}
else
{
         //不符合要求,忽略键盘消息(不处理)}
4)。必须保证退格键能够正常运行
if ( chCharCode == _TEXT(8) )
  return CallWindowProc ( (WNDPROC)DefWndProc, hEdit, uMsg, wParam, lParam ) ;
注:退格键的ASCII值为8
详细设计(源代码--VC):
#include "resource.h"
#include <TChar.h>
#include <windows.h>
/**********************************
*  Global variable
***********************************/

LONG DefWndProc = NULL ;

/**********************************
*  Sub function pre-definition
***********************************/

LRESULT CALLBACK EditNewProc ( HWND hEdit, UINT uMsg, WPARAM wParam, LPARAM lParam ) ;
BOOL CALLBACK TestSampleProc ( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) ;


/**********************************
*  main function
***********************************/

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  DialogBox ( hInstance, MAKEINTRESOURCE(IDD_TEST_SAMPLE), 0, TestSampleProc ) ;

  return 0;
}
 
/**********************************
*  Detail of sub function
***********************************/
注:如果使用EDIT控件时不需要“窗体过程切换”,可以把下面这段EditNewProc直接使用,不然可以使用下一部分的DLL 。

LRESULT CALLBACK EditNewProc ( HWND hEdit, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  if ( uMsg == WM_CHAR )
  {
    TCHAR chCharCode = (TCHAR) wParam ;

    if ( ( chCharCode >= 0X30 && chCharCode <= 0X39 ) || \
         ( chCharCode >= 0X41 && chCharCode <= 0X46 ) || \
         ( chCharCode >= 0X61 && chCharCode <= 0X66 )  )
    {
      TCHAR tEditText[9] ;
 
      int iCharacterNum = GetWindowText ( hEdit, tEditText, sizeof(tEditText)/sizeof(TCHAR) ) ;

      if ( iCharacterNum < 8 )
      {
        MessageBeep ( MB_OK ) ;
      }
      else
        return NULL ;
    }

    else if ( chCharCode == _TEXT(8) )
      return CallWindowProc ( (WNDPROC)DefWndProc, hEdit, uMsg, wParam, lParam ) ;

    else
      return NULL ;
  }

  return CallWindowProc ( (WNDPROC)DefWndProc, hEdit, uMsg, wParam, lParam ) ;
}


BOOL CALLBACK TestSampleProc ( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )

  switch ( message )
  {
  case WM_INITDIALOG:
    DefWndProc = SetWindowLong (
      GetDlgItem(hDlg,IDC_TEST), GWL_WNDPROC, (long)EditNewProc ) ;
    return true ;

  case WM_COMMAND:
    switch ( LOWORD(wParam) )
    {
    case IDCANCEL:
      EndDialog ( hDlg, 0 ) ;
      return true ;
    }
    break ;
  }

  return false ;
}
  说明:当用户按键有效时会产生系统提示音。
  
  四。DLL--功能封装

接口函数 :

BOOL WINAPI SetExternEditFunction (
        BOOL isSet,       //是否处于拓展状态(切换窗体过程)
        HWND hParent,     //父窗口句柄
        UINT dwEditId     //EDIT控件ID
 ) ;

  最重要的功能实现 EditNewProc 与 EditDefWndProc 这两个EDIT窗体过程之间的切换。


附:DLL源码( WINXPSP2,VC6.0,WIN32 DLL )

  五:功能更新

7.26更新:支持WM_COPY, WM_CUT, WM_PASTE .

说明:前两个功能比较简单,重点是WM_PASTE.

WM_PASTE功能实现的简略介绍:

1)。取得粘贴板中可复制的合法字串,

2)。检测该字串的长度,若过长则截去多余部分

3)。检测剩余字符串的合法性

4)。模拟键盘消息实现:在鼠标所指向的位置增添字符。

例:EDIT中已有字符串“123Iabc"(‘I’表示鼠标位置)

需要拷贝的字符串“defghijk"

===》 “123deabc"

 
 
 
 
 
 

密码管理

 
对称加密(encryption)和非对称加密算法之间有什么区别,尤其是涉及到加密、签名和哈希(hash)时?
 
高级加密标准(AES)是一种新的、非机密、公开披露的加密算法。这种为保护政府机密情报所采用的加密标准有哪些潜在的限制?
 
由数据库管理员(DBA)定义用户帐户和设置权限是安全的最佳实践吗?我们的安全团队一直负责创建帐户和设置访问权限。现在数据库管理员们说,这是数据库管理员的职责……
 
目前,支付行业的管理人员和安全专家正在讨论保存和保护信用卡数据的正确方法。商家可以选择多种格式,其中包括保存加密格式、基于卡的标记格式等。
 
假设你想要查看从外部源来的数据包,并且想用正确的解密工具来解密数据包。第一种答案是“可以”,第二种答案是“这可能是一个非法的活动。”

热门技术手册排行

 

虚拟专用网络 VPN(Virtual Private Network )能通过公用网络Internet建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定的隧道。VPN是对企业内部网的扩展,它可以帮助远程用户、公司分支机构、商业伙伴及供应商同公司的内部网建立可信的安全连接,并保证数据的安全传输。许多公司使用VPN向公司外部的员工提供企业网络接入。本手册将围绕VPN进行全方位的讲解。

 

“最佳实践”来自英文Best Practice。维基百科对最佳实践的定义是一个管理学概念,认为存在某种技术、方法、过程、活动或机制可以使生产或者管理实践的结果达到最优,并减少出错的可能性。学习应用IT企业安全的最佳实践,其实就是借鉴别人成功的经验,让自己在保护企业安全方面少走弯路。在本手册中,将集合IT业内关于企业安全的最佳实践,并不断更新,以期在企业安全防护方面提供帮助。

 

虚拟化是数据中心的流行技术,它起源于20世纪60年代。它是把昂贵的计算机资源的利用最大化的方式。典型的服务器的利用率不足40%,虚拟化可以更有效地利用技术资源,并节约固定费用。虚拟化的最大优势是,它允许管理员从中央区域为个人电脑和客户设备提供软件。虚拟化不需要管理员对一般任务进行分别考虑。服务器的关机可以带动多用户的关机。

 

黑客策略和技术一直都在进步。黑客还在继续开发新的攻击工具和黑客方法,来恶意访问系统并攻击你的网络,这样企业在开发和采取恰当的方法防御黑客的攻击就变得非常困难。《黑客攻击技术和策略》的技术指南将介绍黑客的内心想法,并帮助你理解恶意攻击者的动机,也提供了一些黑客攻击具体信息的方式,采用的方法以及企业应该采用的保护敏感数据的方法。这里将会提供大量黑客技术和策路的信息,例如允许黑客获取网络系统或者文件访问的系统特征探测。

 

假如你正在寻找一个漏洞扫描器,你可能已经遇到了大量的非常昂贵的商业解决方案,这些方案都有一长串的性能和优点。不幸的是,如果你和我们之中大部分人的情况一样的话,你一般根本没有运行这些奇特的系统的预算。你可能已经退而求其次,转向考虑使用像SATAN或Saint的免费工具。然而,你可能觉得使用这些工具是一种折衷的办法,因为它们的性能设置不能与商业解决方案相比。这时候你就应该学会使用Nessus! 2005年12月Nessus背后的公司Tenable Network Security Inc.发布了Nessus 3,引进了对该产品的全面检查。在写这篇文章时候的最近版本,Nessus 3.2是在2008年3月发布的。Nessus现在可以在多种平台上使用,包括Windows、各种版本的Linux、FreeBSD、Solaris和Mac OS X。以下是这次Nessus3中的重大变化: 下面将介绍如何使用Nessus工具以及Nessus工具的更新。

查看更多
 
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
登录Email
请输入您的登录Email
密码
下次自动登录