C#游戏外挂代码

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

XDF.GamePlugInCommon 类库项目

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

using System;
using System.IO;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace XDF.GamePlugInCommon
{
/// <summary>
/// API 的摘要说明。
/// </summary>
public sealed class API
{
public static int WM_KEYDOWN = 0x0100;
public static int WM_KEYUP = 0x0101;
public static int WM_SYSKEYDOWN = 0x0104;
public static int WM_SYSKEYUP = 0x0105;

public static int WM_MOUSEMOVE = 0x0200;
public static int WM_LBUTTONDOWN = 0x0201;
public static int WM_LBUTTONUP = 0x0202;
public static int WM_LBUTTONDBLCLK = 0x0203;
public static int WM_RBUTTONDOWN = 0x0204;
public static int WM_RBUTTONUP = 0x0205;
public static int WM_RBUTTONDBLCLK = 0x0206;
public static int WM_USER = 0x0400;

public static int MK_LBUTTON = 0x0001;
public static int MK_RBUTTON = 0x0002;
public static int MK_SHIFT = 0x0004;
public static int MK_CONTROL = 0x0008;
public static int MK_MBUTTON = 0x0010;

public static int MK_XBUTTON1 = 0x0020;
public static int MK_XBUTTON2 = 0x0040;

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd,int Msg,int wParam,int lParam);

//此处主要用来让窗口置于最前(SetWindowPos(this.Handle,-1,0,0,0,0,0x4000|0x0001|0x0002);)
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd,
int hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
int uFlags
);

/// <summary>
/// 窗口置前
/// </summary>
/// <param name="hWnd"></param>
public static void SetWindowPos(IntPtr hWnd)
{
SetWindowPos(hWnd,-1,0,0,0,0,0x4000|0x0001|0x0002);
}

/// <summary>
///
/// </summary>
/// <param name="processName"></param>
/// <returns></returns>
public static Process GetGameProcess(string processName)
{
Process pro = null;
Process[] pros = Process.GetProcessesByName(processName);
if(pros.Length > 0)
{
pro = pros[0];
}
return pro;
}
}
}


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

namespace XDF.TantraPlugIn
{
/// <summary>
/// ControlItem 的摘要说明。
/// </summary>
[Serializable]
public sealed class ControlItem
{
private string m_Name = "";
public string Name
{
get
{
return this.m_Name;
}
set
{
this.m_Name = value;
}
}
private char m_KeyChar = 'a';
public char KeyChar
{
get
{
return this.m_KeyChar;
}
set
{
this.m_KeyChar = value;
}
}
private int m_DelayTime = 100;
public int DelayTime
{
get
{
return this.m_DelayTime;
}
set
{
this.m_DelayTime = value;
}
}
public ControlItem()
{

}
}
[Serializable]
public sealed class ControlItemCollection : System.Collections.CollectionBase
{
public ControlItem this[int index]
{
get
{
return (ControlItem)List[index];
}
set
{
List[index] = value;
}
}
public ControlItemCollection()
{
}
public int Add(ControlItem item)
{
return List.Add(item);
}
public void Remove(ControlItem item)
{
List.Remove(item);
}
}
}

//TantraConfig.cs
using System;
using System.IO;
using System.Xml.Serialization;

namespace XDF.TantraPlugIn
{
/// <summary>
/// TantraConfig 的摘要说明。
/// </summary>
[Serializable]
public class TantraConfig
{
private ControlItemCollection m_KillControls = new ControlItemCollection();
public ControlItemCollection KillControls
{
get
{
return this.m_KillControls;
}
set
{
this.m_KillControls = value;
}
}
private ControlItemCollection m_BloodControls = new ControlItemCollection();
public ControlItemCollection BloodControls
{
get
{
return this.m_BloodControls;
}
set
{
this.m_BloodControls = value;
}
}

private int m_BloodRate = 25;

public int BloodRate
{
get
{
return this.m_BloodRate;
}
set
{
this.m_BloodRate = value;
}
}

private string m_ProcessName = "HTLauncher";

public string ProcessName
{
get
{
return this.m_ProcessName;
}
set
{
this.m_ProcessName = value;
}
}

public TantraConfig()
{

}

public bool Save(string file)
{
bool result = false;
try
{
FileStream fs = new FileStream(file,FileMode.Create,FileAccess.Write);
XmlSerializer xsl = new XmlSerializer(this.GetType());
xsl.Serialize(fs,this);
fs.Close();
result = true;
}
catch
{
result = false;
}
return result;
}
public static TantraConfig LoadFromFile(string file)
{
TantraConfig config = null;
try
{
FileStream fs = new FileStream(file,FileMode.Open,FileAccess.Read);
XmlSerializer xsl = new XmlSerializer(typeof(TantraConfig));
config = (TantraConfig)xsl.Deserialize(fs);
fs.Close();
}
catch
{

}
return config;
}
}
}


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

