其他分享
首页 > 其他分享> > 对《工艺战舰》简单外挂的部分探究(一)

对《工艺战舰》简单外挂的部分探究(一)

作者:互联网

本人才疏学浅,代码有问题的地方太多了。实际上整个代码只是简单做一个堪用的东西而已。

不要问为什么做外挂,只是一时兴起罢了。由于这个游戏肝度越来越高,所以使用外挂成为了非常有必要的一个手段。

工艺战舰拆包里的第一个CS文件:
在这里插入图片描述“嘿,破解者,你看到了我,所以我也看到了你,你好哦#(滑稽)。你尽管拆,拆出来有趣的东西算我输#(滑稽)。拆完了记得给我们关上。哦对了,这里有很多辣眼睛的暴力代码。请见谅”
拆包的工作也在做了,只不过太冗杂了,不想做。2021.02的游戏版本的代码也是有的。

由于做的工程主要分为按键精灵的部分,以及Fiddler抓包相关的部分,所以会分成两篇文章来写。这一篇是按键精灵部分


目录

按键精灵(VBS)自用库

之所以选用按键精灵,是因为其作为一个国产编写Q语言(按键精灵自己的语言,VBS改)的IDE,没有VS/VSCode/VB等等那么重量级,不需要配置一大堆运行环境,但是却可以实现他人代码的即插即用,不用编译(因为它本质就是VBS改)。也正是因为是国人开发的软件,其自带把英文源码转为中文自然语言的能力,更加适合不会写代码的人自己修改代码以适配自己的电脑。

需求

游戏的自动点击脚本,基本上就是检查颜色、等到正确的颜色出现后,点击某个位置。另外按键精灵貌似没有拖动屏幕滑动的功能,因此增加鼠标拖动滑动功能。

  1. 找到颜色后,点击屏幕
    1.1. 找颜色
    1.2. 等待出现颜色
    1.3. 点击一次,或点击到变色
  2. 报错
    需要在控制台输出明显的错误提示

实现

找到颜色后点击(WaitUntilClick)

要实现这个目标,初步预测参数为:点击位置、颜色点,即

Function WaitUntilClick(ClickPoint, ColorPoints)

后有些情况下点击后不会发生颜色变化,或者不方便进行颜色变化检测,如点击后背景颜色从0x000000变为0xffffff,也有可能是从0x00ffff变成0xffff00,并且在点击前也在自行变化,因此只能进行一次点击而不判断点击后的效果。
同时如果长时间不能检测到颜色会导致程序卡死在这一步,因此需要加入TTL(Time to Live),超时即会返回错误并结束该方法。
最后希望在Console输出现在正在进行哪一步颜色判断,因此加入名字。
最后该方法的参数如下:

Function WaitUntilClick(ClickPoint, ColorPoints, isChangeColor, name, TTL)
//等到屏幕指定点出现指定颜色值后点击屏幕指定点
//使用抓抓的放大镜功能,ctrl+alt+1~9可以选择屏幕上的点坐标与颜色。
//ClickPoint: 一个包含了点击点x,y的数组,注意用Array()制作数组。E.g.:  Array(100,200)
//ColorPoints: 一个不限数量的数组,包含了选取颜色点的坐标和颜色,每个元素为一个字符串,E.g.:  Array("960,0  5574BD", "893,1002  FFFFFF", "990,1005  FFFFFF")
//isChangeColor: 点击后ColorPoints选取的颜色点是否改变颜色,1为是,0为否。
//name: 这次点击的名字,用户可以方便在输出窗口区分
//TTL: 运行最大时间,超过TTL则停止等待
	TracePrint(name&"Enter  WaitUntilClick Func")
	Dim mWaitUntil,mClickUntilChange,mWaitUntilClick
	mWaitUntil=WaitUntil(ColorPoints, name, TTL)
	If (mWaitUntil = 1) Then 
		If (isChangeColor = 0) Then 
			Delay 3000
			MoveTo ClickPoint(0),ClickPoint(1)
			LeftClick 1
			mClickUntilChange = 1
		ElseIf (isChangeColor = 1)
			mClickUntilChange = ClickUntilChange(ClickPoint, ColorPoints, name, 30)
		End If
	End If
	If (mWaitUntil + mClickUntilChange = 2) Then 
		mWaitUntilClick = 1
		TracePrint(name&" WaitUntilClick Func Success")
	Else 
		mWaitUntilClick = 0
		TracePrint(name&" WaitUntilClick Func Failed")
	End If
	WaitUntilClick = mWaitUntilClick
	
	Rem WaitUntilClickEnd
End Function

寻找颜色(CmpColorEx)

实际上,这个目标是有按键精灵自带的方法的,但写的时候不知道,所以自己写了一个
该方法为WaitUntilClick调用的一个子方法,输入参数为颜色点数组,即ColorPoints。数组元素为字符串,需要字符串处理获得颜色点坐标、颜色值。for循环逐个数组元素获取屏幕中该坐标点的颜色值并与输入值对比。同时还有允许误差,需要对颜色值16进制两位一组分成三组,并相减,取模,与允许误差对比。若有不符合,则返回0,若全部符合,则返回1.

