Project1

标题: 胆大包天的ruby尝试,游戏无关 [打印本页]

作者: SailCat    时间: 2017-11-4 23:39
标题: 胆大包天的ruby尝试,游戏无关
看懂的自然看懂……

[pre lang="ruby"]# 胆大包天
copymemory = Win32API.new("kernel32", "RtlMoveMemory", "iii", "i")
copymemory_ip = Win32API.new("kernel32", "RtlMoveMemory", "ipi", "i")

# 初始化一个Table
t = Table.new(2,10,10)
for i in 0...2
  for j in 0...10
    for k in 0...10
      t[i, j, k] = 16705 # 0x4141
    end
  end
end

# 初始化一个1字节缓存和一个4字节缓存
cache = "0"*1
buffer = "0000"

# 邪恶的开始
cache_info = [cache.size].pack("L")+ [cache].pack("p")
buffer_addr = [buffer].pack("p").unpack("L")[0]
copymemory.call(buffer_addr, t.id*2+16, 4)
a = buffer.unpack("L")[0] + 28
copymemory.call(buffer_addr, a, 4)
table_data_addr = buffer.unpack("L")[0]
table_info = [t.xsize * t.ysize * t.zsize * 2].pack("L") + buffer
copymemory_ip.call(cache.id * 2 + 8, table_info, 8)


p cache
# => 输出400个A

# 这里居然可以执行
cache[399] = 255

p t[1, 9, 9]  
# => -191
# => -191
# => -191
# 重要的事情说三遍

# 很想知道不擦PP会怎样
copymemory_ip.call(cache.id*2 + 8, cache_info, 8)

exit
[/pre]

作者: IamI    时间: 2017-11-5 11:14
本帖最后由 IamI 于 2017-11-5 11:22 编辑
  1. Struct Table

  2. int32 dimension
  3. int32 x_size
  4. int32 y_size
  5. int32 z_size
  6. int32 data_area_size
  7. 0...z_size, 0...y_size, 0...x_size -> int16 data
复制代码

人有多大胆,地有多大产
作者: taroxd    时间: 2017-11-5 18:36
点评中的问题参考 https://rpg.blue/thread-224347-1-1.html

另外,要拿那一坨东西似乎可以 t.marshal_dump, 不过我不确定和内存里的表示一模一样
作者: SixRC    时间: 2017-11-5 20:11
想说 呃  并不懂我发的脚本和你发的有什么因果关联..啊
黑freeze是很早的想法了 因为不记得看到谁说要截图没奇怪的bug就要靠freeze
昨晚做了只是突然想到
而黑freeze的思路则显而易见 位图数据储存的地址早就不是秘密了
即使是 一路从新建位图跟过去 哪个位置放什么也一清二楚
昨晚看你的脚本并没有看懂 今天看你的点评才觉得奇怪 刚刚大概看懂的
我们发了可能看起来有关联的东西 只是巧合吧..
何况两者截然不同 我实现的主要障碍是freeze的过程方式
加了改换数据指针什么的 只是因为用起来方便 其实也完全可以只保存一个位图的句柄
如有冒犯请见谅




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X5.0