QQ登录

只需一步,快速开始

 找回密码
 定下契约(新注册)

QQ登录

只需一步,快速开始

查看: 944|回复: 10
收起左侧

CLEO 关于内存的探究 (更新至计时器)

[复制链接]

版主

时序者

Rank: 32Rank: 32

宝石
55 粒
金币
6340 枚
节操
137 斤
灵石
2 块
精力
13663 ℃

黑岩之炎猩红之心mikuBRS暴走

发表于 2021-7-16 09:53:57 | 显示全部楼层 |阅读模式

你这样只看不注册,真的大丈夫?~

您需要 登录 才可以下载或查看,没有账号?定下契约(新注册)

x
本帖最后由 不吉波普 于 2022-3-17 11:42 编辑

2021年7月15日

0A8C: write_memory 0xC0BC15 size 1 value 1 virtual_protect 0

0A8D: $result = read_memory 1@ size 4 virtual_protect 0

目前大概就搞懂了这两个,以下以子弹拖尾作为范例。
原文:
  • "Start" is start address of array in gta_sa.exe v1.0 proc.
  • "Size" is size of each element of array in gta_sa.exe v1.0 proc.
  • "Num" is elements of array in gta_sa.exe v1.0 proc.

Start:子弹拖尾的起始内存地址为:0xC7C748
Size:其包含的数组中每一个元素的大小为:0x2c //这个不是很理解,是说这个地址的大小为0x2C吗
Num:关于该内存地址的数组元素共有:0x10 也就是16个//然而下面有17个,迷惑...
那么该内存地址的最后一个则是:0xC7C748 +( (0x10 -1)* 0x2C )= 0xC7C9DC
Ryosuke所整理的档案里提到在起始地址加上以下偏移值(元素)可以实现不同的效果(这一部分我认为我的理解有不对的地方,感觉混淆了)
///////////////////////////////////////
+0x00 Float Trans Side X
+0x04 Float Trans Side Y
+0x08 Float Trans Side Z
+0x0C Float Yellow Side X
+0x10 Float Yellow Side Y
+0x14 Float Yellow Side Z
+0x18 Byte Exist Flag
+0x19 Byte Pad
+0x1A Byte Pad
+0x1B Byte Pad
+0x1C DWord Created Time (from 0xB7CB84)
+0x20 DWord Disappear Time (e.g. 750)
+0x24 Float Radius
+0x28 Byte Alpha
+0x29 Byte Pad
+0x2A Byte Pad
+0x2B Byte Pad
///////////////////////////////////////
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

///////////////////////////////////////

关于语句的使用0A8C: write_memory 0xC0BC15(这里自然就是内存地址) size 1(这个则是偏移量的数据类型,见上表) value 1 virtual_protect 0(这里一般是填0或者1)如果目标地址是只读的话,那就写1,如果是可编辑的则是0,同理,在语句0A8D中,1代表该地址不可读,0则是可读。可以的话,还是希望有大佬能解答下...




版主

时序者

Rank: 32Rank: 32

宝石
55 粒
金币
6340 枚
节操
137 斤
灵石
2 块
精力
13663 ℃

黑岩之炎猩红之心mikuBRS暴走

 楼主| 发表于 2021-7-16 19:29:10 | 显示全部楼层
2021年7月16日
今日份更新
感谢梦烟天地大佬的解答和帮助,以及DK22Pac的SDK库
BulletTraces的库中,我们可以看到以下文字:
"unsigned int MAX_NUM_BULLETTRACES = 16"
开头就声明了游戏子弹痕迹能够保存在内存里的总数量, 也就是游戏同时存在的子弹痕迹只能是16个,对应我们上文中提到的NUM:0x10(16)。
子弹痕迹的起始地址是0x00C7C748
名称是*CBulletTraces::aTraces
游戏内存可存储最大16个子弹痕迹

