设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 244|回复: 1

[原创发布] 【RGSS保护手段】校验dll文件

[复制链接]

[动态]受到alanjpqr的挑战,成功击败了对方。 (打开TA的战斗卡片)

Lv4.逐梦者 (管理员)

老黄鸡

梦石
0
星屑
14228
在线时间
6311 小时
注册时间
2009-7-6
帖子
12863

开拓者贵宾

发表于 2019-4-22 04:48:07 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
心血来潮产物
推荐在steam上发布RM游戏的同伴使用

当资源文件已经得到足够强度的保护时,保护steam的dll文件之类的第三方模块就变得十分重要
steam里有一部分API可以确保游戏在正版环境下运行,然而由于dll本身没有加密,并且强度极低的
原因,破解者始终可以通过简单地更改dll文件来使游戏脱离steam运行

虽说联网校验的强度更高,但是成本也更高,所以有了这么个玩意儿诞生
下面脚本提供的方法可以获得特定dll(已载入)的校验值(内存)
在合理的时机检查是否与预期校验值相同可以确保调用的DLL API没有被篡改
(即使在内存中篡改也无法传播)

简单地使用范例写在了最下方,最后提一下,这个脚本并不能保护你的游戏资源
它只有在本身不能被轻易篡改的情况下发挥自己的作用

RUBY 代码复制打印
  1. module Fux2
  2. #~   获取指定模块的校验值
  3. #~   用于确保模块符合预期
  4. #~   使用Fux2::SteamTools.get_dll_checksum(moduleName)获取模块校验值
  5. #~   注意:无法正确对加密、自解压模块生效
  6. #~   by Fux2
  7. #~   欢迎访问 [url]https://rpg.blue/[/url] 获取更多资源
  8.   module SteamTools
  9.  
  10.     GetModuleHandle = Win32API.new('kernel32','GetModuleHandle','p','l')
  11.     WriteProcessMemoryR = Win32API.new('kernel32','WriteProcessMemory','lplll','i')
  12.  
  13.     def self.get_dll_checksum(fn)
  14.       dll = GetModuleHandle.call(fn)
  15.       return 0 if dll==0
  16.       buffer = "\0"*2
  17.       WriteProcessMemoryR.call(-1,buffer,dll,2,0)
  18.       return 0 if buffer != "MZ"
  19.       buffer = "\0"*4
  20.       WriteProcessMemoryR.call(-1,buffer,dll+0x3C,4,0)
  21.       offset = buffer.unpack("L").first
  22.       WriteProcessMemoryR.call(-1,buffer,dll+offset,4,0)
  23.       sign = buffer.unpack("L").first
  24.       return 0 if sign != 0x4550
  25.       WriteProcessMemoryR.call(-1,buffer,dll+offset+0x2C,4,0)
  26.       base = buffer.unpack("L").first
  27.       WriteProcessMemoryR.call(-1,buffer,dll+offset+0x1C,4,0)
  28.       size = buffer.unpack("L").first / 4 * 4
  29.       code = "\0" * size
  30.       WriteProcessMemoryR.call(-1,code,dll+base,size,0)
  31.       code = code.unpack("C*")
  32.       buffer = "\0" * 8
  33.       WriteProcessMemoryR.call(-1,buffer,dll+offset+0xA0,8,0)
  34.       vad,vas = *buffer.unpack("L*")
  35.       reloadaddr = dll+vad
  36.       endAddr = base+size
  37.       loop do
  38.         WriteProcessMemoryR.call(-1,buffer,reloadaddr,8,0)
  39.         rad,ras = *buffer.unpack("L*")
  40.         break if ras == 0
  41.         if rad+ras>=base && rad<reloadaddr
  42.           count = ras-8
  43.           sbuffer = "\0"*count
  44.           WriteProcessMemoryR.call(-1,sbuffer,reloadaddr+8,count,0)
  45.           sbuffer.unpack("S*").each do |byte|
  46.             type = byte & 0xF000 >> 12
  47.             ofs = byte & 0xFFF
  48.             index = rad+ofs-base
  49.             break if index<0 || index>=size
  50.             code[index,4] = [0,0,0,0]
  51.           end
  52.         end
  53.         reloadaddr += ras
  54.       end
  55.       return code.inject(:+)
  56.     end
  57.   end
  58.  
  59. end
  60. # sum = Fux2::SteamTools.get_dll_checksum("steam_api.dll")
  61. # raise 'Illegal DLL file detected' unless sum==12800700

评分

参与人数 3+3 收起 理由
RMVXA + 1 精品文章
guoxiaomi + 1 塞糖
SixRC + 1 学习

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
长期合作请联系QQ1213237796(暂停)
定制RM全系列脚本,黑科技,请联系QQ349570812(暂停)。
不接受私人问题咨询
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-8-17 19:06

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表