阳光外挂原理原文地址: http://www.cppblog.com/epubcn/archive/2009/07/28/91315.html
作者介绍了两个工具, 我的程序也同样使用这两个工具, HttpWatch以及JSONViewer
第一部分: 如何实现对网页进行"POST"和"GET"动作
使用WinINet应用程序接口.使用三个函数实现这个动作:InternetOpen, InternetConnect, HttpOpenRequest, 我在网络上找到其包装函数, 使用起来还挺不错.我的程序GET和POST数据都用这个函数.
1CString HttpRequest(char * lpHostName,short sPort,char * lpUrl,char * lpMethod,char * lpPostData,int nPostDataLen)
2{
3 HINTERNET hInternet,hConnect,hRequest;
4 BOOL bRet;CString strResponse;
5
6 hInternet = InternetOpen("User-Agent",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
7 if(!hInternet)
8 goto Ret0;
9
10 hConnect = InternetConnect(hInternet,lpHostName,sPort,NULL,"HTTP/1.1",INTERNET_SERVICE_HTTP,0,0);
11 if(!hConnect)
12 goto Ret0;
13
14 hRequest = HttpOpenRequest(hConnect,lpMethod,lpUrl,"HTTP/1.1",NULL,NULL,INTERNET_FLAG_RELOAD,0);
15 if(!hRequest)
16 goto Ret0;
17
18
19
20 bRet = HttpAddRequestHeaders(hRequest,"Content-Type: application/x-www-form-urlencoded", -1,HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD);
21 if(!bRet)
22 goto Ret0;
23
24 bRet = HttpSendRequest(hRequest,NULL,0,lpPostData,nPostDataLen);
25
26 if(!bRet)
27 {
28 goto Ret0;
29 }
30
31 // 读取返回数据
32 while(TRUE)
33 {
34 char cReadBuffer[4096];
35 unsigned long lNumberOfBytesRead;
36 bRet = InternetReadFile(hRequest,cReadBuffer,sizeof(cReadBuffer) - 1,&lNumberOfBytesRead);
37 if(!bRet || !lNumberOfBytesRead)
38 break;
39 cReadBuffer[lNumberOfBytesRead] = 0;
40 strResponse = strResponse + cReadBuffer;
41 }
42
43Ret0:
44 if(hRequest)
45 InternetCloseHandle(hRequest);
46 if(hConnect)
47 InternetCloseHandle(hConnect);
48 if(hInternet)
49 InternetCloseHandle(hInternet);
50
51 return strResponse;
52}
2{
3 HINTERNET hInternet,hConnect,hRequest;
4 BOOL bRet;CString strResponse;
5
6 hInternet = InternetOpen("User-Agent",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
7 if(!hInternet)
8 goto Ret0;
9
10 hConnect = InternetConnect(hInternet,lpHostName,sPort,NULL,"HTTP/1.1",INTERNET_SERVICE_HTTP,0,0);
11 if(!hConnect)
12 goto Ret0;
13
14 hRequest = HttpOpenRequest(hConnect,lpMethod,lpUrl,"HTTP/1.1",NULL,NULL,INTERNET_FLAG_RELOAD,0);
15 if(!hRequest)
16 goto Ret0;
17
18
19
20 bRet = HttpAddRequestHeaders(hRequest,"Content-Type: application/x-www-form-urlencoded", -1,HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD);
21 if(!bRet)
22 goto Ret0;
23
24 bRet = HttpSendRequest(hRequest,NULL,0,lpPostData,nPostDataLen);
25
26 if(!bRet)
27 {
28 goto Ret0;
29 }
30
31 // 读取返回数据
32 while(TRUE)
33 {
34 char cReadBuffer[4096];
35 unsigned long lNumberOfBytesRead;
36 bRet = InternetReadFile(hRequest,cReadBuffer,sizeof(cReadBuffer) - 1,&lNumberOfBytesRead);
37 if(!bRet || !lNumberOfBytesRead)
38 break;
39 cReadBuffer[lNumberOfBytesRead] = 0;
40 strResponse = strResponse + cReadBuffer;
41 }
42
43Ret0:
44 if(hRequest)
45 InternetCloseHandle(hRequest);
46 if(hConnect)
47 InternetCloseHandle(hConnect);
48 if(hInternet)
49 InternetCloseHandle(hInternet);
50
51 return strResponse;
52}
第二部分: 登录
输入帐号和密码, 可以用HttpWatch发现登录的网址和POST的数据
在这个可以发现登录所需要的信息, 分别为:
网址: www.kaixin001.com, 子网址: login/login.php
post数据为: email, password, url
动作为: "POST"
注意事后检测content内容, 可以根据其内容判断登录是否成功.
第三步: 查询车子的信息和好友信息
点击争车位的链接, 可以用HttpWatch发现GET得到的数据
在这个可以发现登录所需要的信息, 分别为:
网址: www.kaixin001.com, 子网址: !parking/index.php
动作为: "GET"
然后查看Content里面的内容, 可以发现很重要的数据:
可以看到var v_userdata = {....这样的语句,其后的内容就是你所有车子的相关信息. 后面还有var v_frienddata, 则是你的好友信息
用JSONViewer来分析这两段数据, 得到的结果如下:
你的车位信息:
你的好友信息:
从上面的图可以看出, 我一共有五辆车,像其中的carid, car_name, park_profit都是很重要的字段. 其中car_name字段后面是一系列UNICODE的十六进制字符串, 需要转换成多字节变量. 如何转换可以google.
好友信息里比较重要的字段有uid, real_name, full, scenemoney等等
我的程序分析了这些数据,并填入两个控件里, 效果如下
第四布: 自动停车
找到一个空的停车位停一部车子, 可以用HttpWatch发现POST的数据
在这个可以发现停车所需要的信息, 分别为:
网址: www.kaixin001.com, 子网址:!parking/!park.php
post数据为: -,acc,carid,first_fee_parking,neighbor, park_uid....
动作为: "POST"
其中POST的数据值可以在上面分析的好友以及车子JSON数据中得到.
至于如何得到空车位, 只需要点击其中有空车位的好友, 用HttpWatch分析返回的数据就可以了, 原理和上面的一样.
开心网争车位外挂的原理和白社会农场差不多, 只是具体POST的数据不同.