佣金中国's Archiver

cashsoldier 发表于 2004-7-18 16:41

看到有人贴出我以前写的做EMU的教程

好惭愧,现在看看,已经是很过时的东西了,不过看到大家好象比较感兴趣,在这里我将以前写过的东西贴出来给大家参考一下

cashsoldier 发表于 2004-7-18 16:45

《模拟器编程》-(针对IE控件WebBrowser编程-自动登录操作)
利用Delphi的Olevariant类型

单个frames的输入

var
  o : Olevariant;
begin
  o := WebBrowser.OleObject.document.all.item('LoginUserID',0);   //找到登录用户名的输入框
  o.value := 'TEST';
  o := WebBrowser.oleobject.document.all.item('LoginPassword',0); //找到登录密码的输入框
  o.value := 'TEST'
  WebBrowser.oleobject.document.Forms.Item(0, 0).submit;          //第一个表单提交

{

  o :=WebBrowser.oleobject.document.all.item('Login',0);          //或者用指定表单名称提交
  o.Click;  //点击操作,对其它对象也可同样操作
}
end;


 

多个frames的输入,FrameIndex为Frame的序号

 

var
  o : Olevariant;
begin

//找到登录用户名的输入框
  o := WebBrowser.oleobject.document.documentelement.document.frames.item(FrameIndex).document.all.item('LoginUserID',0);   
  o.value := 'TEST';

//找到登录密码的输入框
  o := WebBrowser.oleobject.document.documentelement.document.frames.item(FramIndex).document.all.item('LoginPassword',0);
  o.value := 'TEST'

//第一个表单提交
  WebBrowser.oleobject.document.documentelement.document.frames.item(FramIndex).document.Forms.Item(0, 0).submit;         

{

//或者用指定表单名称提交

  o :=WebBrowser.oleobject.document.documentelement.document.frames.item(FramIndex)..document.all.item('Login',0);         
  o.Click;   //点击操作,对其它对象也可同样操作
}
end;

cashsoldier 发表于 2004-7-18 16:46

模拟器编程》-(针对IE控件WebBrowser编程-找出所有LINK对象对应的Href)
在模拟器编程中,我们常要找出所有要操作的LINK对象。如果是我们需要的,就对它进行操作。在一个网页中作为判断的依据或其它用途

单个frames的LINK对象

var
   Count:Integer;  

  LinkList:TStringList;
begin

  LinkList:=TStringList.Create;

  Try

    for Count :=0 to WebBrowser.OleObject.Document.Links.Count -1 do

      LinkList.Add(WebBrowser.OleObject.Document.Links.Item(Count).Href);

    {以下对取得的LINK对象内容HREF做相应操作,如判断、Navigate等}

  finally

    LinkList.Free;

  end;

end;


 

多个frames的LINK对象,FrameIndex为Frame的序号

 

var
   Count:Integer;   

  LinkList:TStringList;
begin

  LinkList:=TStringList.Create;

  Try

    for Count =0 to WebBrowser.OleObject.Document.documentelement.document.frames.item(FrameIndex).Document.Links.Count -1 do

      LinkList.Add(WebBrowser.OleObject.Document.documentelement.document.frames.item(FrameIndex).Document.Links.Item(Count).Href);

    {以下对取得的LINK对象内容HREF做相应操作,如判断、Navigate等}

  finally

    LinkList.Free;

  end;

end;

cashsoldier 发表于 2004-7-18 16:46

《模拟器编程》-针对IE控件WebBrowser编程-TAGNAME属性和SOURCEINDEX属性
  如何取得HTML页面中某个位置的内容,如我的登录姓名,现在我取得的$数据,我还有多少SPIN可用等等;下面我们就来谈谈这个东西。

  HTML中每一个保留字都由开始和结束组成就像《和》一样,是成对出现的。在HTML语法中常见的如<HTML></HTML>,<TD></TD>等,我们不需自己去计算这些内容,因为使用了WebBrowser后,它已经帮我们做到了。

  同时,在WebBrowser中,有一个极有用的属性,即SourceIndex属性,它将所有上述成对出现的对象能够唯一在页面中标识(不信的话你试试看,查找TD属性的对象就会出一大堆),能使我们找出唯一我们所需的内容。

 

在单个frames中查找相同属性的对象

var
   Count:Integer;  

begin

  for Count :=0 to WebBrowser.OleObject.Document.All.Length -1 do  //当前页面中所有对象数量

  Begin

    if WebBrowser.OleObject.Document.All.Item(Count).TagName ='TD' then  //找出所有属性为TD的对象

    Begin

       ShowMessage(WebBrowser.OleObject.Document.All.Item(Count).InnerText);  //显示找到的对象的文本信息

       ShowMessage(WebBrowser.OleObject.Document.All.Item(Count).InnerHtml);  //显示找到的对象的HTML源码信息

    end;

  end;

end;

 

OK,现在找出相同属性的内容了,唯一值呢?

 

  if WebBrowser.OleObject.Document.All.Item(Count).SourceIndex = XXX then

  ...

 

当然,你需首先得到XXX的值,怎样得到它?难到你不知道?

 

  自己做个工具吧;如果你比我还懒,算了,我这里做了一个工具,它可取得当前所有对象的唯一ID,就是SourceIndex了,当然有其它几个功能,不过用来完成刚才所讲内容,足够了,如果你认为我做的不行,好了,你多加几个功能吧;记得做好后给我Email一份。

  下载地点?当然在我的源码荟萃里了;没有?哦,我还没上传呢,等等吧!
 

多个frames的LINK对象,FrameIndex为Frame的序号

 

  我就不想多写了,所有多个Frames和前面所讲操作一样,如果你连这个都颔会不了的话,我劝你还是不要学了,别人做好后你用这行了。

 

另外,取得HTML页面中有几个Frames就这样做

 

  WebBrowser.OleObject.Document.documentelement.document.frames.Length 

 

明白了吗?

 

现在我们做一个通用的函数,可按TagName和SourceIndex取得相应的文本内容:

// 取得TAGNAME指定的元素文本内容
function GetWebBrowserDocumentInnerText(Web:TWebBrowser;Const FramIndex,SourceIndex:Integer;Const TagName:String):String;
Var
  Count,Index :Integer;
  Tmp:String;
begin
  Result :='';

//如果FramIndex为-1的话,表示只有一个Frame,否则,就是想操作的Frame序号
  if FramIndex = -1 then
  Begin
    for Count := 0 to web.oleobject.document.All.Length -1 do
    Begin
      tmp :=web.oleobject.document.All.Item(Count).TagName;
      Index :=web.oleobject.document.All.Item(Count).SourceIndex;
      if (tmp = TagName) and (SourceIndex =Index) then
      Begin
        Result :=web.oleobject.document.All.Item(Count).InnerText;
        Exit;
      end;
    end;
    Exit;
  end;
  for Count := 0 to web.oleobject.document.documentelement.document.frames.item(FramIndex).document.All.Length -1 do
  Begin
    tmp :=web.oleobject.document.documentelement.document.frames.item(FramIndex).document.All.Item(Count).TagName;
    Index :=web.oleobject.document.documentelement.document.frames.item(FramIndex).document.All.Item(Count).SourceIndex;
    if (tmp = TagName) and (SourceIndex =Index) then
    Begin
      Result :=web.oleobject.document.documentelement.document.frames.item(FramIndex).document.All.Item(Count).InnerText;
      Exit;
    end;
  end;
