zoukankan      html  css  js  c++  java
  • 游戏如何限制程序多开

    • 1,进程

    现象:
    游戏通过探测游戏客户端进程是否已经存在来防止重复打开。

    破解方法:
    (1)隐藏进程。可以用工具 HideToolz,也可以自己写驱动简单的做个摘链隐藏。
    (2)hook 游戏遍历进程的 api。

    CreateToolhelp32Snapshot()、Process32First()和Process32Next()
    EnumProcesses()、EnumProcessModules()、GetModuleBaseName()
    ZwQuerySystemInformation
    WTSOpenServer()、WTSEnumerateProcess()
    (3)修改进程名。拷贝一份游戏 exe 文件的副本,重命名即可。

    • 2,窗口标题

    现象:
    游戏通过探测游戏客户端的窗口是否已经存在来防止重复打开。

    破解方法:
    (1)使用 SetWindowText 修改窗口标题,可以自己调用或 hook 游戏的都可以。
    (2)hook 游戏的 FindWindow ,不让其获取其他游戏的窗口句柄。
    (3)hook 游戏的 EnumWindows ,不让其遍历窗口。

    • 3,端口

    现象:
    游戏通过默认打开TCP或者UDP端口监听。

    破解方法:
    端口隐藏(端口复用)

    • 4,独占文件、公共文件
      现象(公共):游戏启动后会以独占方式打开某个文件的(lockfile)文件句柄,当第二次再有程序打开它时就会报错。
      现象(独占):游戏启动后用刀的所有文件(dll,ini 等)都使用独占方式打开,当第二次再有程序打开它时就会报错。

    破解方法:
    (1)hook 游戏的 OpenFileMapping,拷贝一份独占文件副本并重命名,让他获取文件副本的句柄而不是原文件句柄。
    (2)循环遍历游戏的句柄表,删除指定的 File 类型的句柄

    • 5,多个操作系统账号
      现象:游戏通过限制一个用户只能打开一个游戏来防止重复打开。

    破解方法:
    创建多个系统账号后,Shift + 右键 ,以其他身份运行。

    • 6,互斥体
      现象:游戏只能单开,通过互斥对象/信号量/事件等线程同步对象来确定程序是否已经运行。

    破解方法:
    (1)Hook 对应创建互斥体的 API
    (2)循环遍历游戏句柄表,删除对应的句柄

    • 7,内存映射文件
      现象:游戏只能开2个、3个等。而不是只能开1个,通过把程序实例信息放到跨进程的内存映射文件中,防止游戏多开。

    破解方法:
    (1)Hook CreateFileMapping 、OpenFileMapping
    (2)循环遍历游戏句柄表,删除对应的句柄

    • 8,DLL全局共享变量
      现象:游戏只能开2个、3个等。而不是只能开1个 ,DLL全局共享区在映射到各个进程的地址空间时仅被初始化一次,且是在第一次被windows加载时,所以利用该区数据就能对程序进行多开限制。

    破解方法:
    (1)找到共享区段的位置,使用 PE 工具删除这个区段。
    (2)使用 ce 找到存放游戏实例的基地址,每当启动一个实例后,使用 WriteProcessMemory 修改这个值。

    • 9,Mac地址验证
      现象:游戏只能开2个、3个等。而不是只能开1个 ,登陆服务器时,获取本机mac地址,发送至服务器端,服务端进行mac地址验证,如果mac地址重复登陆,则不允许同服务器进行消息传递。

    破解方法:
    (1)hook 游戏获取 mac 的 api ,让每个游戏获取不同的 mac 地址。注意游戏可能会多次获取 mac ,所以不要将 mac 完全随机,避免第一次获取的 mac 和第二次获取的 mac 不一样,这就很尴尬。处理方法是 dll 注入时初始化一个随机 mac ,之后 hook 时都使用这个 mac 来伪造。
    (2)定时修改本机mac 。这种情况有一个缺陷,就是必须把时钟设置的很小,因为游戏不一定只有登录时才校验 mac ,如果游戏对 mac 做循环校验,就必须保证在打开的 n 个游戏的 n 个循环中 ,都修改一次 mac 。也就是说,打开的客户端也多,修改本机mac 的时钟就要设置的越小,且不能保证某一时刻客户端 a 和 客户端 b 获取到的mac 是相同的 !

    • 10,查看网络连接
      现象:获取本机所有网络连接,使用 GetTcpTable 获取 TCP 连接,使用 GetUdpTable 获取 UDP 连接,检查是否有连接到服务器IP和端口号的连接,如果有,表示程序已经启动,否则程序未启动。

    破解方法:
    hook GetTcpTable 、GetUdpTable


    许可协议: 文章中的代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章【均为原创】作品,转载请务必【添加出处】,您添加出处是我创作的动力!
  • 相关阅读:
    java锁类型
    Java线程池
    1 Navicat12 过期了怎么办
    N1-二维数组查找
    SQL-59 按照salary的累计和running_total,其中running_total为前两个员工的salary累计和,其他以此类推。
    SQL-58 获取有奖金的员工相关信息。
    SQL-57 使用含有关键字exists查找未分配具体部门的员工的所有信息。
    SQL-56 获取所有员工的emp_no、部门编号dept_no以及对应的bonus类型btype和recevied,没有分配具体的员工不显示
    SQL-55 分页查询employees表,每5行一页,返回第2页的数据
    SQL-54 查找排除当前最大、最小salary之后的员工的平均工资avg_salary。
  • 原文地址:https://www.cnblogs.com/LyShark/p/15019139.html
Copyright © 2011-2022 走看看