即:
*CBulletTraces::aTraces[0]-*CBulletTraces::aTraces[15]
指针数组  ID 0-15共16个元素
https://github.com/DK22Pac/plugi ... e_sa/CBulletTrace.h
根据头文件可知
VALIDATE_SIZE(CBulletTrace, 0x2C);
单个元素的结构体总大小为0x2C(0x00-0x2B)
所以,*CBulletTraces::aTraces[0]第一个子弹痕迹存储的地址是起始地址0xC7C748
则第二个*CBulletTraces::aTraces[1]的地址是0xC7C748+1乘以0x2C
1就是ID 也就是第二个
以此类推


如果是最后1个,即第16个
*CBulletTraces::aTraces[15]
地址为
0xC7C748+15×0x2C
指针数组共有16个元素
每个元素的结构体大小是0x2C
该指针起始地址为0xC7C748


在我们上文所提及的偏移值,此处更正为结构体名称,每个元素结构体大小为0x2C 【0x00-0x2B】,它包含了子弹痕迹的起始坐标xyz和终点坐标 半径 实体指针之类的数据,游戏同时可以创建16个子弹痕迹,就是16个元素,每个元素都有1个0x2C大小的结构体。
好!摸了


回复 支持 反对

使用道具 举报

版主

时序者

Rank: 32Rank: 32

宝石
55 粒
金币
6340 枚
节操
137 斤
灵石
2 块
精力
13663 ℃

黑岩之炎猩红之心mikuBRS暴走

 楼主| 发表于 2021-7-17 21:14:48 | 显示全部楼层
本帖最后由 不吉波普 于 2021-7-17 21:19 编辑

2021年7月17日晚
今日份更新
今天的是Ryosuke所整理的库中部分的结构体,里面涉及的部分过多,虽然我还木有看懂,但是后续会持续更新。
///////////////////////////////////////////////////////////////////////////////////////////////////////////
Fire(火)
Start 0xB71F80
Size 0x28
Num 0x3C

+0x00 Word Exist Flag (20=None)
+0x02 Word Index used in SCM
+0x04 Float X Position
+0x08 Float Y Position
+0x0C Float Z Position
+0x10 DWord Attached to
+0x14 DWord Fired from
+0x18 DWord Disappear Time (from 0xB7CB84)
+0x1C Float Size
+0x20 Byte Some Flag
+0x21 Byte Unknown 60
+0x22 Word Unknown 0
+0x24 Float Unknown
Corona(圆点辉光)
Start 0xC3E058
Size 0x3C
Num 0x40

+0x00 Float X Position
+0x04 Float Y Position
+0x08 Float Z Position
+0x0C DWord Unknown
+0x10 DWord Ptr To Texture Struct (+0x10 Char[64] Name)
+0x14 Float Radius
+0x18 Float Unknown
+0x1C Float Far Clip
+0x20 Float Near Clip
+0x24 DWord 0
+0x28 Float 15.0
+0x2C Byte Color R
+0x2D Byte Color G
+0x2E Byte Color B
+0x2F Byte Color A
+0x30 Byte Fade (0=Hide/255=Show)
+0x31 Byte Some Flag (0/1)
+0x32 Byte Flare
+0x33 Byte Some Flag (0/1)
+0x34 DWord Some Flag
+0x38 DWord 0

Bullet(子弹)
Start 0xC88740
Size 0x2C
Num 0x08

+0x00 DWord Weapon Type
+0x04 DWord Fired From
+0x08 Float Destroy Time
+0x0C Byte Exist Flag
+0x0D Byte3 Padding
+0x10 Float X Position
+0x14 Float Y Position
+0x18 Float Z Position
+0x1C Float X Velocity (Meters per Frame)
+0x20 Float Y Velocity (Meters per Frame)
+0x24 Float Z Velocity (Meters per Frame)
+0x28 Word Damage
+0x2A Word Padding
* Start Address and some other are from Sacky's post in GTAForums.com

Explosion(爆炸)
Start 0xC88950
Size 0x7C
Num 0x10

