zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#游戏外挂实现核心代码

c#游戏代码 实现 核心 外挂
2023-06-13 09:14:07 时间
最近经朋友介绍开始玩密传网络游戏
升级升级,突然觉得太费键盘,于是自己用C#写了一个程序,想代替我的操作,自己去打怪物,自己升级
用这个东西升了好多级了,现在把源码贴出来,和大家共享,欢迎大家批评指正,感激不尽。
程序大概分成两个部分,一个部分是类库,一个是应用程序
大概的思路就是找到游戏进程的主窗口句柄,然后发送游戏按键消息(模拟按键)。


XDF.GamePlugInCommon类库项目

//API.cs文件,定义一些常用API函数及常量

usingSystem;
usingSystem.IO;
usingSystem.Threading;
usingSystem.Diagnostics;
usingSystem.Runtime.InteropServices;

namespaceXDF.GamePlugInCommon
{
///<summary>
///API的摘要说明。
///</summary>
publicsealedclassAPI
{
publicstaticintWM_KEYDOWN=0x0100;
publicstaticintWM_KEYUP=0x0101;
publicstaticintWM_SYSKEYDOWN=0x0104;
publicstaticintWM_SYSKEYUP=0x0105;

publicstaticintWM_MOUSEMOVE=0x0200;
publicstaticintWM_LBUTTONDOWN=0x0201;
publicstaticintWM_LBUTTONUP=0x0202;
publicstaticintWM_LBUTTONDBLCLK=0x0203;
publicstaticintWM_RBUTTONDOWN=0x0204;
publicstaticintWM_RBUTTONUP=0x0205;
publicstaticintWM_RBUTTONDBLCLK=0x0206;
publicstaticintWM_USER=0x0400;

publicstaticintMK_LBUTTON=0x0001;
publicstaticintMK_RBUTTON=0x0002;
publicstaticintMK_SHIFT=0x0004;
publicstaticintMK_CONTROL=0x0008;
publicstaticintMK_MBUTTON=0x0010;

publicstaticintMK_XBUTTON1=0x0020;
publicstaticintMK_XBUTTON2=0x0040;

[DllImport("user32.dll")]
publicstaticexternintSendMessage(IntPtrhWnd,intMsg,intwParam,intlParam);

//此处主要用来让窗口置于最前(SetWindowPos(this.Handle,-1,0,0,0,0,0x4000|0x0001|0x0002);)
[System.Runtime.InteropServices.DllImport("user32.dll")]
publicstaticexternboolSetWindowPos(IntPtrhWnd,
inthWndInsertAfter,
intX,
intY,
intcx,
intcy,
intuFlags
);

///<summary>
///窗口置前
///</summary>
///<paramname="hWnd"></param>
publicstaticvoidSetWindowPos(IntPtrhWnd)
{
SetWindowPos(hWnd,-1,0,0,0,0,0x4000|0x0001|0x0002);
}

///<summary>
///
///</summary>
///<paramname="processName"></param>
///<returns></returns>
publicstaticProcessGetGameProcess(stringprocessName)
{
Processpro=null;
Process[]pros=Process.GetProcessesByName(processName);
if(pros.Length>0)
{
pro=pros[0];
}
returnpro;
}
}
}


项目(应用程序)
XDF.TantraPlugIn
//ControlItem.cs
usingSystem;
usingSystem.IO;
usingSystem.Xml.Serialization;

namespaceXDF.TantraPlugIn
{
///<summary>
///ControlItem的摘要说明。
///</summary>
[Serializable]
publicsealedclassControlItem
{
privatestringm_Name="";
publicstringName
{
get
{
returnthis.m_Name;
}
set
{
this.m_Name=value;
}
}
privatecharm_KeyChar="a";
publiccharKeyChar
{
get
{
returnthis.m_KeyChar;
}
set
{
this.m_KeyChar=value;
}
}
privateintm_DelayTime=100;
publicintDelayTime
{
get
{
returnthis.m_DelayTime;
}
set
{
this.m_DelayTime=value;
}
}
publicControlItem()
{

}
}
[Serializable]
publicsealedclassControlItemCollection:System.Collections.CollectionBase
{
publicControlItemthis[intindex]
{
get
{
return(ControlItem)List[index];
}
set
{
List[index]=value;
}
}
publicControlItemCollection()
{
}
publicintAdd(ControlItemitem)
{
returnList.Add(item);
}
publicvoidRemove(ControlItemitem)
{
List.Remove(item);
}
}
}

//TantraConfig.cs
usingSystem;
usingSystem.IO;
usingSystem.Xml.Serialization;

