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

Project1

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

[讨论] Ruby 1.8(VX) &1.9(ACE) 的 String 的 object_id 与内存

[复制链接]

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
跳转到指定楼层
1
发表于 2012-1-15 11:43:57 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

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

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

x
首先,
为了取得某个 String 的指针,我在 VX/RGE/XP 下写这个脚本:
  1. RtlMoveMemory_pi = Win32API.new("kernel32", "RtlMoveMemory", "pii", "i")
  2. ab = "abcdefg"
  3. address = "xxxx"
  4. RtlMoveMemory_pi.call(address, ab.object_id * 2 + 12, address.size)
  5. address = address.unpack("L")[0]   # 这个就是内存位置的开头
  6. buff = " " * ab.size               # 将成为 "abcdefg" 的复制本
  7. RtlMoveMemory_pi.call(buff, address, ab.size)
  8. p buff
复制代码
那时候的 object_id * 2 + 12 是"撞"出来的,所以我没有查到 Ruby 的内存结构。
ACE 的时候,发现不管用,而且出现全"\0"和全"?",并且程序有一定几率死掉(似乎因为读取内存不属于程序)。

问题是结构和 object_id 有什么分别?

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
2
 楼主| 发表于 2012-1-15 18:36:15 | 显示全部楼层
灼眼的夏娜 发表于 2012-1-15 18:17
class String
  
  Lstrcpyn = Win32API.new("kernel32", "lstrcpyn", "ppi", "l")

呵。完全忘记了 Win32API 有 C/C++ 的字符串函数。
嗯...什巧妙的,但似乎违背了这个函数的意义- -||。结果(结论):
VX(Ruby 1.8):addr = RtlMoveMemory(object_id * 2 + 12, 4)
ACE(Ruby 1.9):addr = object_id * 2 + 8
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-13 07:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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