+0x00 DWord Explosion Type
+0x04 Float X Position
+0x08 Float X Position
+0x0C Float X Position
+0x10 Float Unknown
+0x14 Float Unknown 0.5
+0x18 DWord Unknown 0
+0x1C DWord Unknown 0
+0x20 Float Disappear Time (from 0xB7CB84)
+0x24 Float Unknown 1.0
+0x28 Byte Frames from Created
+0x29 Byte Unknown 1
+0x2A Byte Unknown 1
+0x2B Byte Unknown 0
+0x2C Float Created Time (from 0xB7CB84)
+0x30 DWord Unknown 0
+0x34 Float Visible Radius
+0x38 DWord Unknown 0
+0x3C DWord Time from Created
+0x40 - +0x78 Float Effect Coords
以上的结构体我还木有进行试验,有空就去试试看。好!摸了


回复 支持 反对

使用道具 举报

版主

时序者

Rank: 32Rank: 32

宝石
55 粒
金币
6340 枚
节操
137 斤
灵石
2 块
精力
13663 ℃

黑岩之炎猩红之心mikuBRS暴走

 楼主| 发表于 2021-7-18 20:05:11 | 显示全部楼层
今日的奇思妙想,假如有办法获取到模型对应贴图的地址,是否可以通过修改该贴图对应的模型面的透明度来达到部分透明的效果,从而达到高亮与透明效果共存,值得思考,先去找地址,可能不会有下文了今天。
回复 支持 反对

使用道具 举报

平凡 Ordinary

Rank: 2Rank: 2

UID
38646
宝石
1 粒
金币
505 枚
节操
0 斤
灵石
0 块
精力
822 ℃
发表于 2021-7-27 21:21:21 来自手机 | 显示全部楼层
留个爪
回复 支持 反对

使用道具 举报

平凡 Ordinary

Rank: 2Rank: 2

UID
38646
宝石
1 粒
金币
505 枚
节操
0 斤
灵石
0 块
精力
822 ℃
发表于 2021-7-27 21:27:52 来自手机 | 显示全部楼层
子弹痕迹这个东西有什么作用??

点评

怎么说呢,只是一个示例,至于怎么用要看个人  发表于 2021-7-28 11:05
回复 支持 反对

使用道具 举报

版主

时序者

Rank: 32Rank: 32

宝石
55 粒
金币
6340 枚
节操
137 斤
灵石
2 块
精力
13663 ℃

黑岩之炎猩红之心mikuBRS暴走

 楼主| 发表于 2022-2-23 10:11:00 | 显示全部楼层
更新: CEntity 中的 ModelIndex 指的是 模型的ID 具体ID可以在网上查询到
回复 支持 反对

使用道具 举报

版主

时序者

Rank: 32Rank: 32

宝石
55 粒
金币
6340 枚
节操
137 斤
灵石
2 块
精力
13663 ℃

黑岩之炎猩红之心mikuBRS暴走

 楼主| 发表于 2022-3-17 11:45:03 | 显示全部楼层
本帖最后由 不吉波普 于 2022-3-17 11:49 编辑

更新: 调用外部的计时器该方法相较于wait xx ms 与 32@ 33@ 等计时器更为准确,且不受游戏帧数影响

正文:

30@ = 5700 --需要计算多久的时间 以毫秒为单位
0AB1: call_scm_func @KtimE 1 30@ 30@

/////////////////////////////////////////Time count///////////////////////  
:KtimE
WAIT 0
Int:0@
28@ = 0
IF
0AA2: 31@ = load_library "kernel32.dll"   
JF @KtimE
0AA4: 30@ = get_proc_address "GetTickCount" library 31@
0AA7: call_function 30@ num_params 0 pop 0 29@
0085:28@ = 29@
JUMP @count   

:Count
WAIT 0
0AA7: call_function 30@ num_params 0 pop 0 29@
0062:29@ -= 28@
IF
002D:29@ >= 0@
JF @Count
0AA3: free_library 31@
0AB2: ret 1 29@
/////////////////////////////////////////Time count///////////////////////////






点评

更新:该计时方法与wait不同,即便你回到游戏菜单也不会停止,因此如果在中途回到游戏菜单再进游戏就会出现执行语句不按预定时间执行的BUG,所以不建议使用在较长的时间计时上  发表于 2022-3-19 13:14
回复 支持 反对

使用道具 举报

本版积分规则

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

GMT+8, 2024-4-26 04:54 , Processed in 0.164900 second(s), 100 queries .

沪ICP备2021020632号-1

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