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

Project1

 找回密码
 注册会员
搜索
查看: 4886|回复: 2
打印 上一主题 下一主题

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

[复制链接]

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42513
在线时间
7608 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

跳转到指定楼层
1
发表于 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

评分

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

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托

Lv2.观梦者

梦石
0
星屑
378
在线时间
27 小时
注册时间
2020-6-8
帖子
25
3
发表于 2020-6-11 02:21:38 | 只看该作者
orochi2k 发表于 2019-12-3 02:25
然而脚本文件本身的保护很脆弱,所以导致了这种验证方式会在脚本被爆破后曝光失效.
相对来说.... ...

可是 exe的话 (吡~~~~)一下就好了呀 小声比比
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
1
星屑
10145
在线时间
4436 小时
注册时间
2005-10-22
帖子
6969

开拓者贵宾

2
发表于 2019-12-3 02:25:14 | 只看该作者

然而脚本文件本身的保护很脆弱,所以导致了这种验证方式会在脚本被爆破后曝光失效.
相对来说....直接在EXE上用编译后的代码来判定的话....(继续邪恶地看着RGD(大雾))
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-4 03:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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