模拟网页行为之实践篇二

在模拟网页行为中,最常用的就是提交表单了,其次就是获取验证图片数据,再次hook网页中的js代码的实现。


先说具体的应用场景,简单的场景,如填写用户名密码登陆,这里就涉及到获取表单,填写表单数据,提交表单三个过程。

在网页数据中,表单的形式一般都会带有名字,ID,提交的处理网页的url和其拥有的几个IHTMLInputElement元素,具体网页代码如下:

<form name="loginFrm1" id="loginFrm1" method="post" action="https://mlogin.plaync.com/login/signin"><input type="hidden" name="return_url" value="http://lineage.plaync.com/"><fieldset><legend>로그인</legend><div class="selectId"><select name="game_id"><option value="13">통합계정</option><option value="31">게임계정</option></select></div><div class="login_input"><input type="text" id="id" name="login_name" maxlength="64" size="12" class="user_id" autocomplete="off" title="아이디 또는 이메일 입력"><input type="password" id="pwd" name="password" class="user_pw" maxlength="16" size="12" autocomplete="off" title="비밀번호 입력"><input type="button" name="login" value="로그인" class="submit"></div></fieldset><ul class="member"><li class="join"><a href="http://go.plaync.co.kr/Account/Join">회원가입</a></li><li class="find"><a href="http://go.plaync.co.kr/Account/SearchAccount">계정</a>/<a href="http://go.plaync.co.kr/Account/SearchPassword">비밀번호찾기</a></li></ul><div class="custom"><a class="new" href="http://lineage.plaync.com/service/freepay/index"><i></i>처음이신가요?</a><a class="comming" href="http://lineage.plaync.com/service/returnbrave/index"><i></i>오랜만이신가요?</a></div></form>
可以看到,表单名字为loginFrm1,ID为loginFrm1,提交的url为https://mlogin.plaync.com/login/signin,拥有的几个元素login_name, password,login。

首先获取表单,基本原理也是找到DOC,然后通过get_forms找到表单的集合,然后遍历表单找到名字为loginfrm1的表单对象IHTMLFormElement将之返回。c++代码如下:

CComQIPtr< IHTMLFormElement > CWebLoginDlg::GetFormByName( std::wstring name )
{IDispatch *pDisp = NULL;CComQIPtr< IHTMLFormElement > ret = pDisp;CComPtr<IHTMLDocument2> pIHTMLDocument2;GetDHtmlDocument(&pIHTMLDocument2);if (pIHTMLDocument2 == NULL){return ret;}HRESULT hr;  CComBSTR bstrTitle;  pIHTMLDocument2->get_title( &bstrTitle );CComQIPtr< IHTMLElementCollection > spElementCollection;  hr = pIHTMLDocument2->get_forms( &spElementCollection ); //取得表单集合  if ( FAILED( hr ) )  {ATLTRACE("获取表单的集合 IHTMLElementCollection 错误");}  long nFormCount=0;hr = spElementCollection->get_length( &nFormCount );  if ( FAILED( hr ) )  {ATLTRACE("获取表单数目错误");}  for(long i=0; i<nFormCount; i++)  {  pDisp = NULL;hr = spElementCollection->item( CComVariant( i ), CComVariant(), &pDisp );  if ( FAILED( hr ) )  {continue;}CComQIPtr< IHTMLFormElement > spFormElement = pDisp;pDisp->Release();long nElemCount=0; hr = spFormElement->get_length( &nElemCount );if ( FAILED( hr ) )  {continue;}CComBSTR formName;hr = spFormElement->get_name(&formName);if (FAILED(hr)){continue;}LPCTSTR lpName = OLE2CT(formName);if (std::wstring(lpName) == name){ret = spFormElement;}}return ret;
}

其次填写表单,基本原理是通过get_length获取表单域个数,然后遍历表单域元素,通过GetpropertyByName找到需要填写的元素,然后用PutPropertyByName填写表单值,具体c++实现如下:

void CWebLoginDlg::InputFormElement( CComQIPtr< IHTMLFormElement > spFormElement, std::map<std::wstring, std::wstring> formDataList )
{if (spFormElement != NULL){long nElemCount=0; HRESULT hr = spFormElement->get_length( &nElemCount );for(long j=0; j<nElemCount; j++)  {  CComDispatchDriver spInputElement; //取得第 j 项表单域  hr = spFormElement->item( CComVariant( j ), CComVariant(), &spInputElement );  if ( FAILED( hr ) ) continue;CComVariant vName,vVal,vType;  //取得表单域的 名,值,类型  hr = spInputElement.GetPropertyByName( L"name", &vName );  if( FAILED( hr ) ) continue;hr = spInputElement.GetPropertyByName( L"value", &vVal ); if( FAILED( hr ) ) continue;hr = spInputElement.GetPropertyByName( L"type", &vType );  if( FAILED( hr ) ) continue; LPCTSTR lpName = vName.bstrVal?  OLE2CT( vName.bstrVal ) : _T("NULL");LPCTSTR lpVal  = vVal.bstrVal?  OLE2CT( vVal.bstrVal  ) : _T("NULL");LPCTSTR lpType = vType.bstrVal?  OLE2CT( vType.bstrVal ) : _T("NULL");ATLTRACE(L"old name:%s, lpVal:%s lpType:%s", lpName, lpVal, lpType);if (formDataList.find(lpName) != formDataList.end()){CComVariant vContent(formDataList[lpName].c_str());spInputElement.PutPropertyByName(L"value", &vContent);}hr = spInputElement.GetPropertyByName( L"name", &vName );  if( FAILED( hr ) ) continue;  hr = spInputElement.GetPropertyByName( L"value", &vVal ); if( FAILED( hr ) ) continue;  hr = spInputElement.GetPropertyByName( L"type", &vType );  if( FAILED( hr ) ) continue; lpName = vName.bstrVal?  OLE2CT( vName.bstrVal ) : _T("NULL");lpVal  = vVal.bstrVal?  OLE2CT( vVal.bstrVal  ) : _T("NULL");lpType = vType.bstrVal?  OLE2CT( vType.bstrVal ) : _T("NULL");ATLTRACE(L"new name:%s, lpVal:%s lpType:%s", lpName, lpVal, lpType);}}
}

最后提交表单,这个很简单,首先找到提交按钮对象,然后调用对象接口click,即可实现提交表单,具体c++代码实现如下:

CComQIPtr< IHTMLElement > pButton = GetElementByClassName(L"login");
if (pButton != NULL)
{ATLTRACE("dologin");pButton->click();
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模拟网页行为之实践篇三

现在来谈下验证码图片的获取方式&#xff0c;带有验证码的地方都会附带有个刷新按钮&#xff0c;而刷新按钮的地方就是获取验证码网址代码。如果看过前面写的《模拟网页行为之工具篇》就会很容易定位到代码位置。定位到代码位置后看下图&#xff1a; 基本可以看到的是获取验证码…

调试某游戏副本中的加亮提示信息思路

对于经常玩游戏的人比较容易知道&#xff0c;在副本里面&#xff0c;当进行到某个步骤或者当队员站位触发某个情景时&#xff0c;游戏界面中央会出现字体提示字符&#xff0c;可能是BOSS跟你的对话也有可能是游戏给你的下一步提示。让我们分析下&#xff0c;这个情景到底是本地…

RC4算法实现

1、密钥流&#xff1a;RC4算法的关键是根据明文和密钥生成相应的密钥流&#xff0c;密钥流的长度和明文的长度是对应的&#xff0c;也就是说明文的长度是500字节&#xff0c;那么密钥流也是500字节。当然&#xff0c;加密生成的密文也是500字节&#xff0c;因为密文第i字节明文…

模拟网页行为之实践四

这篇谈下c如何hook网页中的JS函数&#xff0c;即网页可以执行我们修改的JS函数。 相应的步骤可分为&#xff1a; 1.找到需要修改函数的时机。 2.得到需要修改函数的com对象。 3.将我们新的com对象替换修改函数。 第一步&#xff0c;找到需要修改函数的时机&#xff0c;在谈…

SHA-256算法实现

SHA-256 算法输入报文的最大长度不超过2^64 bit&#xff0c;输入按512-bit 分组进行处理&#xff0c;产生 的输出是一个256-bit 的报文摘要。该算法处理包括以下几步&#xff1a; STEP1&#xff1a;附加填充比特。对报文进行填充使报文长度与448 模512 同余&#xff08;长度…

RSA算法演绎

RSA是第一个也是使用的最广发的公钥加密算法&#xff0c;在1978年由R.Rivest、AdiShamir和Adleman三人发明&#xff0c;并以他们的名字命名。RSA算法的安全性基于大数因子分解的困难性&#xff0c;下面介绍一下它的基本原理&#xff1a; 1、生成公钥和私钥 (1) 选取两个大素数…

分数的乘法逆元和负数的取模运算

1.乘法逆元 A.定义 如果ax≡1 (mod p),且gcd(a,p)1&#xff08;a与p互质&#xff09;&#xff0c;则称a关于模p的乘法逆元为x。 既然有ax≡1 (mod p)&#xff0c;那么有ax - py 1,x是a关于模p的乘法逆元。 B.分数的乘法逆元 对于实数域&#xff0c;一个数的乘法逆元就是其倒数…

ecc算法入门介绍

一、从平行线谈起。 平行线&#xff0c;永不相交。没有人怀疑把&#xff1a;&#xff09;不过到了近代这个结论遭到了质疑。平行线会不会在很远很远的地方相交了&#xff1f;事实上没有人见到过。所以“平行线&#xff0c;永不相交”只是假设&#xff08;大家想想初中学习的平行…

Intel Hex概述

什么是Intel Hex文件 Intel HEX文件时遵循Intel HEX文件格式的ASCII文本文件。在Intel HEX文件的每一行都包含了 一个HEX记录。这些记录是由一些代表机器语言代码和常量的16进制数据组成的。Intel HEX文件常用来传输要存储在ROM 或者 EPROM中的程序和数据。大部分的EPROM编程器…

AndroidStudio+ideasmali动态调试smali汇编

0x00 前言 之前对于app反编译的smali汇编语言都是静态分析为主&#xff0c;加上一点ida6.6的动态调试&#xff0c;但是ida的调试smali真的像鸡肋一样&#xff0c;各种不爽&#xff0c;遇到混淆过的java代码就欲哭无泪了。后来知道IDEA用一款插件也可以实现smali的动态调试&a…

使用IDA Pro动态调试SO文件

&#xff08;1&#xff09;在IDA的安装路径中找到android_server文件。 &#xff08;2&#xff09;将android_server拷贝到手机的/data/local/tmp目录下面。 &#xff08;3&#xff09; 将手机插上电脑&#xff0c;打开命令提示符&#xff0c; 先输入”adb shell”,然后输入”…

c#调用c++dll接口及回调函数

在合作开发时&#xff0c;C#时常需要调用CDLL&#xff0c;当传递参数时时常遇到问题&#xff0c;尤其是传递和返回字符串是&#xff0c;现总结一下&#xff0c;分享给大家&#xff1a;VC中主要字符串类型为&#xff1a;LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWST…

机器学习或深度学习的数据读取工作(大数据处理)

机器学习或深度学习的数据读取工作&#xff08;大数据处理&#xff09;主要是.split和re.findall和glob.glob运用。 读取文件的路径&#xff08;为了获得文件内容&#xff09;和提取文件路径中感兴趣的东西(标签) 1&#xff0c;“glob.glob”用于读取文件路径 2&#xff0c;“.…

windows平台下的反调试技术

在调试一些病毒程序的时候&#xff0c;可能会碰到一些反调试技术&#xff0c;也就是说&#xff0c;被调试的程序可以检测到自己是否被调试器附加了&#xff0c;如果探知自己正在被调试&#xff0c;肯定是有人试图反汇编啦之类的方法破解自己。为了了解如何破解反调试技术&#…

SQLite加解密

0x00 SQLite概述 SQLite是一个轻量级、跨平台的&#xff0c;开源的数据库引擎&#xff0c;它在读写效率&#xff0c;消耗总量、延迟时间和整体简单性上具有的优越性&#xff0c;使其成为移动平台数据库的最佳解决方案。 然而免费版的SQLite有一个致命缺点&#xff1a;不支持加…

android和linux操作系统的区别

Android是由Google为移动设备开发的开源操作系统。Android软件的原始开发商Android公司是由Google&#xff0c;Inc.于2005年购买的。它是基于Linux 2.6内核开发的。Linux操作系统于1991年由Linus Torvalds作为台式计算机的开源操作系统开发。Linux操作系统是作为MINIX操作系统开…

Android系统架构图

一、Aplications&#xff08;应用层&#xff09; 应用是用Java语言编写的云新在虚拟机上的程序。 二、Application Framework&#xff08;应用框架层&#xff09; 这一层是编写Google发布的核心应用时所使用的API框架&#xff0c;开发人员可以使用这些框架来开发自己的应用。 V…

SHA1算法实现及详解

1 SHA1算法简介 安全哈希算法&#xff08;Secure Hash Algorithm&#xff09;主要适用于数字签名标准&#xff08;Digital Signature Standard DSS&#xff09;里面定义的数字签名算法&#xff08;Digital Signature Algorithm DSA&#xff09;。对于长度小于2^64位的消息&…

CRC32算法实现

CRC32 检错能力极强&#xff0c;开销小&#xff0c;易于用编码器及检测电路实现。从其检错能力来看&#xff0c;它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑&#xff0c;均远远优于奇偶校验及算术和校验等方式。因而&#xff0c;在数据存储和数据通讯领域&…

AES算法重点详解和实现

可以看到&#xff0c;在原始数据长度为16的整数倍时&#xff0c;假如原始数据长度等于16*n&#xff0c;则使用NoPadding时加密后数据长度等于16*n&#xff0c;其它情况下加密数据长度等于16*(n1)。在不足16的整数倍的情况下&#xff0c;假如原始数据长度等于16*nm[其中m小于16]…