2010年的外挂小作品 - QQ对对碰单机版外挂
来源:互联网 发布:足球大师小贝捏脸数据 编辑:程序博客网 时间:2024/05/29 10:56
其实呢。这个重中之重是找对基址= =。源码么纯粹YY。
这个小外挂实现了各种淫荡的功能。比如把所有的动物换成相同的。
还有更加淫荡的直接加分功能。= =纯粹是蛋疼。
unit Unit1;interface{ 程序:Michael J Scofield http://blog.csdn.net/MichaelJScofield 2010.04.27 2010.05.08:今天找到了游戏第一个座位基址,加上. PS:今天看了韩国的《婚纱》。}uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForm1 = class(TForm) mmoChess: TMemo; btnReadChessInfo: TButton; btnShowChess: TButton; btnEditValue: TButton; btnChangeOne: TButton; btnAotoChange: TButton; tmrAutoKill: TTimer; Timer1: TTimer; btnAddSc: TButton; edtSc: TEdit; procedure btnReadChessInfoClick(Sender: TObject); procedure btnShowChessClick(Sender: TObject); procedure btnEditValueClick(Sender: TObject); procedure btnChangeOneClick(Sender: TObject); procedure tmrAutoKillTimer(Sender: TObject); procedure btnAotoChangeClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure btnAddScClick(Sender: TObject); private { So boring } public { (*^__^*) } end;type TChess = Array[1..8,1..160] of Byte; //定义棋盘数组 TChangePoint = Array[1..2] of TPoint; //可改变坐标const MOUSE_RIGHTCLICK = 2; //鼠标右键 GameCaption = 'Asphyre - massive particle effects'; //窗口标题 AppClassName = 'TMainForm'; //窗口类 ChessPointer = $488BE0; //棋盘基址 [[488BE0]+68]+32Ctype TGameChess = class pGameBase: Pointer; pChessman: Pointer; pTips: Pointer; pMark: Pointer; ChessData:TChess; //棋盘数据 private public end;var Form1: TForm1; ChessData:TChess; //棋盘数据 {获取真实基址} function GetBase:Pointer; {读取棋盘数组} function ReadChessData:TChess; {改变值} procedure ChangeValue(Value:Integer); {检查是否可以交换} function ICanFind3Chessman(ChessData:TChess):Boolean; {交换棋子} procedure ChangeChessman(Pa,Pb:TPoint); {获取可改变坐标} function GetPoint:TChangePoint; {消除一个} procedure KillOne; {开始游戏} procedure StartGame;implementation{$R *.dfm}{转换名字}function WhatIsit(Plug:Integer):string;begin Result := 'X'; case plug of 0:Result := '蛙'; 1:Result := '鸡'; 2:Result := '猫'; 3:Result := '熊'; 4:Result := '狗'; 5:Result := '牛'; 6:Result := '猴'; end;end;{获取真实基址}function GetBase:Pointer;var hGame,hProcess:THandle; dwPID,dwRead:DWORD; ChessBase: Integer;begin Result := nil; hGame:=Findwindow(AppClassName,GameCaption); if hGame <> 0 then begin GetWindowThreadProcessId(hGame,dwPID); if dwPID <> 0 then begin hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,dwPID);//[[488BE0]+68]+32C ReadProcessMemory(hProcess,Pointer(ChessPointer),@ChessBase,4,dwRead); //我们读取指针 4字节够了 ReadProcessMemory(hProcess,Pointer(ChessBase+$68),@ChessBase,4,dwRead); CloseHandle(hProcess); Result := Pointer(ChessBase+$32C); end; end;end;{读取棋盘数组}function ReadChessData:TChess;var hGame,hProcess:THandle; dwPID,dwRead:DWORD; ChessXY:TChess;begin hGame:=Findwindow(AppClassName,GameCaption); if hGame <> 0 then begin GetWindowThreadProcessId(hGame,dwPID); if dwPID <> 0 then begin hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,dwPID); ReadProcessMemory(hProcess,GetBase,@ChessXY,SizeOf(TChess),dwRead); CloseHandle(hProcess); Result := ChessXY; end; end; CloseHandle(hGame);end;{修改提示}procedure TForm1.btnReadChessInfoClick(Sender: TObject);var hGame,hProcess: THandle; dwPID,dwRead: DWORD; TipsCount: Integer; Tips,ScanCode: Byte;begin StartGame; hGame:=Findwindow(AppClassName,GameCaption); if hGame <> 0 then begin GetWindowThreadProcessId(hGame,dwPID); if dwPID <> 0 then begin hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,dwPID);//[[488BE0]+68]+A30 ReadProcessMemory(hProcess,Pointer(ChessPointer),@TipsCount,4,dwRead); //我们读取指针 4字节够了 ReadProcessMemory(hProcess,Pointer(TipsCount+$68),@TipsCount,4,dwRead); ReadProcessMemory(hProcess,Pointer(TipsCount+$A30),@Tips,SizeOf(Byte),dwRead); Tips := Tips + 1; WriteProcessMemory(hProcess,Pointer(TipsCount+$A30),@Tips,SizeOf(Tips),dwRead); ScanCode := MapVirtualKey(VK_F1,0); keybd_event(VK_F1,ScanCode,KEYEVENTF_EXTENDEDKEY,0); keybd_event(VK_F1,ScanCode,KEYEVENTF_KEYUP,0); CloseHandle(hProcess); end; end; CloseHandle(hGame);end;{读取棋盘信息}procedure TForm1.btnShowChessClick(Sender: TObject);var ChessXY:TChess; x,y:Integer; ChessLine:string;begin ChessXY := ReadChessData; mmoChess.Lines.Add('#######################'); for y:=1 to 8 do begin ChessLine := '#'; for x:=1 to 8 do begin ChessLine := ChessLine + WhatIsit(ChessXY[x][(y-1)*20+1])+'#'; end; mmoChess.Lines.Add(ChessLine); end; mmoChess.Lines.Add('#######################');end;{改变值}procedure ChangeValue(Value:Integer);var hGame,hProcess:THandle; dwPID,dwRead:DWORD; ChessXY:TChess; x,y:Integer;begin hGame:=Findwindow(AppClassName,GameCaption); if hGame <> 0 then begin GetWindowThreadProcessId(hGame,dwPID); if dwPID <> 0 then begin hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,dwPID); ReadProcessMemory(hProcess,GetBase,@ChessXY,SizeOf(ChessXY),dwRead); for y:=1 to 8 do begin for x:=1 to 8 do begin ChessXY[x][(y-1)*20+1] := Value; end; end; WriteProcessMemory(hProcess,GetBase,@ChessXY,SizeOf(ChessXY),dwRead); CloseHandle(hProcess); end; end;end;{改成熊猫}procedure TForm1.btnEditValueClick(Sender: TObject);begin ChangeValue(3);end;{交换棋子}procedure ChangeChessman(Pa,Pb:TPoint);var hGame:THandle; ClickFocus:DWORD; p1,p2:TPoint;begin hGame:=Findwindow(AppClassName,GameCaption); p1.X := 37 + 48 * Pa.X - 24; p1.Y := 125 + 48 * Pa.Y - 24; p2.X := 37 + 48 * Pb.X - 24; p2.Y := 125 + 48 * Pb.Y - 24; ClickFocus := p1.X + p1.Y shl 16; SendMessage(hGame,WM_LBUTTONDOWN,0,ClickFocus); sendMessage(hGame,WM_LBUTTONUP, 0,ClickFocus); ClickFocus := p2.X + p2.Y shl 16; SendMessage(hGame,WM_LBUTTONDOWN,0,ClickFocus); sendMessage(hGame,WM_LBUTTONUP,0,ClickFocus);end;{检查是否可以交换}function ICanFind3Chessman(ChessData:TChess):Boolean;var i,X,Y:Integer;begin Result := False; for Y:=1 to 8 do begin i := 1; for X:=1 to 7 do begin if (ChessData[X][(Y-1)*20+1])=(ChessData[X+1][(Y-1)*20+1]) then //横坐标 相邻检查 begin i := i + 1; if i >= 3 then begin Result := True; Exit; end; end else begin i := 1; end; end; end; for X:=1 to 8 do //纵坐标 begin i := 1; for Y:=1 to 7 do begin if (ChessData[X][(Y-1)*20+1])=(ChessData[X][Y*20+1]) then begin i := 1; if i >= 3 then begin Result := True; Exit; end; end else begin i := 1; end; end; end;end;{获取可改变坐标}function GetPoint:TChangePoint;var X,Y:Integer;begin for X:=1 to 8 do begin for Y:=1 to 7 do //因为第八位没有相邻棋子了 begin ChessData := ReadChessData; ChessData[X][(Y-1)*20+1] := ChessData[X][(Y-1)*20+1] + ChessData[X][Y*20+1]; ChessData[X][Y*20+1] := ChessData[X][(Y-1)*20+1] - ChessData[X][Y*20+1]; ChessData[X][(Y-1)*20+1] := ChessData[X][(Y-1)*20+1] - ChessData[X][Y*20+1]; if ICanFind3Chessman(ChessData) then begin Result[1].X := X; Result[1].Y := Y; Result[2].X := X; Result[2].Y := Y + 1; Exit; end; end; end; for Y:=1 to 8 do begin for X:=1 to 7 do begin ChessData := ReadChessData; ChessData[X][(Y-1)*20+1] := ChessData[X][(Y-1)*20+1] + ChessData[X+1][(Y-1)*20+1]; ChessData[X+1][(Y-1)*20+1] := ChessData[X][(Y-1)*20+1] - ChessData[X+1][(Y-1)*20+1]; ChessData[X][(Y-1)*20+1] := ChessData[X][(Y-1)*20+1] - ChessData[X+1][(Y-1)*20+1]; if ICanFind3Chessman(ChessData) then begin Result[1].X := X; Result[1].Y := Y; Result[2].X := X + 1; Result[2].Y := Y; Exit; end; end; end;end;{消除一个}procedure KillOne;var ChangePoint:TChangePoint;begin ChangePoint := GetPoint; ChangeChessman(ChangePoint[1],ChangePoint[2]);end;procedure TForm1.btnChangeOneClick(Sender: TObject);begin StartGame; KillOne;end;{每2秒钟消除一个}procedure TForm1.tmrAutoKillTimer(Sender: TObject);begin KillOne;end;{开始游戏}procedure StartGame;var hGame:THandle;begin hGame:=Findwindow(AppClassName,GameCaption); if hGame <> 0 then begin SetForegroundWindow(hGame);//设置窗体置顶 SendMessage(hGame,WM_LBUTTONDOWN,1,31195597);//$01DC01BB SendMessage(hGame,WM_LBUTTONUP,1,31195597); end;end;{启动自动清除}procedure TForm1.btnAotoChangeClick(Sender: TObject);begin if btnAotoChange.Caption = '自动消除' then begin btnAotoChange.Caption := '停止'; StartGame; tmrAutoKill.Enabled := True; end else if btnAotoChange.Caption = '停止' then begin btnAotoChange.Caption := '自动消除'; tmrAutoKill.Enabled := False; end;end;{截获右键}procedure TForm1.Timer1Timer(Sender: TObject);begin Randomize; if GetAsyncKeyState(MOUSE_RIGHTCLICK)<>0 then begin ChangeValue(Random(6)); end;end;{加分}procedure TForm1.btnAddScClick(Sender: TObject);var hGame,hProcess: THandle; dwPID,dwRead: DWORD; TipsCount,Source: Integer;begin StartGame; hGame:=Findwindow(AppClassName,GameCaption); if hGame <> 0 then begin GetWindowThreadProcessId(hGame,dwPID); if dwPID <> 0 then begin hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,dwPID);//[[488BE0]+68]+AC4 分数基址 ReadProcessMemory(hProcess,Pointer(ChessPointer),@TipsCount,4,dwRead); ReadProcessMemory(hProcess,Pointer(TipsCount+$68),@TipsCount,4,dwRead); Source := StrToInt(edtSc.Text); WriteProcessMemory(hProcess,Pointer(TipsCount+$AC4),@Source,SizeOf(Source),dwRead); CloseHandle(hProcess); end; end; CloseHandle(hGame);end;end.
- 2010年的外挂小作品 - QQ对对碰单机版外挂
- 刚写的QQ对对碰外挂
- ~QQ新版对对碰游戏外挂的制作方法~
- VC6做QQ对对碰外挂程序
- 外挂练手之“QQ对对碰助手”
- QQ游戏外挂mouse_event不起作用的原因,及我的对对碰外挂程序.
- QQ游戏外挂制作教程 (对对碰)
- QQ游戏外挂制作教程 (对对碰)
- 教你用VC6做QQ对对碰外挂程序
- 用VC6做QQ对对碰外挂程序
- QQ游戏外挂制作教程 (对对碰) 选择自 terry6394 的 Blog
- vc6做对对碰外挂原理
- QQ连连看小外挂一个
- QQ连连看小外挂一个
- 外挂
- 外挂
- 外挂
- 外挂
- 判断是手机登录还是电脑登录的几种方式
- 优秀只是一种习惯
- isdn简介
- maple学习(一)
- 读取Lrc-Java
- 2010年的外挂小作品 - QQ对对碰单机版外挂
- HDU 3788 ZOJ问题
- 第一天:JAVA基础加强
- 第二天:xml_dtd_dom_jaxp
- MediaPlayer实现带播放条的音乐播放和视频播放,可以作为程序参考
- 第三天:dom4j_xpath_schema
- rh436 - 通过udev配置iscsi共享磁盘名称及权限(rhel5.5)
- 第四天:tomcat相关配置
- 第五天:HTTP协议讲解