一天一天学做外挂@第八天-门当户对分清楚[武林外传]

 
如果你认真的学习过前七篇的内容,并且在原内容的基础上去延伸,你一定可以编写出一个不错的程序了。它可你帮助你实现诸如:显示信息、自动加血、自动选怪、自动攻击、自动状态、物品过滤、简单游戏修改等功能。当然,这只是些最基本的功能的功能啦,但是万尺高楼平地起,不要因为功能简单而灰心,因为你已经掌握了制作大多数游戏简单外挂的思路及能力,在这基础之上继续学习的你不仅能做出功能更强的程序,而且自身的技术水平也得到提升,这才是最重要的。



当我们多开游戏的时候就会遇到外挂不能正确挂到目标窗口麻烦,今天我们就来制作一个显示Windows窗口的列表,然后通过选择正确连接到游戏。





学习目的:
1.掌握相同窗口标题选择方法。


内容:
1.我们将使用EnumWindows枚举Windows所有窗口。首先来看看MSDN说明:
    函数功能:该函数枚举所有屏幕上的顶层窗口,办法是先将句柄传给每一个窗口,然后再传送给应用程序定义的回调函数。EnumThreadWindows函数继续到所有顶层窗口枚举完为止或回调函数返回FALSE为止函数原型:BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);

    参数:

    lpEnumFunc:指向一个应用程序定义的回调数指针,请参看EnumWindowsProc。

    lPararm:指定一个传递给回调函数的应用程序定义值。

    返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。


2.模块部分:
Option Explicit
'得到窗口的标题条文本
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
'枚举所有屏幕上的顶层窗口
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
  
Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
Dim S As String
S = String(80, 0)
Call GetWindowText(hwnd, S, 80)
S = Left(S, InStr(S, Chr(0)) - 1)
If Len(S) > 0 Then Form1.List1.AddItem S
EnumWindowsProc = True
End Function

3.Form部分,我们需要一个List控件用于显示:


Private Sub Form_Load()
EnumWindows AddressOf EnumWindowsProc, 0&
End Sub



4.运行程序,显示了所有窗口的文本。




5.好了,我们完成了核心程序。
现在我们要接着往下做三个工作:(1)只显示我们想要的窗口、(2)显示人物名称、(3)选择目标人物连接游戏窗口。


5.1.筛选枚举出来的窗口。这个很简单,只要在插入List之前的If中再加入一个判断窗口文本内容就可以实现。
If Len(S) > 0 and UCase(S) = "ELEMENT CLIENT" Then Form1.List1.AddItem S


5.2.显示人物名称,我想这个大家都会吧!
If Len(S) > 0 And UCase(S) = "ELEMENT CLIENT" Then
Dim ProcID As Long, hpID As Long, BuffEnum(35) As Byte, ECXI As Long, eax As Long, Str As String

GetWindowThreadProcessId hwnd, hpID
ProcID = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, hpID)

      ReadProcessMemory ProcID, ByVal &H8C9E54, ECXI, 4, 0     '这个是存放基址的地址
      ReadProcessMemory ProcID, ByVal ECXI + &H24, eax, 4, 0
      ReadProcessMemory ProcID, ByVal eax + &H390, ECXI, 4, 0
      ReadProcessMemory ProcID, ByVal ECXI, BuffEnum(0), 36, 0
      Str = Left$(BuffEnum, 36)
      Form1.List1.AddItem hpID & " " & Str ‘这里我耍了一个小聪明,可以省好多事。
End If


5.3.选择目标窗口连接游戏。
当然要在List1_Click中插入代码了。我使用两个Form,先显示Form1选择游戏窗口,传递游戏窗口的PID给Form2,然后再Form2里OpenProcess即可。所以我的List1_Click代码:
Form2.Show
Me.Hide


6.写到这里,后面的大家就应该知道怎么吧。这次就不公布源码了,因为特征码的关系遭封杀的几率太大,另外这样也好给大家留出一些设计的空间。


注意:
如果你在原有程序的基础上,添加新的Form2用于选择游戏窗口,请设置从Form2启动。
程序关闭时别忘卸载隐藏的Form。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值