end;

cashsoldier 发表于 2004-7-18 16:47

《作弊器编程》-WinAPI-Mouse控制
  作弊器主要利用程序完成人对计算机的某些操作,如Mouse、键盘等外设的操作,让其它程序认为是人在计算机旁操作一样。今天谈谈Mouse的模拟操作。这些内容就需要用到WinAPI中的函数了。

  WinAPI中对Mouse的操作函数有:

  1、移动Mouse位置:SetCursorPos

    SetCursorPos(
      X: Integer; {X coordinate of the cursor}
      Y: Integer {Y coordinate of the cursor}
    ): BOOL; {returns TRUE or FALSE}
    Description
      The SetCursorPos function relocates the mouse cursor to the location specified by the X and Y parameters, in screen     coordinates. If the cursor is confined to a rectangular region by calling the ClipCursor function, the system translates the coordinates to the appropriate coordinates within the rectangular region.
    Parameters
      X: Specifies the new x-coordinate for the cursor.
      Y: Specifies the new y-coordinate for the cursor.
    Return Value
      If the function succeeds, it returns TRUE; otherwise it returns FALSE. To get extended error information, call the     GetLastError function.

   2、取得Mouse位置:GetCursorPos

     GetCursorPos(

       var lpPoint: TPoint {receives coordinates of cursor}
      ): BOOL; {returns TRUE or FALSE}
     Description
       The GetCursorPos function retrieves the mouse cursor position relative to the screen.
     Parameters
       lpPoint: Points to TPoint structure which receives the current mouse cursor抯 position in screen coordinates. This   structure must be allocated by the caller.
     Return Value
If the function succeeds, it returns TRUE; otherwise it returns FALSE. To get extended error information, call the GetLastError function.

   3、模拟Mouse点击:Mouse_Event
     mouse_event(
       dwFlags: DWORD; {mouse activity codes}
       dx: DWORD; {horizontal location or change}
       dy: DWORD; {vertical location or change}
       dwData: DWORD; {wheel movement amount}
       dwExtraInfo: DWORD {application defined data}
     ); {this procedure does not return a value}
     Description
     The mouse_event function simulates mouse activity. The system generates mouse messages as if the mouse was actually moved or a mouse button was actually pressed.
     Parameters
       dwFlags: Specifies which kind of mouse activity to simulate.
       dx: Specifies the horizontal location or change in location. If the dwFlags parameter contains the MOUSEEVENTF_ABSOLUTE flag, this parameter specifies a location. Otherwise, this parameter specifies the amount of mickeys (a measurement of mouse distance) to move.
       dy: Specifies the vertical location or change in location. If the dwFlags parameter contains the MOUSEEVENTF_ABSOLUTE flag, this parameter specifies a location. Otherwise, this parameter specifies the amount of mickeys (a measurement of mouse distance) to move.
       dwData: Specifies the amount of wheel movement if the dwFlags parameter contains the MOUSEEVENTF_WHEEL flag. A positive value indicates wheel movement away from the user; a negative value indicates wheel movement toward the user. This value is in terms of WHEEL_DELTA, approximately 120 mickeys. If the dwFlags parameter does not contain the MOUSEEVENTF_WHEEL flag, dwData should be set to zero.
       dwExtraInfo: 32 bits of additional application defined data. To retrieve this data, call the GetMessageExtraInfo function.


 

下面的代码是我们的一个练习,将Mouse先移到屏幕0,0位置,然后移动至中间,并单击:

var

  Count:Integer;

Begin

  SetCursorPOS(0,0);        //称动Mouse到0,0;其实,用Mouse_Event也能移动操作

  for Count :=0 to 400 do   //屏幕大小为800*600

    SetCursorPOS(Count,0);  //Y为0

//以下为单击操作,双击怎么做?回去好好想想

  Mouse_Event(MOUSEEVENTF_LEFTDOWN ,400,0,0,0);  //在400,0处按下Mouse左键

//Mouse_Event(MOUSEEVENTF_RIGHTDOWN ,400,0,0,0);  //不用说,右键

  Mouse_Event(MOUSEEVENTF_LEFTUP ,400,0,0,0);  //在400,0处放开Mouse左键

//Mouse_Event(MOUSEEVENTF_RIGHTUP ,400,0,0,0);  //不用说,右键

 

end;

这不就是一个自动点击机吗?当然,不完全,但自动点击的操作不就完成了吗!就这么简单

cashsoldier 发表于 2004-7-18 16:47

作弊器编程》-WinAPI-键盘控制
 

  WinAPI中对键盘的操作函数只能用于Application自身,要想用自己的程序给其它程序窗体发送键码,需用到Hook(天,Hook可就复杂多了):而取得其它窗口输入的键码,就需用全局的Dll了(我晕,太多了)

  就里不再写代码了,在CashSoldier造钱战士 1.0 VIP源码的窗体控制中有全部源码(太多,这里写不了)un_SendKey.pas

  使用方法:

 

Const

  ControlKey = '^';
  AltKey = '@';
  ShiftKey = '~';
  KeyGroupOpen = '{';
  KeyGroupClose = '}';


//如当前窗口是IE窗口

Var

  Keys:String;

Begin

  Keys :='@D';     //按下 Alt+D,焦点为IE的地址输入框

  SendKeys(Keys);   //向当前窗口发送键码

  WaitForHook;      //等待结束

  Keys :='http://alin.51.net'+$13;  //输入内容并按回车

  SendKeys(Keys);   //向当前窗口发送键码

  WaitForHook;      //等待结束

end;

cashsoldier 发表于 2004-7-18 16:48

《作弊器编程》-WinAPI-窗口控制
 

      一般来讲,对于我们常用的窗口控制的功能有如下要求:

    1、得到当前运行中的所有窗口信息

    2、取得最前端的窗口信息

    3、取得想控制的窗口信息等等

    在WinAPI中针对窗口控制的函数很多,完成以上功能的一般用的就以下几个函数:

    EnumWindows     取得当前系统中所有窗口句柄

    FindWindow      查找窗口

    SetWindowPos    设置窗口位置

    GetWindowRect   取得窗口大小

    ...

    作弊器的目的在于让被蒙弊的程序认为我们的程序操作是由人在控制。同时,作弊器需像人一样取得针对的窗口信息,对它进行相应的操作。以上几个函数能够基本完成我们现在现要的操作。在CashSoldier造钱战士中的窗口控制及Spedia模拟器中,大量使用了以上函数;当然,所有函数每一个人使用都会采用不同的方法,如ShowWindow,MoveWindow可以用SetWindowPos来完成相应的功能。

    现在我们利用以上函数做一个自动点击机,它能找出广告窗口,同时每隔十秒点击相应的广告位置;(我们假设该广告条要点击的窗口ClassName为TBanner,广告条程序名称为Banner.EXE。广告条标题为SpediaBanner)。

 

 