using XDF.GamePlugInCommon;

namespace XDF.TantraPlugIn
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Frmmain : System.Windows.Forms.Form
{
private System.Windows.Forms.Button btnSetup;
private System.Windows.Forms.Timer timerMain;
private System.Windows.Forms.Button btnStart;
private System.ComponentModel.IContainer components;

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


this.Closing +=new CancelEventHandler(Frmmain_Closing);
}

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

#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Frmmain));
this.btnStart = new System.Windows.Forms.Button();
this.btnSetup = new System.Windows.Forms.Button();
this.timerMain = new System.Windows.Forms.Timer(this.components);
this.SuspendLayout();
//
// btnStart
//
this.btnStart.Location = new System.Drawing.Point(8, 16);
this.btnStart.Name = "btnStart";
this.btnStart.Size = new System.Drawing.Size(65, 22);
this.btnStart.TabIndex = 0;
this.btnStart.Text = "开始(&S)";
this.btnStart.Click += new System.EventHandler(this.btnStart_Click);
//
// btnSetup
//
this.btnSetup.Location = new System.Drawing.Point(152, 16);
this.btnSetup.Name = "btnSetup";
this.btnSetup.Size = new System.Drawing.Size(65, 22);
this.btnSetup.TabIndex = 1;
this.btnSetup.Text = "设置(&C)";
this.btnSetup.Click += new System.EventHandler(this.btnSetup_Click);
//
// Frmmain
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.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 = "Tantra PlugIn beta1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Frmmain());
}

private TantraConfig m_TantraConfig = null;
private Thread m_Thread = null;
private bool m_Stop = true;
private IntPtr m_GameMainWindowHandle = IntPtr.Zero;

private void btnSetup_Click(object sender, System.EventArgs e)
{
TantraConfig config = new TantraConfig();

ControlItemCollection items = config.KillControls;

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

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

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

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

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

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

}

private void btnStart_Click(object sender, System.EventArgs e)
{
if(this.m_Stop)
{
this.StartControl();
}
else
{
this.StopControl();
}
this.btnStart.Text = (this.m_Stop)?"开始(&S)":"停止(&S)";
}

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

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


this.m_Stop = false;
this.m_Thread = new Thread(
new ThreadStart(TantraControl));

this.m_Thread.Start();
}

private void StopControl()
{
if(this.m_Thread != null)
{
this.m_Stop = true;
this.m_Thread.Abort();
}
}

private void TantraControl()
{
int count = 0;
while(!this.m_Stop)
{
for(int i=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(int i=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);
}
}
}
}

protected override void WndProc(ref Message m)
{
base.WndProc (ref m);
if(m.Msg == API.WM_KEYDOWN)
{
this.Text = m.WParam.ToInt32().ToString();
if(this.Text == "1")
{
MessageBox.Show("blood");
}
}
}

private void Frmmain_Closing(object sender, CancelEventArgs e)
{
try
{
this.StopControl();
}
catch
{
}
}

}
}

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

<?xml version="1.0"?>
<TantraConfig xmlns: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>

今天发现的模拟键盘的操作,虽然我不能用上,希望有人会到。
C# 实现按键精灵 记录录制键盘鼠标 非常实用的键盘鼠标脚本录制工具,通过它你可以轻松地进行脚本录制,简单易用,不需要任何编程知识就能做出功能强大的脚本,只要你在电脑前用双手可以完成的动作,都可以替你完成。 阅读详情

相关推荐

网页游戏外挂的设计与编写:QQ摩天大楼【一】(基本技术)

网页游戏外挂的编写很简单,不需要研究其源代码,不需要懂得汇编知识,只需要分析发送到服务器和服务器发送到本地的数据包就可以写出来。 但是如果你想尽快分析数据包中的内容并得到结果,那么你可能还需要研究一下源代码。 如果游戏是Flash做的,那么你需要下载一个Flash反编译软件,有的反编译软件像ASV 6.0提供搜索IE Cache的功能,网页游戏的Flash文件就保存在I...

weixin_34034670的博客 7090

c#开发同步器及Android模拟器游戏辅助

  通过对模拟器命令行的调用熟悉模拟器的开发;通过同步器开发来熟悉键鼠钩子、线程、队列、方法延迟执行的包装、大漠插件、防多开行为检测等功能;通过游戏辅助的开发来熟悉多线程、找图、随机点击、复杂结构下游戏辅助开发的处理、游戏动画和事件执行时间同步问题的解决等

