1、本机环境:

Windows XP SP3、ADSL

2、开发工具:

WildPackets OmniPeek V5.1.4

Visual C++ 6.0

IE6.0

FlexEdit V2.3.1871

假设认为OmniPeek文件太大不方面下载的朋友,能够使用开源的简易抓包分析工具,先登录codeproject,再单击此处開始下载或邮件给我索取源代码 (ningyusky@tom.com 或 koma0769@vip.qq.com

注意:假设没有登录codeproject的话是无法下载的,你能够自行改动该工具源代码,将每一步GET、POST等动作的数据所有记录于某文件,以便查看分析之.....

我就是如此,由于我的硬件配置不是非常“主流”的,所以每次OmniPeek启动和新建project时,电脑都快要死机.....

3、程序执行效果:

4、源代码说明:

虽如此短短一百余行的代码,但我在debug下调试了三个多小时才攻克了这里每一处存在或可能存在的错误,希望能够与大家交流共同探讨......

/************************************************************************/
/* 函数说明:模拟POST表单——登录新浪邮箱
/* 參 数:无
/* 返 回 值:无
/* By:Koma 2009.10.16 10:18
/************************************************************************/
void CSinaDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(TRUE);
if(m_strUser.IsEmpty()){
MessageBox("邮箱username不能为空","提示");
m_ctrUser.SetFocus();
return;
}

if(m_strUser.Find("@sina") < 1){
MessageBox("请先加入邮箱名的后缀,如@sina...","提示");
m_ctrUser.SetFocus();
return;
}

if(m_strPassword.IsEmpty()){
MessageBox("邮箱password不能为空","提示");
m_ctrUser.SetFocus();
return;
}

char szAccept[] = "Accept: */*";
char szReferer[] = "Referer: http://mail.sina.com.cn//r/n";
CString szFormData = "domain=sina.cn&logintype=uid&u="+ m_strUser +"&domain=sina.com&psw="+ m_strPassword +"&btnloginfr";

HINTERNET hSession;
HINTERNET hConnect;
HINTERNET hRequest;
BOOL bReturn = FALSE;

// 之前使用Socket,如今使用Wininet相关API建立链接
hSession = InternetOpen("InetAll",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
hConnect = InternetConnect(hSession,"mail.sina.com.cn",INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,1);
hRequest = HttpOpenRequest(hConnect,"POST","cgi-bin/login.cgi",NULL,"http://www.sina.com.cn",(LPCSTR *)&szAccept,INTERNET_FLAG_RELOAD,1);

// 提交数据表单
LPVOID pBuf = (LPVOID)szFormData.GetBuffer(szFormData.GetLength());
bReturn = HttpSendRequest(hRequest,"Content-Type: application/x-www-form-urlencoded/r/n",-1,pBuf,szFormData.GetLength());
if(!bReturn)
{
MessageBox("发送Http请求失败!","提示",MB_ICONERROR | MB_OK);
return;
}

char szRecvBuf[1024]; // 接受数据缓冲区
DWORD dwNumberOfBytesRead; // server返回大小
DWORD dwRecvTotalSize=0; // 接受数据总大小
DWORD dwRecvBuffSize=0; // 接受数据buf的大小
CFile m_File; // 将返回数据写入文件
CString strTemp; // 暂时消息框

m_File.Open("RecvData.tmp",CFile::modeWrite | CFile::modeCreate,NULL);
memset(szRecvBuf,0,1024);

do
{
// 開始读取数据
bReturn = InternetReadFile(hRequest,szRecvBuf,1024,&dwNumberOfBytesRead);
if(!bReturn)
{
MessageBox("InternetReadFile Error !","提示",MB_ICONERROR | MB_OK);
break;
}

// 统计接受数据的大小
szRecvBuf[dwNumberOfBytesRead] = '/0';
dwRecvTotalSize += dwNumberOfBytesRead;
dwRecvBuffSize += strlen(szRecvBuf);

// 将缓冲区写入文件
m_File.Write(szRecvBuf,strlen(szRecvBuf));
m_File.Flush();
} while(dwNumberOfBytesRead !=0);

// 检查接受到的数据包是否完整
m_File.Close();
if(dwRecvTotalSize != dwRecvBuffSize)
{
MessageBox("接受数据时丢包,返回大小不一致!");
return ;
}

CString str=""; // 所有内容
CString strLine=""; // 单行内容
CStdioFile file; // 文件对象
if(!file.Open("RecvData.tmp",CFile::modeRead | CFile::typeText,NULL))
{
CString strTemp;
strTemp.Format("Open file error:%d",GetLastError());
MessageBox(strTemp);
return;
}

// 按行读取tmp所有内容
while(file.ReadString(strLine))
{
str = str + strLine;
}
file.Close();
wchar_t* pWChar = NULL;
DWORD nLen1;

// 将新浪网页UTF-8格式编码转换成Unicode
nLen1 = MultiByteToWideChar(CP_UTF8,0,str,str.GetLength(),pWChar,0);
pWChar = new wchar_t[nLen1 + 1];
memset(pWChar,0,(nLen1 + 1 ) * sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8,0,str,str.GetLength(),pWChar,nLen1);

char* pChar = NULL;
DWORD nLen2;

nLen2 = WideCharToMultiByte(CP_ACP,0,pWChar,nLen1,pChar,0,NULL,NULL);
pChar = new char[nLen2 + 1];
memset(pChar,0, nLen2 + 1);
WideCharToMultiByte(CP_ACP,0,pWChar,nLen1,pChar,nLen2,NULL,NULL);

// 查找登录时server时返回的信息
str.Format("%s",pChar);
if(str.Find("安全退出",0)>=1)
{
MessageBox("邮箱登录成功!","提示");
m_ctrUser.SetFocus();
}
else
{
MessageBox("邮箱登录失败!","提示",MB_ICONERROR | MB_OK);
m_ctrUser.SetFocus();
}

// 删除暂时文件、释放内存
DeleteFile("RecvData.tmp");
delete pChar;
delete pWChar;
}

 5、源代码下载地址

http://download.csdn.net/source/1747851

VC POST表单——登录验证新浪邮箱的更多相关文章

  1. js表单简单验证(手机号邮箱)

    1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncod ...

  2. AngularJS学习之 登录表单 清爽验证(边学边更新)

    注册过程的确好多需要验证的,但是注册成功之后的登录就简单多了, 只要用户 输入 用户名和密码, ajax向后台提交登录请求, 根据返回的结果确定用户名或者密码是否正确即可登录. 所以这个登录表单的验证 ...

  3. WEB安全讨论-表单登录是先验证验证码还是密码

    表单登录是先验证验证码还是密码? 肯定是验证码呀!!!这是毋庸置疑的.但是发现有人会验证密码,感觉先验证密码和先验证验证码是一个概念是一样的.但是其实是完全不一样的.下面我们来一起详细的剖析一下: 消 ...

  4. aspx中的表单验证 jquery.validate.js 的使用 以及 jquery.validate相关扩展验证(Jquery表单提交验证插件)

    这一期我们先讲在aspx中使用 jquery.validate插件进行表单的验证, 关于MVC中使用 validate我们在下一期中再讲     上面是效果,下面来说使用步骤 jQuery.Valid ...

  5. EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法

    带参提交一次查询,从服务器加载新数据.这是一个神奇的方法 $('#dg').datagrid('load',{ code: '01', name: 'name01' }); easyui修改操作的回显 ...

  6. easyui表单多重验证,动态设置easyui控件

    要实现的功能:在做添加学生信息的时候,利用easyui的验证功能判断 学号是否重复和学号只能为数字 最终效果如下图: 但在做这个的过程中,遇到了一系列的问题: 扩展validatebox的验证方法,最 ...

  7. 10款精美的HTML5表单登录联系和搜索表单

    1.HTML5/CSS3仿Facebook登录表单 这款纯CSS3发光登录表单更是绚丽多彩.今天我们要分享一款仿Facebook的登录表单,无论从外观还是功能上说,这款登录表单还是挺接近Faceboo ...

  8. HTML5表单及其验证

    随笔- 15 文章- 1 评论- 115 HTML5表单及其验证   HTML表单一直都是Web的核心技术之一,有了它我们才能在Web上进行各种各样的应用.HTML5 Forms新增了许多新控件及其A ...

  9. Spring Security 表单登录

    1. 简介 本文将重点介绍使用Spring Security登录. 本文将构建在之前简单的Spring MVC示例之上,因为这是设置Web应用程序和登录机制的必不可少的. 2. Maven 依赖 要将 ...

随机推荐

  1. MySql 安装及0基础使用具体解释

    1. sudo apt-get install mysql-server, input administrator password , '123' 2. enter mysql promot in ...

  2. SurfaceView的一个小应用:开发示波器

    SurfaceView与普通View还有一个重要区别:View的绘图必须在UI线程中进行,但SurfaceView不存在这个问题,因为它是由SurfaceHolder来完成的.所以对于View组件,如 ...

  3. LNK1207: incompatible PDB format in********

    LNK1207: incompatible PDB format in******** VC中错误:LINK : fatal error LNK1207: incompatible PDB forma ...

  4. Android-IA Power Manager (S3)

    Sleep and wake up

  5. asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功。请重试。 Login控件

    原文:asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功.请重试. Login控件 现象1.asp.net使用自定义sql server身份验证数据库,在A机器新增用户A,可以登录成 ...

  6. 强大的PropertyGrid

    PropertyGrid, 做工具一定要用这东西..... 把要编辑的对象看成类的话, 全部要编辑的属性就是成员 嗯嗯, 近期看了几眼Ogitor, 它对于PropertyGrid的使用就非常不错 全 ...

  7. 用友CDM系统期初导入商品资料经验

    1.       倒入商品资料,是导入表spkfk(商品档案表).spkfjc(商品总结存表),主要是将spkfk全部编码导入. 2.       导入客商资料,是导入表mchk(业务单位登记表).m ...

  8. QT Programming 1

    1.控制台输出 helloworld #include<QtCore/QCoreApplication> #include<QDebug> int main(int argc, ...

  9. C#开发Linux守护进程

    用C#开发Linux守护进程   Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon ...

  10. SignalR技术

    Asp.net SignalR快速入门 一.前言 之前半年时间感觉自己有点浮躁,导致停顿了半年多的时间没有更新博客,今天重新开始记录博文,希望自己可以找回初心,继续沉淀.由于最近做的项目中用到Sign ...