赞 | 451 |
VIP | 56 |
好人卡 | 75 |
积分 | 424 |
经验 | 124650 |
最后登录 | 2024-11-21 |
在线时间 | 7601 小时 |
Lv5.捕梦者 (管理员) 老黄鸡
- 梦石
- 0
- 星屑
- 42387
- 在线时间
- 7601 小时
- 注册时间
- 2009-7-6
- 帖子
- 13506
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
心血来潮产物
推荐在steam上发布RM游戏的同伴使用
当资源文件已经得到足够强度的保护时,保护steam的dll文件之类的第三方模块就变得十分重要
steam里有一部分API可以确保游戏在正版环境下运行,然而由于dll本身没有加密,并且强度极低的
原因,破解者始终可以通过简单地更改dll文件来使游戏脱离steam运行
虽说联网校验的强度更高,但是成本也更高,所以有了这么个玩意儿诞生
下面脚本提供的方法可以获得特定dll(已载入)的校验值(内存)
在合理的时机检查是否与预期校验值相同可以确保调用的DLL API没有被篡改
(即使在内存中篡改也无法传播)
简单地使用范例写在了最下方,最后提一下,这个脚本并不能保护你的游戏资源
它只有在本身不能被轻易篡改的情况下发挥自己的作用
module Fux2 #~ 获取指定模块的校验值 #~ 用于确保模块符合预期 #~ 使用Fux2::SteamTools.get_dll_checksum(moduleName)获取模块校验值 #~ 注意:无法正确对加密、自解压模块生效 #~ by Fux2 #~ 欢迎访问 [url]https://rpg.blue/[/url] 获取更多资源 module SteamTools GetModuleHandle = Win32API.new('kernel32','GetModuleHandle','p','l') WriteProcessMemoryR = Win32API.new('kernel32','WriteProcessMemory','lplll','i') def self.get_dll_checksum(fn) dll = GetModuleHandle.call(fn) return 0 if dll==0 buffer = "\0"*2 WriteProcessMemoryR.call(-1,buffer,dll,2,0) return 0 if buffer != "MZ" buffer = "\0"*4 WriteProcessMemoryR.call(-1,buffer,dll+0x3C,4,0) offset = buffer.unpack("L").first WriteProcessMemoryR.call(-1,buffer,dll+offset,4,0) sign = buffer.unpack("L").first return 0 if sign != 0x4550 WriteProcessMemoryR.call(-1,buffer,dll+offset+0x2C,4,0) base = buffer.unpack("L").first WriteProcessMemoryR.call(-1,buffer,dll+offset+0x1C,4,0) size = buffer.unpack("L").first / 4 * 4 code = "\0" * size WriteProcessMemoryR.call(-1,code,dll+base,size,0) code = code.unpack("C*") buffer = "\0" * 8 WriteProcessMemoryR.call(-1,buffer,dll+offset+0xA0,8,0) vad,vas = *buffer.unpack("L*") reloadaddr = dll+vad endAddr = base+size loop do WriteProcessMemoryR.call(-1,buffer,reloadaddr,8,0) rad,ras = *buffer.unpack("L*") break if ras == 0 if rad+ras>=base && rad<reloadaddr count = ras-8 sbuffer = "\0"*count WriteProcessMemoryR.call(-1,sbuffer,reloadaddr+8,count,0) sbuffer.unpack("S*").each do |byte| type = byte & 0xF000 >> 12 ofs = byte & 0xFFF index = rad+ofs-base break if index<0 || index>=size code[index,4] = [0,0,0,0] end end reloadaddr += ras end return code.inject(:+) end end end # sum = Fux2::SteamTools.get_dll_checksum("steam_api.dll") # raise 'Illegal DLL file detected' unless sum==12800700
module Fux2
#~ 获取指定模块的校验值
#~ 用于确保模块符合预期
#~ 使用Fux2::SteamTools.get_dll_checksum(moduleName)获取模块校验值
#~ 注意:无法正确对加密、自解压模块生效
#~ by Fux2
#~ 欢迎访问 [url]https://rpg.blue/[/url] 获取更多资源
module SteamTools
GetModuleHandle = Win32API.new('kernel32','GetModuleHandle','p','l')
WriteProcessMemoryR = Win32API.new('kernel32','WriteProcessMemory','lplll','i')
def self.get_dll_checksum(fn)
dll = GetModuleHandle.call(fn)
return 0 if dll==0
buffer = "\0"*2
WriteProcessMemoryR.call(-1,buffer,dll,2,0)
return 0 if buffer != "MZ"
buffer = "\0"*4
WriteProcessMemoryR.call(-1,buffer,dll+0x3C,4,0)
offset = buffer.unpack("L").first
WriteProcessMemoryR.call(-1,buffer,dll+offset,4,0)
sign = buffer.unpack("L").first
return 0 if sign != 0x4550
WriteProcessMemoryR.call(-1,buffer,dll+offset+0x2C,4,0)
base = buffer.unpack("L").first
WriteProcessMemoryR.call(-1,buffer,dll+offset+0x1C,4,0)
size = buffer.unpack("L").first / 4 * 4
code = "\0" * size
WriteProcessMemoryR.call(-1,code,dll+base,size,0)
code = code.unpack("C*")
buffer = "\0" * 8
WriteProcessMemoryR.call(-1,buffer,dll+offset+0xA0,8,0)
vad,vas = *buffer.unpack("L*")
reloadaddr = dll+vad
endAddr = base+size
loop do
WriteProcessMemoryR.call(-1,buffer,reloadaddr,8,0)
rad,ras = *buffer.unpack("L*")
break if ras == 0
if rad+ras>=base && rad<reloadaddr
count = ras-8
sbuffer = "\0"*count
WriteProcessMemoryR.call(-1,sbuffer,reloadaddr+8,count,0)
sbuffer.unpack("S*").each do |byte|
type = byte & 0xF000 >> 12
ofs = byte & 0xFFF
index = rad+ofs-base
break if index<0 || index>=size
code[index,4] = [0,0,0,0]
end
end
reloadaddr += ras
end
return code.inject(:+)
end
end
end
# sum = Fux2::SteamTools.get_dll_checksum("steam_api.dll")
# raise 'Illegal DLL file detected' unless sum==12800700
|
评分
-
查看全部评分
|