美服疯狂坦克辅助瞄准外挂C#版开发(四)程序使用说明和完成源代码及其下载

到现在为止,我们已经将疯狂坦克外挂所需相关的功能点及解决方案完成。先说说常规的使用方法:1、编译发布程序后,先运行程序(默认不可见),然后进入美服疯狂坦克。2、在游戏中按(Pause)键启动各种辅助线。3、在游戏中按(Scroll Lock)键切换你当前所用的坦克。4、在游戏中鼠标放到你坦克所在的位置(小地图上圆点中心),按下(PrScrn SysRq)键确定曲线起点。5、

ZXSDN 7872

C#写了一个游戏外挂[转发]

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

weixin_34392843的博客 817

游戏外挂开发实战:用C#和Cheat Engine读取内存实现自动补血(附完整代码)

本文详细介绍了如何使用C#和Cheat Engine进行游戏内存数据解析与自动化操作,重点讲解了读取内存的技术实现。通过基址定位、进程间通信和自动化响应系统设计,开发者可以安全合法地实现游戏自动补血功能。文章包含完整代码示例,适合技术爱好者学习游戏逆向工程基础。

weixin_30772105的博客 445

C#游戏辅助制作教程

现在我们开始 1,打开游戏 三目童子 开启修改器CE以及退出360. 2,要是用过这个修改器的就不用看了 没用过的先教会你们怎么用,这个是很重要的 选择程序,按打开,大家可以看到 有6格子血量 我们搜索6 按字节来搜索 3,大家看到了 这里再次搜索 减少为4 就剩下一个地址了 那么就是他了 4,添加到程序下面 我们可以修改试试 我们记下内存地址:013B0092 我们看到了,修改了该地址 血条也变化了 那么 但道理来说我们已经成功了 为什么需要用C#自己在写呢 **注意了:这里的内存地址013B0092 只是一个动态的内存地址,什么意思呢? 黑色的表示 等下次再开游戏或者在其他计算机上时会不停变化,这些地址叫做动态地址。 等下次开游戏 或者 复制 机子重启的时候会变化 这样太麻烦 演示 我们重开了游戏,但是该内存的值变了 存放的并不是血量的值了。 看到了 这一次变为了011B169E此地址存放血量了 所以我们要的是基址。。固定不变 为什么是不变的 有个公式的 从数学来讲,很简单的 我们已知动态地址 ,只要知道偏移量 做偏移就可以知道基址了。 第一段视频就录制到这里 我第一次录视频给别人看 有点紧张 字都打错了好多- -见谅大家。

c#做外挂

[-] [csharp] view plaincopyprint? 第一课:C#使用WINDOW API和对内存的操作。   这一课是些简单的东西,了解的可以直接越过。考虑到大多数使用c#的人都是做网站的,可能没有机会接触这些,所以我在这里做一下粗略的介绍。     step 1:认识WINAPI     windows系统里提供了很多的函数,我们如果做外挂

665

C# findwindow及sendmessage外挂

c# 利用findwindow及sendmessage外挂,也可以程序间通信。但是本代码主要演示外挂方式。

c#做外挂 step by step(更新至step3:注入)

做外挂我也是现学的。可以说写的这个教程是现学现卖,希望对用C#的外挂爱好者能有点帮助。 本教程中有一些以“ 废话 ”字样标注的内容,赶时间的可以直接越过。 第一课:C#使用WINDOW API和对内存的操作。 这一课是些简单的东西,了解的可以直接越过。考虑到大多数使用c#的人都是做网站的,可能没有机会接触这些,所以我在这里做一下粗略的介绍。 step 1:认识WINAPI...

anzhi6114的博客 411

从稳压管到LDO芯片:一张图看懂线性电源的‘内卷’进化史

本文追溯了从稳压管到LDO芯片的线性电源技术进化历程,详细解析了各阶段的技术突破与局限。重点探讨了现代LDO在超低功耗、高精度控制等方面的创新,并提供了实战选型的黄金法则,帮助工程师在电子设备小型化与低功耗化趋势中做出最优选择。

weixin_42525551的博客 205

在 CentOS7 下安装 Cadence IC验证平台 INCISIVE152

前言 本文所使用的软件 虚拟机软件:VMware Workstation 15 PRO 如何安装? 操作系统:CentOS-7, CentOS-7-x86_64-DVD-1810.iso 如何安装? 简介 INCISIVE Incisive是nc_verilog, nc_sim, nc_lauch,以及ABV,TBV的集合,用于仿真和验证。 InstallScape InstallSc...

沈醉不知的博客 2万+

C#做外挂

