怎么用DELPHI或者VB写个网页游戏的外挂?
主要实现自动提交数据包的功能,网上找不到资料看。
我用WINSOCK EXPERT抓取我点击一个按钮后发送的数据包,然后用DELPHI写程序模拟出这个动作,就达到了代替人工点游戏的目的。
但是不知道怎么搜索资料,搜索过"delphi 发送数据包""delphi 提交数据包""delphi 提交表单"等等,都不行。
请高手赐教怎么才可以找到相关资料,或者直接给我提供相关资料,小弟感激不尽!!!!!!!!!!!!!
主要实现自动提交数据包的功能,网上找不到资料看。
我用WINSOCK EXPERT抓取我点击一个按钮后发送的数据包,然后用DELPHI写程序模拟出这个动作,就达到了代替人工点游戏的目的。
但是不知道怎么搜索资料,搜索过"delphi 发送数据包""delphi 提交数据包""delphi 提交表单"等等,都不行。
请高手赐教怎么才可以找到相关资料,或者直接给我提供相关资料,小弟感激不尽!!!!!!!!!!!!!
登录时识别验证码(解决不了就人工输入), 用IdHttp控件就可以Get/Post数据。还需要写一个html的解析器(用正则表达式等)来分析Get回来的文件信息。
给你一个登录163邮箱,提交用户名密码的例子:var
Param: TStringList;
ret: string;
begin
IdHttp1.Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*';
IdHttp1.Request.AcceptEncoding := 'gzip, deflate';
IdHttp1.Request.AcceptLanguage := 'zh-cn';
IdHttp1.Request.CacheControl := 'no-cache';
IdHttp1.Request.Connection := 'Keep-Alive';
IdHttp1.Request.ContentType := 'application/x-www-form-urlencoded';
IdHttp1.Request.Host := 'reg.163.com';
IdHttp1.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)';
IdHttp1.Request.Referer := 'https://reg.163.com/logins.jsp?url=http://fm163.163.com/coremail/fcg/ntesdoor2?lightweight=1&&';
Param := TStringList.Create;
Param.Add('url=http://fm163.163.com/coremail/fcg/ntesdoor2?lightweight=1');
Param.Add('type=1');
Param.Add('product=163');
Param.Add('savelogin=');
Param.Add('outfoxer=');
Param.Add('username=liangqingzhi1984');
Param.Add('password=******');
UniCode2Gb(IdHttp1.Post('http://reg.163.com/logins.jsp', Param), ret);
Memo1.Lines.Add(ret);
end;
UniCode2Gb 是在网上找到的转换函数。那些提交信息是用HttpWacth Pro 这个工具在登录163邮箱的时候监测到的。
网页游戏外挂、论坛灌水机应该都是这样的原理,外挂还需要有cookies的处理。PS:玩了战神世界2近两年,虽然没有深入的研究过外挂,但csdn java版的大花猫用python写过一个,我曾经请教过他
谢谢楼上朋友赐教,不过还没有得到我想要的资料,大家有过见解的望不屑赐教,感激不尽。
POST /GameTools/firstRsProc.aspx?apidos=795010 HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Referer: http://war1.awarz.com/module_page/game_ms.aspx?aid=9179D0AA056D2C78&d=4
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; MAXTHON 2.0)
Host: war1.awarz.com
Content-Length: 13
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: cnzz_a853112=49; rtime=1; ltime=1214390270343; cnzz_eid=90521001-http%3A//war1.awarz.com/module_page/game_ms.aspx%3Faid%3D5AAFFDABA90AEC69%26d%3D6; ASP.NET_SessionId=0rvemlmi152yhq55u4unwi45
这样的数据包提交给服务器就可以了!
Accept: */*
Accept-Language: zh-cn
Referer: http://war1.awarz.com/module_page/game_ms.aspx
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; MAXTHON 2.0)
Host: war1.awarz.com
Content-Length: 209
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: cnzz_a853112=10; rtime=3; ltime=1214539903281; cnzz_eid=90521001-http%3A//war1.awarz.com/module_page/game_ms.aspx%3Faid%3D5AAFFDABA90AEC69%26d%3D6; ASP.NET_SessionId=i4msdn553qf3jd55ik4lh455 一个,下面紧跟着还有一个 ids=3F2989F9-9E60-74A8-1898-E16C361A36FE &posz=6&posx=953&posy=23&speedmax=100&speedprop=0&duration_day=44&consumption=107&objtyp=0&dragold=0&drametal=0&dracrystal=0&drazsoe=0&accMode=0&otherRes=&zsoeType=1
这么2个数据包,我构造的那个地址直接放浏览器提交不能成功。请帮忙!
bbs.wghai.com
www.wgum.net
提取其中的元素,然后通过操作元素来达到操作网页的目的
比如说有一个按钮
你先在 IE打开,查看他的HTML源代码,然后找到那个按钮是个什么元素
找到元素后,使用MSHTML中的接口来对其操作就可以了。
CSDN的登录
先用WebBrowser定位到登录页面
WebBrowser1.Navigate('http://passport.csdn.net/UserLogin.aspx?from=http://community.csdn.net/');
然后,看其HTML源代码,发现
名字为 ctl00$CPH_Content$tb_LoginNameOrLoginEmail的元素就是 其用户名的输入框了。
此时
使用
(WebBrowser1.Document as IHTMLDOCUMENT2).all.item('ctl00$CPH_Content$tb_LoginNameOrLoginEmail',emptyParam)来得到这个元素了。var
UserEdt,LogBtn: IHTMLELEMENT;
begin
UserEdt := (WebBrowser1.Document as IHTMLDOCUMENT2).all.item('ctl00$CPH_Content$tb_LoginNameOrLoginEmail',emptyParam) as IHTMLELEMENT;
UserEdt.setAttribute('value','test',0);//这里就设置了test到输入用户名的编辑框中了 。
//依此一样,输入密码,验证码
//然后找那个登录按钮,通过他的HTML源代码,可以知道,那个按钮其实是个图片,元素的名字叫 “ctl00$CPH_Content$Image_Login”
//同样的方法
LogBtn := (WebBrowser1.Document as IHTMLDOCUMENT2).all.item('ctl00$CPH_Content$Image_Login',emptyParam) as IHTMLELEMENT;
LogBtn.Click;//调用按钮的点击事件开始登录。
end;
CSDN的登录
先用WebBrowser定位到登录页面
WebBrowser1.Navigate('http://passport.csdn.net/UserLogin.aspx?from=http://community.csdn.net/');
然后,看其HTML源代码,发现
名字为 ctl00$CPH_Content$tb_LoginNameOrLoginEmail的元素就是 其用户名的输入框了。
此时
使用
(WebBrowser1.Document as IHTMLDOCUMENT2).all.item('ctl00$CPH_Content$tb_LoginNameOrLoginEmail',emptyParam)来得到这个元素了。var
UserEdt,LogBtn: IHTMLELEMENT;
begin
UserEdt := (WebBrowser1.Document as IHTMLDOCUMENT2).all.item('ctl00$CPH_Content$tb_LoginNameOrLoginEmail',emptyParam) as IHTMLELEMENT;
UserEdt.setAttribute('value','test',0);//这里就设置了test到输入用户名的编辑框中了 。
//依此一样,输入密码,验证码
//然后找那个登录按钮,通过他的HTML源代码,可以知道,那个按钮其实是个图片,元素的名字叫 “ctl00$CPH_Content$Image_Login”
//同样的方法
LogBtn := (WebBrowser1.Document as IHTMLDOCUMENT2).all.item('ctl00$CPH_Content$Image_Login',emptyParam) as IHTMLELEMENT;
LogBtn.Click;//调用按钮的点击事件开始登录。
end;
CSDN的登录
先用WebBrowser定位到登录页面
WebBrowser1.Navigate('http://passport.csdn.net/UserLogin.aspx?from=http://community.csdn.net/');
然后,看其HTML源代码,发现
名字为 ctl00$CPH_Content$tb_LoginNameOrLoginEmail的元素就是 其用户名的输入框了。
此时
使用
(WebBrowser1.Document as IHTMLDOCUMENT2).all.item('ctl00$CPH_Content$tb_LoginNameOrLoginEmail',emptyParam)来得到这个元素了。var
UserEdt,LogBtn: IHTMLELEMENT;
begin
UserEdt := (WebBrowser1.Document as IHTMLDOCUMENT2).all.item('ctl00$CPH_Content$tb_LoginNameOrLoginEmail',emptyParam) as IHTMLELEMENT;
UserEdt.setAttribute('value','test',0);//这里就设置了test到输入用户名的编辑框中了 。
//依此一样,输入密码,验证码
//然后找那个登录按钮,通过他的HTML源代码,可以知道,那个按钮其实是个图片,元素的名字叫 “ctl00$CPH_Content$Image_Login”
//同样的方法
LogBtn := (WebBrowser1.Document as IHTMLDOCUMENT2).all.item('ctl00$CPH_Content$Image_Login',emptyParam) as IHTMLELEMENT;
LogBtn.Click;//调用按钮的点击事件开始登录。
end;
const pDisp: IDispatch; var URL: OleVariant);
var
vDocument:IHTMLDocument2;
useredt,userPASS:IHTMLELEMENT;
begin
if q then
begin
UserEdt := (WebBrowser1.Document as IHTMLDOCUMENT2).all.item('logUsers',emptyParam) as IHTMLELEMENT;
UserEdt.setAttribute('value','cc3802',0);
Userpass := (WebBrowser1.Document as IHTMLDOCUMENT2).all.item('logPasses',emptyParam) as IHTMLELEMENT;
Userpass.setAttribute('value','*******',0);
q:=false;
vDocument := WebBrowser1.Document as IHTMLDocument2;
vDocument.parentWindow.execScript('document.loginForm.submit()', 'javascript'); end;
end;
procedure TForm1.Button7Click(Sender: TObject);
var
astring:String;
vDocument:IHTMLDocument2;
begin
vDocument := WebBrowser1.Document as IHTMLDocument2;
astring:='url_link('+'''../DutyPage/SubmitDuty2.aspx?apidos=795010&sl=1'''+')';
vDocument.parentWindow.execScript(astring,'javascript');
end;
因为我发现他网页源代码里按钮里有事件<a href="" onclick="javascript:document.loginForm.submit();return false;"><img src="images/im1_21.gif" alt="" width="97" height="27" border="0"></a></td>所以我模拟按钮的点击事件可以达到功能。
<ul>
<li class="arm_bh1">2</li>
<li class="arm_sl1">1</li>
<li class="arm_mb1"><a href="javascript:void(0);" onMouseOver="showdiv(event,'Hvt9DY6kc94bT73wDI5IrmorOe1Pvwlw8bFc4TFEthNCt0WzsZ1N6Cwng4P8rh43')" onMouseOut="hiddendiv(event,'Hvt9DY6kc94bT73wDI5IrmorOe1Pvwlw8bFc4TFEthNCt0WzsZ1N6Cwng4P8rh43')">偷运走私①大队<a></li>
<li class="arm_rw1">空闲</li>
<li class="arm_time1">---</li>
<li class="arm_ml1"><input type="radio" name="ids" value="951BDBFE-ED6B-3491-FA92-70E0BE07AC71 "></li>
</ul>
</div>
<div class="arm_n">
<ul>
<li class="arm_bh1">3</li>
<li class="arm_sl1">1</li>
<li class="arm_mb1"><a href="javascript:void(0);" onMouseOver="showdiv(event,'bJtKIq5UebVmeJAT2UwFU5XmxFvsndzjvyEZtzH3NIqllMgWrDd6ZIkkCsbx75SA')" onMouseOut="hiddendiv(event,'bJtKIq5UebVmeJAT2UwFU5XmxFvsndzjvyEZtzH3NIqllMgWrDd6ZIkkCsbx75SA')">黑鹰②舰队<a></li>
<li class="arm_rw1">空闲</li>
<li class="arm_time1">---</li>
<li class="arm_ml1"><input type="radio" name="ids" value="FEE92689-9EC3-C4E0-9ADE-DE05C9071C06 "></li>
</ul>
</div>
<div class="arm_n">
<ul>
<li class="arm_bh1">4</li>
<li class="arm_sl1">1</li>
<li class="arm_mb1"><a href="javascript:void(0);" onMouseOver="showdiv(event,'ABNWIVOzDaO99BloOWgcBtdI+eC9SYcjSn5Jna0omiNNuD4cXbsoPmOkhJiHa9SU')" onMouseOut="hiddendiv(event,'ABNWIVOzDaO99BloOWgcBtdI+eC9SYcjSn5Jna0omiNNuD4cXbsoPmOkhJiHa9SU')">护盾运输<a></li>
<li class="arm_rw1">空闲</li>
<li class="arm_time1">---</li>
<li class="arm_ml1"><input type="radio" name="ids" value="3D73EC9A-A121-04CD-69B5-8E5EF57E5C41 "></li>
</ul>
</div>就是每个单选框点击事件中把ids这个变量赋值为舰队在系统中的3D73EC9A-A121-04CD-69B5-8E5EF57E5C41 这种代号,
这样我设想,只要把ids赋值为我需要挂机时用的舰队(舰队是固定的,我用同样的舰队不断出征攻打海盗得到经验)就可以再模拟“出征”按钮,就可以成功派出了,问题就出在ids赋值这里,这个出征界面是一个嵌套界面,是通过主页面的<td width="33" height="30" class="rb"><img src="../images/chuz.gif" width="23" height="19"></td>
<td class="br"><a href="javascript:void(0);" onClick="javascript:url_link('../GameTools/flota_first.aspx?apidos=795010');">舰队出征</a></td>
</tr>
这个调用的页面,嵌套在主页面,就是说点了这个链接以后,浏览器地址栏还是显示http://war1.awarz.com/module_page/game_ms.aspx这个主界面,不知道什么原理,应该是嵌套的框架吧,框架内的变量怎么赋值?这个就是我的问题
http://www.grscript.com/
我用vb写的 校内 好友买卖的辅助软件源码..
你可以参考下,不涉及到坐标问题,就是分析html文件结构,然后确定按钮目标,然后模拟点击。
http://user.qzone.qq.com/1154852220
本质就是分析特定网站的HTTP交互数据:
1.分析特定网站的请求参数
2.定时请求服务器,分析返回的结果(有可能是特定格式的字符串)