定下契约(新注册) 登录
怀念是一行潦草的诗 返回首页

不吉波普的个人空间 http://miuk.cn/?22073 [收藏] [复制] [分享] [RSS]

日志

【SA】关于内存地址9867536的使用

已有 913 次阅读2021-8-8 21:51 | CLEO

{:6_153:}
今天又是研究学习的一天,在参考以前前辈所编写的一个CLEO的时候,发现了以下语句
////////////////////////////////////////////////////////////////////////////////////
0A8D: 0@ = read_memory 9867536 size 4 virtual_protect 0
JF
04A4:   0@ == 1497976369 // == constant
JF @YIN
////////////////////////////////////////////////////////////////////////////////////
在上次记录的档案里面,已讲解过0A80的使用,但是9867536这个内存地址我并没有查到
不过找到了以前前辈留下的记录,这里先感谢为主的祥助前辈
在他的博客中记录了以下内容:
该内存语句的效果是读取gta sa.exe游戏内核基准地址中9867536开始区间读取四个字符长度,
也就是用户连续输入四个按键的存储位置,它的原始代码是:0A8D=4,%4d% = read_memory %1d% size %2d% virtual_protect %3d%
在内存读写操作过程中需要使用科学计算器来进行十进制和十六进制的数值转换。
比如我们上文所提及的地址:9867536是十进制数值,那么将科学计算器模式切换为十进制模式,输入9867536,
然后点击十六进制切换为十六进制模式,得出的结果就是969110,也就是9867536转换为十六进制的结果
那么该地址就是0x969110。接下来就是查询该地址的作用,在下面我会提供三个用于查询内存地址相关作用的网站,虽然不知道是否齐全,
但是相信对于大家来说有所帮助:
////////////////////////////////////////////////////////////////////////////////////
https://gtamods.com/wiki/Memory_Addresses_(SA)
https://sannybuilder.com/dev/research/gta_funcs.txt
https://gtamods.com/wiki/Function_Memory_Addresses_(SA)
////////////////////////////////////////////////////////////////////////////////////
那么回归正题,通过查询后我们得知该地址的作用是:
0x969110 – [char(30)] Buffer of 30 last typed chars, earlier typed chars are on next bytes
意思就是这个地址是我们最后键入的30个字符的缓冲区,而先输入的字符会位于下一个字节。
通过以下的表格我们可以看到,


Type
Size
Range
Char1 Bytes-0x80 - +0x7F
Byte1 Bytes+0x00 - +0xFF
Short2 Bytes-0x8000 - +0x7FFF
Word2 Bytes+0x0000 - +0xFFFF
Long4 Bytes-0x80000000 - +0x7FFFFFFF
DWord4 Bytes+0x00000000 - +0xFFFFFFFF
Float4 Bytes+/-3.4e38 - +/-1.4e-45

字符所占用的大小为1字节,那么为什么此处要使用size 4 呢,
这里就要联系到上文的语段
////////////////////////////////////////////////////////////////////////////////////
0A8D: 0@ = read_memory 9867536 size 4 virtual_protect 0
JF
04A4:   0@ == 1497976369 // == constant
JF @YIN
////////////////////////////////////////////////////////////////////////////////////
这里的0@是从地址中读取出来的,大小为4字节,也就是说是四个字符,
但是这里的数字是什么,这时候我们就要引入字符的编码了,字符一般使用ASCII编码来表示,
那么此时我们便需要逆向,把“1497976369”先转化为16进制,也就是hex,由此得到“59494e31”
59 49 4e 31,恰好是四个字符,然后我们找到ASCII表格进行对照(这种对照表可以百度找到,此处就不提供了)
通过对照我们可以发现,59对应Y,49对应I,4E对应N,31对应1,由此可知他要在这个地址中读取的字符是YIN1,
当我们输入YIN1的时候,通过内存地址读取,并进行比对,假如无误便跳转到下一步,这便是这个语段的作用,
简单来说0A8D: 0@ = read_memory 9867536 size 4 virtual_protect 0 是将游戏内核读取到的用户连续输入的四个按键进行记录,
并且将该按键所激发的功能模块使用区间9867536所对应的游戏功能模块来嵌入,当然使用的方法还有很多,举个例子,比如如何判定是双击某个按键,
就看玩家发掘了,本帖权当抛砖引玉,希望能有大佬指点,共同进步。

{:6_151:}





评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 定下契约(新注册)

    切换繁體
    Archiver|手机版|小黑屋|

GMT+8, 2024-11-23 01:36 , Processed in 0.033207 second(s), 12 queries .

沪ICP备2021020632号-1

返回顶部