function EnumWindowsProc(AHWnd: HWnd;LPARAM: lParam): boolean; stdcall;
var
  WndCaption: array[0..254] of char;             //窗口标题
  WndClassName: array[0..254] of char;           //窗口类名

  ARect:TRect;                                   //窗口坐标
begin
  if IsWindowVisible(AHwnd) then                 //是否可见窗口(我们要的广告窗口难道是不可见的吗?)
  Begin
    GetWindowText(AHWnd, @WndCaption, 254);      //取得窗口标题
    GetClassName(AHWnd, @WndClassName, 254);     //取得窗口类名

    if (StrPas(WndCaption) = 'SpediaBanner') and //是否运行的Banner.exe

       (StrPas(WndClassName = 'TBanner') then    //是否运行的窗口类为TBanner

    Begin                                        //是我们想要的窗口

      GetWindowRect(AHwnd,ARect);                //取得广告窗口的坐标位置(为什么要取出来呢?)

      ShowWindow(AHwnd,SW_SHOWNORMAL);           //按正常方式显示广告窗口(如果被隐藏了,不就对了吗)

//设置窗口位置及大小;实际上并没有改变大小和位置,因为用ShowWindow时,如果窗口被最小化时,就不起作用了(现在知道为何要先取坐标位置了吧)
      SetWindowPos(AHwnd,HWND_TOP,AHwnd.Left,AHwnd.Top,AHwnd.Right,AHwnd.Bottom,SWP_SHOWWINDOW);
      SetCursorPos(AHwnd.Top+10,AHwnd.Left+30);  //移动鼠标到广告条上(我随便加的位置,根据实际位置设置)

//单击广告条
      Mouse_Event(MOUSEEVENTF_LEFTDOWN ,AHwnd.Top+10,AHwnd.Left+30,0,0);
      Mouse_Event(MOUSEEVENTF_LEFTUP ,AHwnd.Top+10,AHwnd.Left+30,0,0);   

      Result :=False;                            //没必要再作枚举吧

      Exit;

    end;
  end;
  Result := True;            //返回TRUE表示继续下一个,否则,不再枚举
end;

 

procedure TForm.tm_AutoTimer(Sender: TObject);   //时钟控件,每隔一秒触发一次
begin
  tm_Auto.Enabled :=False;

  tm_Auto.Tag :=tm_Auto.Tag +1                   //每秒加一

  if tm_Auto.Tag >= 10 then                      //十秒触发一次

  Begin

    tm_Auto.Tag :=0;                             //恢复计数
    EnumWindows(@EnumWindowsProc, 0);            //取当前所有窗口

  end;
  tm_Auto.Enabled :=True;
end;


end;

 

   好了,还有什么问题?看看CashSoldier造钱战士 1.0 VIP 源码吧。

cashsoldier 发表于 2004-7-18 16:49

《作弊器编程》-截包实战
    做EMU最重要的是要知道EMU对象的协议请求内容,因为在INTERNET上最常用的协议是TCP/IP协议组,而TCP协议

是最常用的,在其上构建了HTTP,FTP等上层协议,只要我们得到其交互的IP包,就可以分析和做出自己的EMU来蒙骗对方。
    得到IP包的方式有很多,最底层的是用截包工具如IRIS之类的,这里不讲如何使用工具,因为它们都有说明(看不懂?

天,我的E文比你还差,更看不懂了),因为大多冲浪软件都是利用HTTP协议(如SPEDIA,ABOUT等),这里我就讲讲怎样

利用代理服务来苏获HTTP内容。大多冲浪程序通过HTTP来完成,是其简单的方式,同时大多支持代理。我们可利用这个方式,
自己做个代理,不就可以得到所有的来往信息了吗?


以今天我做www,cashspace.com的广告条为例:


1、运行它的广告条,按正常情况使用,一小时60-80点增加(不过我没用,你用不用无所谓了)。
2、运行自己做的代理服务器程序(不会做的话在我主页上下载,不过我还没上传,过两天吧,上次传了一次没传完)
3、将IE的代理服务器设置为本机IP和PORT(不可能这都不知道吧,如果不知道,别看了)
4、运行冲浪,可以看到我的代理服务器监视窗口有内容了如下:

GET [url]http://www.cashspace.com/test/l.asp?u=cashsoldier&p=xxxxx&s=1024[/url] HTTP/1.0
Accept: , , 棣?

cashsoldier 发表于 2004-7-18 16:50

以下是代理服务器源代码,没整理,很简单可很实用

 

unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, StdCtrls, ExtCtrls, ScktComp;
type
  session_record=record
  Used:boolean;
  SS_Handle:integer;
  CSocket:Tclientsocket;
  Lookingup:boolean;
  LookupTime:integer;
  Request:boolean;
  request_str:string;
  client_connected:boolean;
  remote_connected:boolean;
end;


type
TForm1 = class(TForm)
  ServerSocket1: TServerSocket;
  ClientSocket1: TClientSocket;
  Timer1: TTimer;
  Label1: TLabel;
  Edit1: TEdit;
  Memo1: TMemo;
  PopupMenu1: TPopupMenu;
  menuopen: TMenuItem;
  menuclose: TMenuItem;
  N1: TMenuItem;
  N2: TMenuItem;
  N3: TMenuItem;
  N4: TMenuItem;
  btopen: TButton;
  btclose: TButton;
  Button3: TButton;
  bthide: TButton;
  menuhide: TMenuItem;
  Button1: TButton;
  Button2: TButton;
  procedure AppException(sender:TObject;e:Exception);
  procedure menuopenClick(Sender: TObject);
  procedure menucloseClick(Sender: TObject);
  procedure menuexit(Sender: TObject);
  procedure FormCreate(Sender: TObject);
  procedure FormClose(Sender: TObject; var Action: TCloseAction);
  procedure ServerSocket1Listen(Sender: TObject;
  Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure Timer1Timer(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure RxTrayIcon1Click(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
procedure bthideClick(Sender: TObject);
procedure menuhideClick(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure Memo1Change(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
Server_Enabled:boolean;
session:array of session_record;
sessions:integer;
LookupTimeOut:integer;
InvalidRequests:integer;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.AppException (sender:TObject;E:Exception);
begin
//
end;


procedure TForm1.menuopenClick(Sender: TObject);
begin
serversocket1.active:=true;
end;

procedure TForm1.menucloseClick(Sender: TObject);
begin
serversocket1.Active :=false;
server_enabled:=false;
menuopen.Enabled :=true;
btopen.Enabled :=true;
menuclose.Enabled :=false;
btclose.Enabled :=false;
end;

procedure TForm1.menuexit(Sender: TObject);
begin
application.Terminate ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
server_enabled:=false;
sessions:=0;
invalidrequests:=0;
LookupTimeOut:=60000;
timer1.Enabled :=true;
menuopen.Enabled :=false;
btopen.Enabled :=false;
menuclose.Enabled :=true;
btclose.Enabled :=true;
serversocket1.Port :=988;
serversocket1.Active :=true;
//application.OnActionExecute :=appexception;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
timer1.Enabled :=false;
if server_enabled then serversocket1.Active:=false;
end;

procedure TForm1.ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket);
begin
server_enabled:=true;
menuopen.Enabled :=false;
btopen.Enabled :=false;
menuclose.Enabled :=true;
btclose.Enabled :=true;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var i,j:integer;
begin
j:=-1;
for i:=1 to sessions do
if not session[i-1].Used and not session[i-1].CSocket.active then
begin
j:=i-1;
session[j].Used :=true;
break;
end
else
if not session[i-1].Used and session[i-1].CSocket.active then session[j].CSocket .active:=false ;
if j=-1 then
begin
j:=sessions;
inc(sessions);
setlength(session,sessions);
session[j].Used :=true;
session[j].CSocket :=Tclientsocket.Create (nil);
session[j].CSocket.onconnect:=clientsocket1connect;
session[j].CSocket.ondisconnect:=clientsocket1disconnect;
session[j].CSocket.onerror:=clientsocket1error;
session[j].CSocket.onread:=clientsocket1read;
session[j].CSocket .onwrite:=clientsocket1write;
session[j].CSocket .onlookup:=clientsocket1lookup;
session[j].CSocket .onconnecting:=clientsocket1connecting;
session[j].lookingup:=false;
end;
session[j].SS_Handle :=socket.SocketHandle ;
session[j].Request :=false;
session[j].client_connected :=true;
session[j].remote_connected :=false;
edit1.Text :=inttostr(sessions);
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var i,j,k:integer;
begin
for i:=1 to sessions do
if (session[i-1].SS_Handle =socket.sockethandle) and session[i-1].Used then
begin
session[i-1].client_connected :=false;
if session[i-1].remote_connected then
session[i-1].CSocket.active:=false
else
session[i-1].Used :=false;
break;
end;
j:=sessions;
k:=0;
for i:=1 to j do
begin
if session[j-i].Used then break;
inc(k);
end;
if k>0 then
begin
sessions:=sessions-k;
setlength(session,sessions);
end;
edit1.Text :=inttostr(sessions);
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
var i:integer;
begin
for i:=1 to sessions do
if (session[i-1].Csocket.socket.sockethandle=socket.SocketHandle) and session[i-1].Used then
begin
session[i-1].CSocket.tag:=socket.sockethandle;
session[i-1].remote_connected :=true;
session[i-1].Lookingup :=false;
break;
end;
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j,k:integer;
begin
for i:=1 to sessions do
if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].Used then
begin
session[i-1].remote_connected :=false;
if not session[i-1].client_connected then
session[i-1].Used :=false
else
for k:=1 to serversocket1.Socket.ActiveConnections do
if (serversocket1.Socket.Connections [k-1].SocketHandle =session[i-1].SS_Handle ) and session[i-1].Used then
begin
serversocket1.Socket.Connections[k-1].Close ;
break;
end;
break;
end;
j:=sessions;
k:=0;
for i:=1 to j do
begin
if session[j-i].Used then
break;
inc(k);
end;
if k>0 then
begin
sessions:=sessions-k;
setlength(session,sessions);
end;
edit1.text:=inttostr(sessions);
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
var
i,j,k:integer;
begin
for i:=1 to sessions do
if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].Used then
begin
session[i-1].remote_connected :=false;
socket.Close ;
if not session[i-1].client_connected then
session[i-1].Used :=false
else
for k:=1 to serversocket1.Socket.ActiveConnections do
if (serversocket1.Socket.Connections[k-1].SocketHandle =session[i-1].SS_Handle ) and session[i-1].Used then
begin
serversocket1.Socket.Connections [k-1].Close;
break;
end;
break;
end;
j:=sessions;
k:=0;
for i:=1 to j do
begin
if session[j-i].Used then
break;
inc(k);
end;
errorcode:=0;
if k>0 then
begin
sessions:=sessions-k;
setlength(session,sessions);
end;
edit1.Text :=inttostr(sessions);
end;

procedure TForm1.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
var i:integer;
begin
for i:=1 to sessions do
if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].Used then
begin
if session[i-1].Request then
begin
socket.SendText(session[i-1].request_str);
session[i-1].Request :=false;

end;
break;
end;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j,rec_bytes:integer;
rec_buffer:array[0..2047] of char;
begin
for i:=1 to sessions do
if (session[i-1].CSocket.tag=socket.SocketHandle ) and session[i-1].used then
begin
rec_bytes:=socket.ReceiveBuf (rec_buffer,2048);
for j:=1 to serversocket1.Socket.ActiveConnections do
if serversocket1.Socket.Connections [j-1].SocketHandle =session[i-1].SS_Handle then
begin
serversocket1.Socket.Connections [j-1].SendBuf (rec_buffer,rec_bytes);
Memo1.Lines.Add(rec_buffer);
break;
end;
break;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
i,j:integer;
begin
for i:=1 to sessions do
if session[i-1].Used and session[i-1].Lookingup then
begin
inc(session[i-1].LookupTime );
if session[i-1].LookupTime >lookuptimeout then
begin
session[i-1].Lookingup :=false;
session[i-1].CSocket.active:=false;
for j:=1 to serversocket1.socket.activeconnections do
if serversocket1.Socket.Connections[j-1].sockethandle=session[i-1].ss_handle then
begin
serversocket1.socket.connections[j-1].close;
break;
end;
end;
end;

end;

cashsoldier 发表于 2004-7-18 16:50

procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
var i,j,k:integer;
begin
for i:=1 to sessions do
if (session[i-1].SS_Handle=socket.sockethandle) and session[i-1].Used then
begin
session[i-1].client_connected:=false;
if session[i-1].remote_connected then
session[i-1].CSocket.active:=false
else
session[i-1].Used:=false;
break;
end;
j:=sessions;
k:=0;
for i:=1 to j do
begin
if session[j-i].Used then
break;
inc(k);
end;
if k>0 then
begin
sessions:=sessions-k;
setlength(session,sessions);
end;
edit1.text:=inttostr(sessions);
errorcode:=0;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
tmp,line,host:string;
i,j,port:integer;
begin
for i:=1 to sessions do
if session[i-1].Used and (session[i-1].SS_Handle=socket.sockethandle) then
begin
session[i-1].request_str:=socket.receivetext;
tmp:=session[i-1].request_str;
memo1.lines.add(tmp);
j:=pos(char(13)+char(10),tmp);
while j>0 do begin
line:=copy(tmp,1,j-1);
delete(tmp,1,j+1);
j:=pos('Host',line);
if j>0 then
begin
delete(line,1,j+5);
j:=pos(':',line);
if j>0 then
begin
host:=copy(line,1,j-1);
delete(line,1,j-1);
try
port:=strtoint(line);
except
port:=80
end;
end
else
begin
host:=trim(line);
port:=80;
end;
if not session[i-1].remote_connected then
begin
session[i-1].request:=true;
session[i-1].CSocket.host:=host;
session[i-1].CSocket.port:=port;
session[i-1].CSocket.active:=true;
session[i-1].lookingup:=true;
session[i-1].lookuptime:=0;
end
else
session[i-1].Csocket.socket.sendtext(session[i-1].request_str);
break;
end;
j:=pos(char(13)+char(10),tmp);
end;
break;
end;
end;

procedure TForm1.ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
begin
//
end;

procedure TForm1.bthideClick(Sender: TObject);
begin
end;

procedure TForm1.menuhideClick(Sender: TObject);
begin
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
end;

procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
//
end;

procedure TForm1.Memo1Change(Sender: TObject);
begin
if Memo1.Lines.Count > 1000 then
Memo1.Lines.Delete(0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Lines.Clear;
end;

end.

cashsoldier 发表于 2004-7-18 16:51

《模拟器编程》-编制模拟器要掌握的技术(一)
   我们在刚开始编制模拟器时,,常常不知从那里下手,其实,编制模拟器需要掌握一定的常识,否则,得到的数据会让我

们不知所措。

    因为模拟器是模拟IE或广告条的操作,给网战发送相应的基于HTTP协议的内容,因此,需要掌握HTTP超文本协议的内容及

要点,才能更好地为上层应用服务。这里是HTTP协议即RFC1945的详细说明,其它关于WWW的说明请参阅www.rfc.net,我们这

里仅对HTTP协议作简单介绍。

   与一个HTTP服务器通信:

   HTTP是一个非常简单的。客户在先打开一个与某一HTTP服务器的连接,其缺省端口为80.它接着发一个请求行,一此可选的

请求标题和一个空行(注意,最后要发一个空行,我刚在做的时候,忘了发一个空行,结果没有返回信息)。HTTP服务器发送

一个响应行,一些响应标题,一个空白行(注,又一个空行)和一个文档,接着关闭连接。

   客户一般发送的请求行使用GET、HEAD、或POST,然后发送零信或更多HTTP请求标题和空白行,使用POST时,客户可以在

空白行后发送额外的数据。GET也可行发更新数据,不过是在请求行里。

  例子:(还是以www.cashspace.com 为例)

发送信息:

   GET [url]http://www.cashspace.com/test/l.asp?u=cashsoldier&p=xxxxx&up=0[/url] HTTP/1.0
   Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
   Accept-Language: zh-cn
   Accept-Encoding: gzip, deflate
   User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
   Host: [url]www.cashspace.com[/url]
   Proxy-Connection: Keep-Alive
   Cookie: enter=468; ASPSESSIONIDGQQQGLWK=HLEKOOLCEACODCCKDHDGPEEI     

 

返回信息:

   HTTP/1.1 200 OK
   Server: Microsoft-IIS/5.0
   Date: Wed, 16 May 2001 07:31:47 GMT
   Connection: Keep-Alive
   Content-Length: 132
   Content-Type: text/html
   Cache-control: private


   yes<br>
   t1=35<br>
   t2=34<br>
   t3 =15<br>
   t4=0<br>   

 

  成功返回,返回信息为 HTTP/1.1 XXX YYYYY

  其中,XXX为200表示成功,YYYY为描述内容,下面的内容不用我多讲,很清楚的表示了。

  发送的信息怎样发送,当然是SOCKET了,在WINDOWS或LINUX或其它操作系统中,它们都是一样的。

  简单地讲,建一个SOCKET联接,端口为80,联接,联接正常后发送上述信息,接收,OK;讲的很简单了,可实际也就这么简单,我在这里用

DELPHI的TClientSocket,完成,VB、VC也有相应的SOCKET控件,下次我们再谈如何直接用WINDOWS的WINSOCK API来建立SOCKET。

  接收到了HTTP返回信息,读取返回文本,就要分析它的内容了,详细内容我这里就不讲了(我讲完就可重写一遍IE了,同时要掌握另一种内容,

即HTML语法,呵呵,下次再说)。

  再来一次:

  GET [url]http://www.cashspace.com/test/banx.asp?banx=468&u=cashsoldier&x=1024C86[/url] HTTP/1.0
  Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel,   application/msword, */*
  Accept-Language: zh-cn
  Accept-Encoding: gzip, deflate
  User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
  Host: [url]www.cashspace.com[/url]
  Proxy-Connection: Keep-Alive
  Cookie: enter=468; eon_contest=thereisnospoon; ASPSESSIONIDGQQQGLWK=KPILOOLCIJEJLLNCFOJDFFFB; eon_contest=thereisnospoon

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Thu, 17 May 2001 04:03:52 GMT
Connection: Keep-Alive
Content-Length: 826
Content-Type: text/html
Cache-control: private


<body bgcolor="#C0C0C0" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" scroll=no>
<!-- Begin AdRotator.com's AdButler Code -->
<IFRAME SRC="http://imgserv.adbutler.com/adserve/;ID=101973;size=468x60;setID=17310;aff=on;loc=0;type=iframe" WIDTH=468 HEIGHT=60 FRAMEBORDER=0 BORDER=0 MARGINWIDTH=0 MARGINHEIGHT=0 VSPACE=0 HSPACE=0 SCROLLING=NO>
<SCRIPT SRC="http://imgserv.adbutler.com/adserve/;ID=101973;size=468x60;setID=17310;aff=on;loc=0;type=js" LANGUAGE="JAVASCRIPT">
</SCRIPT>
<NOSCRIPT>
"http://imgserv.adbutler.com/go2/;ID=101973;size=468x60;setID=17310;aff=on;loc=0">
<img src="http://imgserv.adbutler.com/adserve/;ID=101973;size=468x60;setID=17310;aff=on;loc=0;type=img" border="0" height="60" width="468"></a>
</NOSCRIPT>
</IFRAME>
<!-- End AdRotator.com's AdButler Code -->

这次不好了,除了HTTP头外,文本内容也有了,是什么呢?会HTML的一看就明白了,呵呵,不用我讲太多吧,整个内容讲的是要求浏览器

中加一个FRAM,支持JAVASCRIPT的如何,不支持又如何(我头痛)。

  好了它实际还是没什么内容,如果你要显示它的广告的话,那就再发SRC=后面的内容吧,不用我多讲,还是GET,不过对我们的作模拟器

的家伙们来讲,速度是$$$$,定不会要它的了(图片不要,如果要点击率的话,可能就要了,否则,一通通没完,你怎知道要的URL来了没有;

像8848,它属于二次点击,即广告代码返回SRC=XXX,IE取出SRC=后的内容[当然是用GET],这时返回才是真正的刷新和要点击的URL)

  你问上面的GET内容是怎么来的???啉呆,我的上一篇讲座你没看?快去看看,《作弊器编程》截包实战,一年级都没读完,现就上初二

了,比我还聪明(^_^)

   这样一步又一步,省略N段内容........................我又没精力写了

   告诉你们吧,看了上面的内容,能作什么样的模拟器呢?

   CashSoldier !!!!!给我力量....!!!!!!!

   !!!!!!!!!!!《超级广告条自动点击工具 Version XXXX,XXX》!!!!!!!!!!!!!

   现在大多数广告条(主页上的)都使用二次点击方式,其步骤为:

   1.访问你的网页(如我的alin.51.net/right.htm)

   2.我主页上有<script src="http://ads.my8848.net/show.asp?userid=cashsoldier">这样的内容,从HTML语法来讲(我不知道是否HTML语法),

IE会GET [url]http://ads.my8848.net/show.asp?userid=cashsoldier[/url] HTTP/1.0 没错吧

  3.返回一大堆我看不懂的东西,其中有一句 Src=http://ads.my8848.net/show8848.asp?userid=cashsoldier,呵呵,这就是二次内容,

(二次点击就这样的吗?有谁知道告诉我)

  4.当然,IE 会再次GET [url]http://ads.my8848.net/show8848.asp?userid=cashsoldier[/url] HTTP/1.0,另外其它的图片就没必要下载了。返回

又一堆,其中有 herf=http://ads.my8848.net/click.asp?userid=cashsoldier&AID=8&BID=66.&CID=67.8.26.6.20.6.92.83.85.65.3.1.4.13.12.64.&DID=757243 呵呆,这不是要我点击的内容吗?#%%#%$#$#$@$#%$@#$@$%$

  5.还有什么要讲的,我 GET [url]http://ads.my8848.net/click.asp?userid=Cashsoldier&AID=8&BID=66.&CID=67.8.26.6.20.6.92.83.85.65.3.1.4.13.12.64.&DID=757243[/url] HTTP/1.0,查帐,我的帐号上多了一次点击了,呵呵,刷新?在第4步就完

成了。当然,算算点击率,多刷新,少点几次啦。

 

  不过,这么简单就完成了,照你说的,可我的刷新点击不对呀,没有加点呢!!!!!

  什么什么???、????

 

  我明白了,这还有个问题,8848可知道你从那来的,因此,有个Referer标题,看好了

 

  GET [url]http://ads.my8848.net/show.asp?userid=cashsoldier[/url] HTTP/1.0
  Accept:  */*
  Accept-Language: zh-cn
  Accept-Encoding: gzip, deflate
  User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
  Host: ads.my8848.net

  Referer:alin.51.net/right.htm      //这里一次要写你的广告条码所在位置
  Proxy-Connection: Keep-Alive
  Cookie:


 

  明白了吗????不明白,拉倒吧你.............

  今天到这里吧,下次再谈了

cashsoldier 发表于 2004-7-18 16:52

《作弊器编程》实战系列(二)利用TNMHTTP实战Fun-lotto

*********************************************************************************

   各位好,呵呵,客套话先说一句了。

   今天我们开始实战中的第二步,利用TNMHTTP控件完成一个Fun-Lotto的模拟器。

   当然,在以往的教程中,并没有过多谈论一些技术上的问题,仅对实现的方法和理论进行了一些论述,在此,

特别郑重宣布,本模拟教程在未指明的情况下,编程工具为DELPHI,针对的对象是有一定编程能力,对DELPHI

有一定了解的人;因此,为节省篇幅,针对DELPHI的一些技术特性在此不用多讲,如果你不懂,请参考相关书籍,

我这里不教DELPHI(想学的话多交点学费也可以,MM收半价优惠,PLMM可全免^_^)

   好了,这里因为要用到TNMHTTP控件,先对TNMHTTP控件的方法和属性做一简单介绍:

   我们这里用到的TNMHTTP属性和方法有:

   HOST:主机名,要联接的对象

   PROXY:代理服务器IP地址,常用到的  PROXYPORT:端口,因不一定是80或8080

   HEADER:得到分解的HTTP头信息,用外还是很大,严格的网战对它要尔很不错的

   BODY:网页正文,返回的具体内容

   HEADERINFO:发出去时的HTTP头信息,极为重要

   GET方法:在本文中主要使用此方法与网战交互,我不太会用POST方法,但POST能做的GET也能做到,当然,

更复杂的提交方法还是用POST,不过在本文中GET方法足够用了,所以,本文不讲其它方法,想知道的话请参考其

它相关书籍;问我的话可是先要收费的#%$$%$#%#%%(我打,你这个财迷.....!!!!)

   好了,了解了TNMHTTP控件的方法后,我们开始往下讲。

   TNMHTTP控件是DELPHI自带的第三方控件,它主要用于在程序中与WWW网站进行交互,取得网页内容等;我们取

得网页的原始内容后,可根据内容进行相应处理,不难做出一个自己的IE浏览器。当然,需要对WWW有深入的了解

才行。由于它得到的是网页的原始内容,因此你可以很容易地控制网上的流量(很多图片呀,不重要的东西你可以

不下载),这样的做法比用TWEBBROWSER当然速度快多了,当然,还有其它方法能更深入控制网络,我们的教程也

是如此,从TWEBBROWSER->TNMHTTP->TCLINETSOCK->WINSOCK这样的教学方式来的,层次越来越高,控制的层次

越来越低,这样的教学很不错吧,想当初%…¥%¥%…%¥%…(大量西红柿、臭鸡蛋呼啸而来...)。

   废话少说,我们先到FUN-LOTTO去看一下:

   FUN-LOTTO是一个MAKE CASH网站(废话),它的方法是:选取七个数字,提交,返回另七个数字,如果其中有

相同的数字,呵呵,三个以上就中奖了,奖金多少?我这里就不知道了,不过,如果七个数字全对,呵呵,记得

分我一点$,不要多了,一、两百万够了(我打,哟哟哟哟哟,轻点)。就这样,如有不明白的地方,到它的网

站去看看就明白了。

  好了,拿出我们的法宝来。太上老君急急如律令......!!!!!CashSoldier......给我力量吧!!!!

  用上次我们的代理程序,准备就绪(什么,代理程序没带来!!!!去去去,到我主页上去取来,方法请见

《作弊器编程》实战系列(一)截包实战)

  清除所有不需要的垃圾,先到FUN-LOTTO的主页上去,先要LOGIN(这都不懂吗?当然要从最前面做起呀!!什么?

你没申请帐号!!!!!我倒....)。

  第一步,LOGIN,好了,代理中出现这样的内容,大家看好(对了,到主页上去后截到的内容没什么意思,可以不管

了!???你怎知没用????我说了没用就没用!!!!!你再不住口,我不讲了!!!):

  先进入"WIN $250,000 Instanly"这一关(什么这一关,PLAY GAME?),有了LOGIN的内容,当然,填好用户名,

密码,再清除垃圾(不然一大堆看死你)。OK,LOGIN。从代理中得到的内容:

POST [url]http://www.fun-lotto.com/InstantWin/id.php[/url] HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: [url]http://www.fun-lotto.com/InstantWin/instant.php[/url]
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: [url]www.fun-lotto.com[/url]
Content-Length: 71
Proxy-Connection: Keep-Alive
Pragma: no-cache

__COMMAND=login&location=instant&username=cashsoldier&password=xxxxx

................省略若干内容,骗稿费可以加上^_^

不用依次解释,我们可看到HTTP头的内容很清楚,要注意的是这几个:

POST [url]http://www.fun-lotto.com/InstantWin/id.php[/url] HTTP/1.0
Referer: [url]http://www.fun-lotto.com/InstantWin/instant.php[/url]
Host: [url]www.fun-lotto.com[/url]


__COMMAND=login&location=instant&username=cashsoldier&password=xxxxx


POST不用我多说了,提交内容 ,REFERER表示我现在正在[url]http://www.fun-lotto.com/InstantWin/instant.php[/url]


填的表,向网站提交,HOST就更不用说了,下面的内容是什么,我也不知道(不知道你干什么来了?管

你什么事?)。从字面意思猜,命令是LOGIN,当前在INSTANT,用户名,密码;这么笨,不就行了。

  写一个程序,完成:

function Tfrm_main.LoginWebHost(const Username,PassWord:String;Var LocationUrl:String):Boolean;
Var
Str:String;
begin
Result :=False;
//__COMMAND=login&location=instant&username=cashsoldier&password=xxxx
NMHTTP.Host :='www.fun-lotto.com';
NMHTTP.HeaderInfo.Referer := 'http://www.fun-lotto.com/InstantWin/instant.php';   //呵呵,我也在这里了,骗它的嘛
NMHTTP.HeaderInfo.Cookie :='Test=Pass; Seen=True';   //这是什么,
NMHTTP.Get(Format('http://www.fun-lotto.com/InstantWin/id.php?login&location=instant&username=%s&password=%s',[Username,Password]));
NMHTTP.HeaderInfo.Cookie :=Format('usernameID=%s; passwordID=%s; Test=Pass; Seen=True',[UserName,PassWord]);
Str :=NMHTTP.Body;
if POS('Please enter the the right username and password',Str) > 0 then
Begin
Result :=False;
Exit; //用户名或口令错
end;
if POS('It seems that you have reached the maximum number of tickets for this game for today',Str) >0 then
Begin
Result :=False;
Exit; //最大值
end;
LocationUrl :=GetClickUrl(NMHTTP.Body);
if LocationUrl <> '' then
Result :=True;
end;


   有人问了,呵呵,这样就行了?当然,你试试,看看返回的信息:

HTTP/1.1 200 OK
Date: Tue, 22 May 2001 03:55:21 GMT
Server: Apache/1.3.12 Cobalt (Unix) PHP/4.0.4pl1 mod_ssl/2.6.4 OpenSSL/0.9.5a mod_auth_pam/1.0a FrontPage/4.0.4.3 mod_perl/1.24
X-Powered-By: PHP/4.0.4pl1
Set-Cookie: usernameID=deleted; expires=Mon, 22-May-00 03:55:20 GMT
Set-Cookie: passwordID=deleted; expires=Mon, 22-May-00 03:55:20 GMT
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified: Tue, 22 May 2001 03:55:21 GMT
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: usernameID=cashsoldier
Set-Cookie: passwordID=xxxxxx
Connection: close
Content-Type: text/html

<script language="Javascript">document.location = "http://www.fun-lotto.com/InstantWin/instant.php?ts=990503721";</script>
A
   内容不用我多讲,要求再取一个页面,其地址为[url]http://www.fun-lotto.com/InstantWin/instant.php?ts=990503721[/url],这个有什么用?你可多试试LOGIN,可以发现它后面的990503721是常变的,有什么用呢,看下面。

  填写七个数字,提交:

POST [url]http://www.fun-lotto.com/InstantWin/InstantWin.php[/url] HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: [url]http://www.fun-lotto.com/InstantWin/instant.php?ts=990503721[/url]
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: [url]www.fun-lotto.com[/url]
Content-Length: 277
Proxy-Connection: Keep-Alive
Pragma: no-cache
Cookie: usernameID=cashsoldier; passwordID=xxxxxx

balls_drawn=7&max_number=49&ad=%3C%21--DIRNAME--%3E&fromsite=%3C%21--DIRNAME--%3E-%3C%21--SPONSORID--%3E&dirname=%3C%21--SPONSORID--%3E&currentpicks=+&emailaddress1=cashsoldier&favorites=&numbers=2%2C+12%2C+19%2C+21%2C+27%2C+35%2C+47%2C+&WinningNumbers=Generate+Winning+Numbers


看到了吗,看到了吗?

Referer: [url]http://www.fun-lotto.com/InstantWin/instant.php?ts=990503721[/url]

有用吧,好像是有一点用,不过我看它用得多的时候还是对它的广告有用。

再试一次,

POST [url]http://www.fun-lotto.com/InstantWin/InstantWin.php[/url] HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: [url]http://www.fun-lotto.com/InstantWin/instant.php[/url]
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: [url]www.fun-lotto.com[/url]
Content-Length: 278
Proxy-Connection: Keep-Alive
Pragma: no-cache
Cookie: usernameID=cashsoldier; passwordID=xxxxx

balls_drawn=7&max_number=49&ad=%3C%21--DIRNAME--%3E&fromsite=%3C%21--DIRNAME--%3E-%3C%21--SPONSORID--%3E&dirname=%3C%21--SPONSORID--%3E&currentpicks=+&emailaddress1=cashsoldier&favorites=&numbers=11%2C+18%2C+26%2C+29%2C+30%2C+40%2C+42%2C+&WinningNumbers=Generate+Winning+Numbers
不一样了吧,好像没用,不过,第一次LOGIN后就有的了,(这里网站做的挺简单的,作弊真容易)

cashsoldier 发表于 2004-7-18 16:53

发送的内容不用我多讲的吧,给出源代码:

function Tfrm_main.GenerateWinningNumbersInstand(const Location,UserName,GetHTTPStr,ChangLocation:String):Boolean;
Var
Win:Array[0..6] of integer;
SendStr:String;
Begin
GenerateWinningNumbers(Win);     //取七个数字,我用的随机,你呢,自己写吧,如果中奖率高,记得给我一份
memo_List.Lines.Add(IntToStr(Win[0])+','+
IntToStr(Win[1])+','+
IntToStr(Win[2])+','+
IntToStr(Win[3])+','+
IntToStr(Win[4])+','+
IntToStr(Win[5])+','+
IntToStr(Win[6]));

NMHTTP.Host :='www.fun-lotto.com';
NMHTTP.HeaderInfo.Referer := Location;
SendStr :=GetHTTPStr+
'balls_drawn=7&max_number=49&ad=%3C%21--DIRNAME--%3E&fromsite=%3C%21--DIRNAME--%3E-%3C%21--SPONSORID--%3E&'+
'dirname=%3C%21--SPONSORID--%3E&currentpicks=+&emailaddress1='+Username+
'&favorites=&numbers='+
IntToStr(Win[0])+'%2C+'+
IntToStr(Win[1])+'%2C+'+
IntToStr(Win[2])+'%2C+'+
IntToStr(Win[3])+'%2C+'+
IntToStr(Win[4])+'%2C+'+
IntToStr(Win[5])+'%2C+'+
IntToStr(Win[6])+'%2C+'+
'&WinningNumbers=Generate+Winning+Numbers';
Result :=True;
NMHTTP.Get(SendStr);
if l_Begin.Caption ='Begin' then Exit;
if POS('http://www.fun-lotto.com/InstantWin/MaximumPlayed.html',NMHTTP.Body) >0 then Exit;
NMHTTP.Get(ChangLocation);
if POS('http://www.fun-lotto.com/InstantWin/MaximumPlayed.html',NMHTTP.Body) >0 then Exit;
Result :=False;
end;


调用它的方法

if GenerateWinningNumbersInstand(Location,UserName,
'http://www.fun-lotto.com/InstantWin/InstantWin.php?',
'http://www.fun-lotto.com/InstantWin/instant.php') then Break;
Location :='http://www.fun-lotto.com/InstantWin/instant.php';

好了好了,内容太多,我要吃饭了,提交完了,应LOGOUT了吧,

procedure Tfrm_main.LogoutWebHost;
Begin
NMHTTP.Host :='www.fun-lotto.com';
NMHTTP.HeaderInfo.Referer := 'http://www.fun-lotto.com/InstantWin/instant.php';
NMHTTP.HeaderInfo.Cookie :='Test=Pass; Seen=True';
NMHTTP.SendHeader.Values['User-Agent']:='Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)';
NMHTTP.Get('http://www.fun-lotto.com/InstantWin/logout.php');
end;


注,大家所看到的COOKIE的设置,我这里没多讲,仔细看看代理截到的内容,它的COOKIE实际上保

存的是你的用户名称和密码,所以我在程序内部就把它固定死了,对不同的网站可不能用相同的方法。

  好了,实战FUN-LOTTO就到此了,有什么不明白的地方,我不会回答,必竟,我是CASHSOLDIER

cashsoldier 发表于 2004-7-18 16:53

经过这几次的模拟器编写,我现在用的方法越来越好了,从一开始的造钱战士 VIP系列到FL、FPL,历经了几个变化,现总结如下:
1、利用TWEB控件
用TWEB控件能让网站最不容发觉,它不应该叫模拟器,而应该叫作弊器更合适,因为它是利用IE的控件自动完成操作,但并没有模拟相应的信息,该方法是最简单且较为实用的一种,如果能熟练掌握,对今后的B/C模式编程有很大的好处。当然,使用另一种方法即Automating方式,即用程序从外部控制IE没做过,但它的局限性大,所以对于大部份网站不推介。当然,它的缺点是由于使用IE的控件,一不好控制速度,二不好控制流量(所有的东西都下载了),三有COOKIE的问题,四对多帐号处理难度较大,五不好控制流程。所以,在以后的过程中,我基本不使用该方法了。
2、利用TNMHTTP控件
TNMHTTP控件是DELPHI自带的东西,但它的很多功能不好用,如模拟IE4、IE5或模拟其它的浏览器很困难,当然,用它可对信息流进行全面控制,应该是真正的模拟器了
3、利用TCLIENTWINSOCK
TCLIENTSOCK也是DELPHI自带的控件,和TNMHTTP一样,但它能更好地处理HTTP头信息,模拟IE4、IE5甚至其它浏览器,但由于是事件驱动,对于模拟器来讲可变性太大,因此,在改变为结构化驱动时,点用CPU极大,FPL就是采用该方法完成
4、利用WISOCK API
由于WINSOCK API是WINDOWS优化的线程式方法,它是结构化的过程驱动,因此,在处理顺序过程时相对要好,同时,由于采用线程优化,CPU占用基本为0 ,我已完成这部份内容,以后的模拟器就可以采用该方法处理了。
以上是我做模拟器的开发总结,不知对大家有没用处,权当又一篇教程吧

zxyatyj 发表于 2004-7-18 22:17

衷心感谢cashsoldier的无私奉献,谢谢!

lemon 发表于 2004-7-19 14:49

学习

孙文 发表于 2004-7-19 20:27

感谢

==========
3、利用TCLIENTWINSOCK
TCLIENTSOCK也是DELPHI自带的控件,和TNMHTTP一样,但它能更好地处理HTTP头信息,模拟IE4、IE5甚至其它浏览器,但由于是事件驱动,对于模拟器来讲可变性太大,因此,在改变为结构化驱动时,点用CPU极大,FPL就是采用该方法完成
4、利用WISOCK API
由于WINSOCK API是WINDOWS优化的线程式方法,它是结构化的过程驱动,因此,在处理顺序过程时相对要好,同时,由于采用线程优化,CPU占用基本为0 ,我已完成这部份内容,以后的模拟器就可以采用该方法处理了。
以上是我做模拟器的开发总结,不知对大家有没用处,权当又一篇教程吧
=============
我还停留在第3步,哎,惭愧!

cashsoldier 发表于 2004-7-20 12:30

有些更正
其实谈不上第几步,只要能很好地控制和完成模拟器的制作,并且形成一个类似游戏的开发引擎一样的东西,能较快地开发出相关工具。无论采用什么样的控件、开发工具,都能达到极好的效果,我们可以看到很多优秀的软件工具用的是VB开发的,包括MS的很多程序(我并未说VB不好或其它,只是打个比方),用DELPHI、VC等也能实现相同的效果,更多的在于经验的积累。后来我就发现,以前我写的东西里面一样有不少错误(包括概念错误),如用TCLIENTSOCKET我也能做很多大型的通信程序,系统占用及控制非常方便(以前是未熟悉而已),而用WIN API来实现也能正常处理,现在对HTTP协议的理解及通信也有了更深的提高,前段时间做了一下对SSL的处理(用TCLIENTSOCKET或WINAPI SOCKET只能收到加密码信息,需要对其进行解码,它是建立在HTTP之上的一个加密协议-不知我这样理解对不对),另外也做了个简单的IP模拟的小东西(如果真的做到TCP通信握手部分的IP模拟,就不用再去找什么代理了^_^),IP隐藏实际上很简单,但实际应用却很复杂,有兴趣和经验的朋友我倒想和他多交流一下

ls729 发表于 2004-8-8 22:05

楼主着是干什么用的呢

gdljf 发表于 2004-8-17 00:47

IP模拟我想是搞不出来的了,我曾经浪费了一个月研究握手,可是我发现我再多花时间也搞不出来,只好放弃了

tuxigood 发表于 2004-8-22 23:04

水平有限,看不懂

aosen 发表于 2004-8-26 10:39

高手

tzliuping 发表于 2004-8-31 00:15

非常感谢,受益非浅

cdvf 发表于 2004-9-4 21:05

thanks

sakurakyoo 发表于 2004-10-1 14:52

受教了拉~
编程好复杂啊!明年就要学习了, 想想都头痛!

fline 发表于 2004-11-2 02:43

忠心感谢楼主无么的奉献.
学到不少东西.
先谢谢过了.

绝对新手 发表于 2005-2-21 22:54

。。

厉害

热带鱼 发表于 2005-3-28 00:53

高手

lpi 发表于 2005-4-2 23:10

汗,今天才看到这篇这么好的文章,非常受益,谢谢楼主分享,希望能多些,呵呵

anyhugh 发表于 2005-4-24 15:38

很复杂的哦

咖哩绿茶 发表于 2005-4-28 10:40

收藏收藏,真心感谢

entfilm 发表于 2005-6-17 11:57

真心感谢
不知可有VB教程?

axieaxie 发表于 2005-6-20 16:21

好极,实在是详尽得很啊

我是蚂蚁 发表于 2005-7-10 23:43

太牛了~~~~

fale 发表于 2005-7-12 17:18

看不懂啊

skandy0223 发表于 2006-6-2 15:36

学习中~~

发表于 2006-6-27 21:22

好长````


顶楼主一个```

xpg5555 发表于 2006-6-30 05:53

不懂你到底写的什么啊

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2007 Comsenz Inc.