Function CmpColorEx(ColorPoints, shift)
	Dim PosX, PosY, ColorValue, GetColor, Check, ColorPoint
	Check = 1
	For i = 0 To UBound(ColorPoints)
		ColorPoint=ColorPoints(i)
		PosX = Cint(Mid(ColorPoint, 1, InStr(ColorPoint, ",")))
		PosY = Cint(Mid(ColorPoint, InStr(ColorPoint, ",")+1, InStr(ColorPoint, "  ")-InStr(ColorPoint, ",")))
		ColorValue = Mid(ColorPoint, InStr(ColorPoint, "  ")+2)
		GetColor = GetPixelColor(PosX, PosY)
		If (Abs(Eval("&H" & Mid(GetColor, 1, 2)) - Eval("&H" & Mid(ColorValue, 1, 2))) < Eval("&H" & Mid(shift, 1, 2))and Abs(Eval("&H" & Mid(GetColor, 3, 4)) - Eval("&H" & Mid(ColorValue, 3, 4))) < Eval("&H" & Mid(shift, 3, 4)) and Abs(Eval("&H" & Mid(GetColor, 5, 6)) - Eval("&H" & Mid(ColorValue, 5, 6))) < Eval("&H" & Mid(shift, 5, 6))) Then 
		Else 
			Check = 0
		End If
	Next
	
	CmpColorEx = Check

End Function

等待出现某个颜色(WaitUntil)

for循环,每一秒进行一次,调用寻找颜色的方法。若超时,则返回0。

Function WaitUntil(ColorPoints, name, TTL)
	Dim CntDown,AlreadyFindColor
	CntDown = TTL
	AlreadyFindColor = 0
	
	While (CntDown > 0 and AlreadyFindColor = 0)
		If (CmpColorEx(ColorPoints, "202020") = 1) Then 
			AlreadyFindColor = 1
		End If
		CntDown = CntDown - 0.5
		TracePrint("Waiting Until "& name & Cstr(CntDown))
		Delay 500
	Wend
	If (AlreadyFindColor = 1) Then 
		TracePrint("Found color "&name)
	Else 
		Call LogErr(name,"Can't find color")
	End If
	WaitUntil = AlreadyFindColor
End Function

点击(ClickUntilChange)

点击有点击一次与点击到变色。如果只点击一次,则直接稍微延时后点击。主要实现点击直到变色。变色也用CmpColorEx方法。


Function ClickUntilChange(ClickPoint, ColorPoints, name, TTL)
	Dim CntDown, AlreadyChange
	CntDown = TTL
	AlreadyChange = 0
	
	While (CntDown > 0 and AlreadyChange = 0)
		MoveTo ClickPoint(0),ClickPoint(1)
		LeftClick 1
		If (CmpColorEx(ColorPoints, "202020") = 0) Then 
			AlreadyChange = 1
		End If
		CntDown = CntDown - 2
		TracePrint("Clicking Until Change "& name & Cstr(CntDown))
		Delay 2000
	Wend
	If AlreadyChange = 1 Then 
		TracePrint("Clicked"&name)
	Else 
		Call LogErr(name,"Click Can't change color")
	End If
	ClickUntilChange = AlreadyChange
End Function

自动远征

主要还是调用上述的WaitUntilClick方法。对屏幕点位的操作,主要还是重复性操作,因此不再赘述

连点器

主要有两块,一是用户控制部分,用于控制点击启停,二是实际点击,三是点掉连点器警告(工艺战舰在接受到过快的点击时会警告)。

玩家控制部分

仍然是一个for作为主循环,连续两次点击空格后开始检测连点,连续点两次ctrl后结束连点。
连点以及反警告都在其他线程完成,主线程主要是进行玩家控制,不进行点击操作。

While (true)
	key1 = WaitKey()
	key2 = WaitKey()
	TracePrint (key1)
	TracePrint (key2)
	If (key1 = 32 and key2 = 32) Then //开始检测射击
		TracePrint("开始检测射击")
		ableShoot = True
	End If

	If (key1 = 17 and key2 = 17) Then //停止检测射击
		TracePrint("停止检测射击")
		ableShoot = False
	End If
	TracePrint ("ableShoot: "+cstr(ableShoot)+"   useBug: "+cstr(useBug))

	If (ableShoot = True and shooting = false) Then 
		TracePrint(开始射击)
		ThreadID1 = BeginThread(shoot())
		ThreadID2 = BeginThread(checkWarning())
		shooting = True
	End If
	If (ableShoot = False and shooting = True) Then 
		TracePrint("停止射击")
		StopThread (ThreadID1)
		StopThread (ThreadID2)
		shooting = False
	End If
	Delay 500
Wend

连点部分(shoot)

检测区域存在颜色,如果装填好后,装填进度条颜色会变成绿色,若出现绿色,则开始点击。

lastShoot = false
sub shoot()
	While (true)
		//cnt = 20
		Call FindColor(589,834,1590,1033,"B5FE00",intX,intY)
		If intX > 0 And intY > 0 Then 
			LeftClick 1
			TracePrint("SHOOT")
			thisShoot = True
		Else 
			thisShoot = False
		End If
		lastShoot = thisShoot
		
		Delay 1
	Wend

End Sub

连点警告处理

检测颜色点,如果出现警告弹窗的颜色点,则开始点击。


Sub checkWarning()
	While (True)
		isWarning = Lib.Click_Extend.CmpColorEx(Array("386,314  26BAFF","415,896  FFFFFF","483,890  333333"),"101010")
		If (isWarning = 1) Then 
			Call MoveTo(515,889)
			LeftClick 1
		End If
		Delay 100
	Wend
	
End Sub

无敌战斗

使用Fiddler进行修改,期待下一篇

连发核弹

使用Fiddler进行修改,期待下一篇

自动战斗

使用Fiddler进行修改,期待下一篇

标签:外挂,颜色,name,TracePrint,ColorPoints,探究,点击,End,战舰
来源: https://blog.csdn.net/MioSleet/article/details/112555110