namespaceXDF.TantraPlugIn
{
///<summary>
///TantraConfig的摘要说明。
///</summary>
[Serializable]
publicclassTantraConfig
{
privateControlItemCollectionm_KillControls=newControlItemCollection();
publicControlItemCollectionKillControls
{
get
{
returnthis.m_KillControls;
}
set
{
this.m_KillControls=value;
}
}
privateControlItemCollectionm_BloodControls=newControlItemCollection();
publicControlItemCollectionBloodControls
{
get
{
returnthis.m_BloodControls;
}
set
{
this.m_BloodControls=value;
}
}

privateintm_BloodRate=25;

publicintBloodRate
{
get
{
returnthis.m_BloodRate;
}
set
{
this.m_BloodRate=value;
}
}

privatestringm_ProcessName="HTLauncher";

publicstringProcessName
{
get
{
returnthis.m_ProcessName;
}
set
{
this.m_ProcessName=value;
}
}

publicTantraConfig()
{

}

publicboolSave(stringfile)
{
boolresult=false;
try
{
FileStreamfs=newFileStream(file,FileMode.Create,FileAccess.Write);
XmlSerializerxsl=newXmlSerializer(this.GetType());
xsl.Serialize(fs,this);
fs.Close();
result=true;
}
catch
{
result=false;
}
returnresult;
}
publicstaticTantraConfigLoadFromFile(stringfile)
{
TantraConfigconfig=null;
try
{
FileStreamfs=newFileStream(file,FileMode.Open,FileAccess.Read);
XmlSerializerxsl=newXmlSerializer(typeof(TantraConfig));
config=(TantraConfig)xsl.Deserialize(fs);
fs.Close();
}
catch
{

}
returnconfig;
}
}
}


//Frmmain.cs
usingSystem;
usingSystem.Drawing;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Windows.Forms;
usingSystem.Data;
usingSystem.Threading;

usingXDF.GamePlugInCommon;

