现象: 游戏通过探测游戏客户端进程是否已经存在来防止重复打开。
破解方法: (1)隐藏进程。可以用工具 HideToolz,也可以自己写驱动简单的做个摘链隐藏。 (2)hook 游戏遍历进程的 api。
CreateToolhelp32Snapshot()、Process32First()和Process32Next() EnumProcesses()、EnumProcessModules()、GetModuleBaseName() ZwQuerySystemInformation WTSOpenServer()、WTSEnumerateProcess() (3)修改进程名。拷贝一份游戏 exe 文件的副本,重命名即可。
现象: 游戏通过探测游戏客户端的窗口是否已经存在来防止重复打开。
破解方法: (1)使用 SetWindowText 修改窗口标题,可以自己调用或 hook 游戏的都可以。 (2)hook 游戏的 FindWindow ,不让其获取其他游戏的窗口句柄。 (3)hook 游戏的 EnumWindows ,不让其遍历窗口。
现象: 游戏通过默认打开TCP或者UDP端口监听。
破解方法: 端口隐藏(端口复用)
现象(公共):游戏启动后会以独占方式打开某个文件的(lockfile)文件句柄,当第二次再有程序打开它时就会报错。 现象(独占):游戏启动后用刀的所有文件(dll,ini 等)都使用独占方式打开,当第二次再有程序打开它时就会报错。
破解方法: (1)hook 游戏的 OpenFileMapping,拷贝一份独占文件副本并重命名,让他获取文件副本的句柄而不是原文件句柄。 (2)循环遍历游戏的句柄表,删除指定的 File 类型的句柄
现象:游戏通过限制一个用户只能打开一个游戏来防止重复打开。
破解方法: 创建多个系统账号后,Shift + 右键 ,以其他身份运行。
现象:游戏只能单开,通过互斥对象/信号量/事件等线程同步对象来确定程序是否已经运行。
破解方法: (1)Hook 对应创建互斥体的 API (2)循环遍历游戏句柄表,删除对应的句柄
现象:游戏只能开2个、3个等。而不是只能开1个,通过把程序实例信息放到跨进程的内存映射文件中,防止游戏多开。
破解方法: (1)Hook CreateFileMapping 、OpenFileMapping (2)循环遍历游戏句柄表,删除对应的句柄
现象:游戏只能开2个、3个等。而不是只能开1个 ,DLL全局共享区在映射到各个进程的地址空间时仅被初始化一次,且是在第一次被windows加载时,所以利用该区数据就能对程序进行多开限制。
破解方法: (1)找到共享区段的位置,使用 PE 工具删除这个区段。 (2)使用 ce 找到存放游戏实例的基地址,每当启动一个实例后,使用 WriteProcessMemory 修改这个值。
现象:游戏只能开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 是相同的 !
现象:获取本机所有网络连接,使用 GetTcpTable 获取 TCP 连接,使用 GetUdpTable 获取 UDP 连接,检查是否有连接到服务器IP和端口号的连接,如果有,表示程序已经启动,否则程序未启动。
破解方法: hook GetTcpTable 、GetUdpTable