第一课:C#使用WINDOW API和对内存的操作。 这一课是些简单的东西,了解的可以直接越过。考虑到大多数使用c#的人都是做网站的,可能没有机会接触这些,所以我在这里做一下粗略的介绍。 step 1:认识WINAPI windows系统里提供了很多的函数,我们如果做外挂的话,就需要用到其中的函数(以下简称API)。(废话:这些API被封装在系统路径下的DLL文件里。事实上,我们不用关...

weixin_30379531的博客 170

Synopsys安装教程Ubuntu22.04版本

在Ubuntu22版本上安装Synopsys等系列工具,安装DC,VCS等等

qq_59529218的博客 5724

c#做外挂 step by step

第一课:C#使用WINDOW API和对内存的操作。这一课是些简单的东西,了解的可以直接越过。考虑到大多数使用c#的人都是做网站的,可能没有机会接触这些,所以我在这里做一下粗略的介绍。step 1:认识WINAPI    windows系统里提供了很多的函数,我们如果做外挂的话,就需要用到其中的函数(以下简称API)。(废话:这些API被封装在系统路径下的DLL文件里。事实上,我们不用关心它在哪,

1704

LLM and Embedding区别

LLM(大语言模型)和 Embedding(嵌入)是自然语言处理(NLP)中的两个核心概念,它们的核心区别在于。Embedding 计算向量。

u010674101的专栏 1874

工程级 RK3588 YOLOv5 Android 架构拆解:NPU 量化优化 + 多线程推理 + 跟踪算法源码

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

LXY_LOVE36的博客 128

123456

C#版QQ连连看外挂最新版(代码改进, C#版QQ连连看外挂最新版(代码改进, C#版QQ连连看外挂最新版(代码改进,

qq261819814的专栏 251

国科大学习资料--计算机网络--历年考题1

国科大学习资料–计算机网络–历年考题1 1、假定有一个通信协议,每个分组都引入100字节的开销用于头和成帧,现在使用这个协议发送1M字节的数据(为方便计算,1M=10^6),然而在传递的过程中有一个字节被破坏了,因而包含该字节的那个分组被丢弃并重传。(1)当数据的分组大小为1000、5000、20000和40000字节时,计算相应(包括开销)的传递字节总数目。(2)计算分组大小的最优值是多少,即分组的大小为何值时总的传输字节数最少。(提示:最优值不是1000、5000、20000和40000字节中的一个)

无名何许人的博客 1181

C#编写QQ找茬外挂

QQ找茬外挂,用C#代码编写。使用方法 这个工具的主要运行流程很简单:游戏截图-》比较图片-》标记图片不同点。实现代码 截图的处理类ScreenCapture: /// /// 提供全屏和指定窗口的截图 以及保存为文件的类 /// public class ScreenCapture { /// /// 全屏截图 /// /// public Image ...

weixin_30756499的博客 352

倍福--手动加入第三方伺服的配置

客户在没有硬件情况下,希望手动配置硬件,添加第三方驱动器,本文介绍其操作流程 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 操作步骤 3 2.1. 添加电机XML文件 3 2.2. 创建EtherCAT 3 2.3. 添加新建项 3 2.4. 选择型号 4 2.5. 关联NC轴 5 软硬件版本 1.1. 倍福Beckhoff 1.1.1. 控制器硬件 TwinCAT控制制器,PC或者EPC,包括: 嵌入式控制器:CX5020-

weixin_41883890的博客 5325

如何使用Google Maps API爬取地理数据:详细教程与Python实现

Google Maps API 是一组服务的集合,允许开发者访问地图、地点、路线等地理信息。:将地址转换为地理坐标,或将地理坐标转换为地址。:计算两点之间的行车路线、步行路线等。Places API:获取附近的地点、商店、餐馆等。:计算多个地点之间的距离和时间。在接下来的代码中,我们将结合这些 API,展示如何获取并处理地理数据。本文详细介绍了如何使用 Google Maps API 获取地理数据,涵盖了从地址转经纬度、获取地点详情、计算路线、计算多个地点的距离与时间等多个功能。

2201_76125261的博客 733

C#简易外挂制作

游戏脚本分为很多种类型,例如本地客户端的内存修改、远程服务器的封包破解。一般的网游由于服务器的机能限制,并不会将游戏产生的所有数据、计算都提供给服务器来承担。经常的,服务器只会将玩家人物的属性、血量、加点、金钱、装备等重要信息储存在服务器本地,计算结果和数据传递则是通过加密封包来和客户端传输。因此网游如果封包被破解而被用户发送伪造的封包数据将造成非常严重的后果。

烧饼的博客 1534

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: Win32基础窗口框架代码
下一篇: 开源的游戏、3D开发引擎
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值