namespaceXDF.TantraPlugIn
{
///<summary>
///Form1的摘要说明。
///</summary>
publicclassFrmmain:System.Windows.Forms.Form
{
privateSystem.Windows.Forms.ButtonbtnSetup;
privateSystem.Windows.Forms.TimertimerMain;
privateSystem.Windows.Forms.ButtonbtnStart;
privateSystem.ComponentModel.IContainercomponents;

publicFrmmain()
{
//
//Windows窗体设计器支持所必需的
//
InitializeComponent();


this.Closing+=newCancelEventHandler(Frmmain_Closing);
}

///<summary>
///清理所有正在使用的资源。
///</summary>
protectedoverridevoidDispose(booldisposing)
{
if(disposing)
{
if(components!=null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}

#regionWindows窗体设计器生成的代码
///<summary>
///设计器支持所需的方法-不要使用代码编辑器修改
///此方法的内容。
///</summary>
privatevoidInitializeComponent()
{
this.components=newSystem.ComponentModel.Container();
System.Resources.ResourceManagerresources=newSystem.Resources.ResourceManager(typeof(Frmmain));
this.btnStart=newSystem.Windows.Forms.Button();
this.btnSetup=newSystem.Windows.Forms.Button();
this.timerMain=newSystem.Windows.Forms.Timer(this.components);
this.SuspendLayout();
//
//btnStart
//
this.btnStart.Location=newSystem.Drawing.Point(8,16);
this.btnStart.Name="btnStart";
this.btnStart.Size=newSystem.Drawing.Size(65,22);
this.btnStart.TabIndex=0;
this.btnStart.Text="开始(&S)";
this.btnStart.Click+=newSystem.EventHandler(this.btnStart_Click);
//
//btnSetup
//
this.btnSetup.Location=newSystem.Drawing.Point(152,16);
this.btnSetup.Name="btnSetup";
this.btnSetup.Size=newSystem.Drawing.Size(65,22);
this.btnSetup.TabIndex=1;
this.btnSetup.Text="设置(&C)";
this.btnSetup.Click+=newSystem.EventHandler(this.btnSetup_Click);
//
//Frmmain
//
this.AutoScaleBaseSize=newSystem.Drawing.Size(6,14);
this.ClientSize=newSystem.Drawing.Size(226,55);
this.Controls.Add(this.btnSetup);
this.Controls.Add(this.btnStart);
this.FormBorderStyle=System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Icon=((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox=false;
this.MinimizeBox=false;
this.Name="Frmmain";
this.StartPosition=System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text="TantraPlugInbeta1";
this.ResumeLayout(false);

}
#endregion

///<summary>
///应用程序的主入口点。
///</summary>
[STAThread]
staticvoidMain()
{
Application.Run(newFrmmain());
}

privateTantraConfigm_TantraConfig=null;
privateThreadm_Thread=null;
privateboolm_Stop=true;
privateIntPtrm_GameMainWindowHandle=IntPtr.Zero;

privatevoidbtnSetup_Click(objectsender,System.EventArgse)
{
TantraConfigconfig=newTantraConfig();

ControlItemCollectionitems=config.KillControls;

ControlItemitem_e=newControlItem();
item_e.DelayTime=50;
item_e.KeyChar="E";
item_e.Name="选择最近的攻击目标";
items.Add(item_e);

ControlItemitem_r=newControlItem();
item_r.DelayTime=6000;
item_r.KeyChar="R";
item_r.Name="攻击选定的目标";
items.Add(item_r);

ControlItemitem_f=newControlItem();
item_f.DelayTime=500;
item_f.KeyChar="F";
item_f.Name="捡起打完怪物掉下的物品";
items.Add(item_f);

ControlItemitem_f2=newControlItem();
item_f2.DelayTime=500;
item_f2.KeyChar="F";
item_f2.Name="捡起打完怪物掉下的金币";
items.Add(item_f2);

ControlItemitem_blood=newControlItem();
item_blood.DelayTime=1000;
item_blood.KeyChar="1";
item_blood.Name="自动增加体能秘技";
config.BloodControls.Add(item_blood);

config.Save("c:\\tantra.xml");

}

privatevoidbtnStart_Click(objectsender,System.EventArgse)
{
if(this.m_Stop)
{
this.StartControl();
}
else
{
this.StopControl();
}
this.btnStart.Text=(this.m_Stop)?"开始(&S)":"停止(&S)";
}

privatevoidStartControl()
{
stringfile=Environment.CurrentDirectory+"\\tantra.xml";
this.m_TantraConfig=TantraConfig.LoadFromFile(file);
if(this.m_TantraConfig==null)
{
MessageBox.Show("配置文件未找到,无法启动!");
return;
}

//HTLauncher
//stringproname="TantraPlugIn";
System.Diagnostics.Processpro=API.GetGameProcess(this.m_TantraConfig.ProcessName);
if(pro==null)
{
MessageBox.Show("游戏进程"+this.m_TantraConfig.ProcessName+"未找到,无法启动!");
return;
}
this.m_GameMainWindowHandle=pro.MainWindowHandle;
this.Text="Gamename:"+pro.ProcessName;


this.m_Stop=false;
this.m_Thread=newThread(
newThreadStart(TantraControl));

this.m_Thread.Start();
}

privatevoidStopControl()
{
if(this.m_Thread!=null)
{
this.m_Stop=true;
this.m_Thread.Abort();
}
}

privatevoidTantraControl()
{
intcount=0;
while(!this.m_Stop)
{
for(inti=0;i<this.m_TantraConfig.KillControls.Count;i++)
{
API.SendMessage(this.m_GameMainWindowHandle,API.WM_KEYDOWN,
Convert.ToInt32(this.m_TantraConfig.KillControls[i].KeyChar),0);
Thread.Sleep(this.m_TantraConfig.KillControls[i].DelayTime);
}
count++;
if(count>=this.m_TantraConfig.BloodRate)
{
count=0;
for(inti=0;i<this.m_TantraConfig.BloodControls.Count;i++)
{
API.SendMessage(this.m_GameMainWindowHandle,API.WM_KEYDOWN,
Convert.ToInt32(this.m_TantraConfig.BloodControls[i].KeyChar),0);
Thread.Sleep(this.m_TantraConfig.BloodControls[i].DelayTime);
}
}
}
}

protectedoverridevoidWndProc(refMessagem)
{
base.WndProc(refm);
if(m.Msg==API.WM_KEYDOWN)
{
this.Text=m.WParam.ToInt32().ToString();
if(this.Text=="1")
{
MessageBox.Show("blood");
}
}
}

privatevoidFrmmain_Closing(objectsender,CancelEventArgse)
{
try
{
this.StopControl();
}
catch
{
}
}

}
}


附加我从12级开始外挂的配置文件

<?xmlversion="1.0"?>
<TantraConfigxmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<KillControls>
<ControlItem>
<Name>选择最近的攻击目标</Name>
<KeyChar>69</KeyChar>
<DelayTime>50</DelayTime>
</ControlItem>
<ControlItem>
<Name>攻击选定的目标</Name>
<KeyChar>82</KeyChar>
<DelayTime>5000</DelayTime>
</ControlItem>
<ControlItem>
<Name>捡起打完怪物掉下的物品</Name>
<KeyChar>70</KeyChar>
<DelayTime>500</DelayTime>
</ControlItem>
<ControlItem>
<Name>捡起打完怪物掉下的金币</Name>
<KeyChar>70</KeyChar>
<DelayTime>500</DelayTime>
</ControlItem>
</KillControls>
<BloodControls>
<ControlItem>
<Name>自动增加体能秘技</Name>
<KeyChar>49</KeyChar>
<DelayTime>1000</DelayTime>
</ControlItem>
</BloodControls>
<BloodRate>20</BloodRate>
<ProcessName>HTLauncher</ProcessName>
</TantraConfig>

今天发现的模拟键盘的操作,虽然我不能用上,希望有人会到。