郁金香灬老师 游戏安全  驱动 逆向调试 C/C++编程  脚本 UE4/UE5

找回密码
立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
发新帖
课程大纲和价格
官方联系方式2024在线课大纲QQ咨询

34万

积分

131

好友

145

主题
发表于 2023-5-19 01:32:08 | 查看: 4294| 回复: 0






郁金香灬外挂技术
       
        https://www.yjxsoft.com/
       
        本教程视频1920*1080分辩率下观看最佳
        VS2017+win10 64位 环境
        郁金香老师:扣扣 150330575
        欢迎大家参加 郁金香灬技术 游戏安全与外挂的研究学习。
       
        兴趣是我们最好的老师
        成长需要过程与循序渐进        
        兴趣+坚持+时间+优秀的教程会帮助你快速成功
   
  

学习目标:
UE4里的 FString
xdbg里的 TArray
FMemory


TArray::Add 函数将把一个元素类型实例复制(或移动)到数组中。
TArray::AddUnique 不可添加重复元素
TArray::Emplace 函数将使用您赋予的参数构建一个元素类型的新实例。
TArray::Emplace 添加时不会创建临时变量,性能好于Add,如果空间不够时它会重新分配空间
          template <typename... ArgsType>
        int32 Emplace(ArgsType&&... Args)
               
TArray::Num()获取成员数量
TArray::AddUninitialized
TArray::Append 可一次性添加其他 TArray 中的多个元素,,或者指向常规C数组的指针及该数组的大小

   TArray<FString> a;
   TArray<FString> b;
   a.Append(b);//把数组b里的成员添加到a

TArray::Insert 在给定索引处添加单个元素或元素数组的副本
TArray::SetNum 函数可直接设置数组元素的数量。
TArray::init 填充多个相同值
TArray::HeapSort 无论带或不带二元谓词,均可用于执行对排序。是否选择使用它则取决于特定数据和与 Sort 函数之间的排序效率对比。和 Sort 一样,HeapSort 并不稳定
TArray::StableSort 可在排序后保证等值元素的相对排序。StableSort 作为归并排序实现
TArray::Num 查询元素数量
TArray::GetData 函数返回指向数组中元素的指针,该操作直接访问数组内存。 仅在数组存在且未执行更改数组的操作时,此指针方有效。仅 StrPtr 的首个 Num 指数才可被解除引用
TArray::GetTypeSize 获取单个元素的大小
TArray::Last 函数从数组末端反向索引,索引默认为零。
TArray::Top 返回最后一个元素,不接受索引
TArray::Contains 查询是否包含特定元素
TArray::ContainsByPredicate 查询是否包含与特定谓词匹配的元素
TArray::Find 确定元素是否存在并返回找到的首个元素的索引
TArray::FindLast 确定元素是否存在并返回找到的最末元素的索引
TArray::IndexOfByKey 返回首个匹配到的元素的索引;如果没有找到元素,则返回INDEX_NONE
TArray::IndexOfByKey 工作方式相似,但允许元素与任意对象进行对比。通过Find函数进行的搜索开始前,参数将被实际转换为元素类型(此例中的FString)。使用IndexOfByKey ,则直接对”键”进行对比,以便在键类型无法直接转换到元素类型时照常进行搜索。
TArray::IndexOfByKey 可用于运算符 == (ElementType、KeyType)存在的任意键类型;然后这将被用于执行比较。
使用 TArray::IsValidIndex 函数询问容器,可确定特定索引是否有效(0≤=索引<Num())
TArray::Last 函数从数组末端反向索引,索引默认为零。
TArray::Top 返回最后一个元素,不接受索引
TArray::Contains 查询是否包含特定元素
TArray::ContainsByPredicate 查询是否包含与特定谓词匹配的元素
TArray::Find 确定元素是否存在并返回找到的首个元素的索引
TArray::FindLast 确定元素是否存在并返回找到的最末元素的索引
TArray::IndexOfByKey 返回首个匹配到的元素的索引;如果没有找到元素,则返回INDEX_NONE
TArray::IndexOfByKey 工作方式相似,但允许元素与任意对象进行对比。通过Find函数进行的搜索开始前,参数将被实际转换为元素类型(此例中的FString)。使用IndexOfByKey ,则直接对”键”进行对比,以便在键类型无法直接转换到元素类型时照常进行搜索。
TArray::IndexOfByKey 可用于运算符 == (ElementType、KeyType)存在的任意键类型;然后这将被用于执行比较。
TArray::IndexOfByPredicate 函数用于查找与特定谓词匹配的首个元素的索引;如未找到,同样返回特殊 INDEX_NONE 值:
TArray::FindByKey 可以将元素和任意对象对比,并返回首个匹配到的元素的指针,如果未匹配到,则返回nullptr
TArray::FindByPredicate 的使用方式和IndexOfByPredicate相似,不同的是,它的返回值是指针,而不是索引
TArray::FilterByPredicate 函数可获取与特定谓词匹配的元素数组
TArray::Remove 函数族用于移除数组中的元素。
TArray::RemoveSingle 也可用于擦除数组中的首个匹配元素。
TArray::RemoveAt 函数也可用于按照从零开始的索引移除元素。 可使用 IsValidIndex 确定数组中的元素是否使用计划提供的索引,将无效索引传递给此函数会导致运行时错误:
TArray::RemoveAll 也可用于函数移除与谓词匹配的元素。
TArray::RemoveSwap TArray::RemoveAtSwap   TArray::RemoveAllSwap 移动过程存在开销。如不需要剩余元素排序,可使用 RemoveSwap、RemoveAtSwap 和 RemoveAllSwap 函数减少此开销。此类函数的工作方式与其非交换变种相似,不同之处在于其不保证剩余元素的排序,因此可更快地完成任务:
TArray::Empty 函数移除数组中所有元素
TArray::Reset 与Empty函数类似,该函数将不释放内存。

数组是常规数值类型,可使用标准复制构造函数或赋值运算符进行复制。由于数组严格拥有其元素,复制数组的操作是深层的,因此新数组将拥有其自身的元素副本
TArray::+= 运算符 可替代Append函数进行数组连接
MoveTemp 函数可将一个数组中的内容移动到另一个数组中,源数组将被清空
TArray::== 运算符和 TArray::!= 运算符可对数组进行比较。 元素的排序很重要:只有元素的顺序和数量相同时,两个数组才被视为相同

TArray 拥有支持二叉堆数据结构的函数。堆是一种二叉树,其中父节点的排序等于或高于其子节点。作为数组实现时,树的根节点位于元素0,索引N处节点的左右子节点的指数分别为2N+1和2N+2。子节点彼此间不存在特定排序。
TArray::Heapify 函数可将现有数组转换为堆。此会重载为是否接受谓词,无谓词的版本将使用元素类型的 运算符&lt; 确定排序:
树中的节点按堆化数组中元素的排序从左至右、从上至下读取。 注意:数组在转换为堆后无需排序。排序数组也是有效堆,但堆结构的定义较为宽松,同一组元素可存在多个有效堆。

TArray::HeapPush 函数可将新元素添加到堆,对其他节点进行重新排序,以对堆进行维护

TArray::HeapPop 和 TArray::HeapPopDiscard 函数用于移除堆的顶部节点。 这两个函数的区别在于前者引用元素的类型来返回顶部元素的副本,而后者只是简单地移除顶部节点,不进行任何形式的返回。两个函数得出的数组变更一致,重新正确排序其他元素可对堆进行维护

TArray::HeapRemoveAt 将删除数组中给定索引处的元素,然后重新排列元素,对堆进行维护

TArray::HeapTop 函数可查看堆的顶部节点,无需变更数组
因为数组的尺寸可进行调整,因此它们使用的是可变内存量。为避免每次添加元素时需要重新分配,分配器通常会提供比需求更多的内存,使之后进行的Add调用不会因为重新分配而出现性能损失。同样,删除元素通常不会释放内存。
容器中现有的元素数量和下次分配之前可添加的元素数量之差成为Slack
默认构建的数组不分配内存,slack初始为0。
TArray::GetSlack 函数即可找出数组中的slack量,相当于TArray::Max() - TArray::Num()
Max 函数可获取到容器重新分配之前数组可保存的最大元素数量。
分配器确定重新分配后容器中的Slack量。因此 Slack 不是常量。

虽然无需管理Slack,但可管理Slack对数组进行优化,以满足需求。 例如,如需要向数组添加大约100个新元素,则可在添加前确保拥有可至少存储100个新元素的Slack,以便添加新元素时无需分配内存。上文所述的 Empty 函数接受可选Slack参数
Reset 函数与Empty函数类似,不同之处是若当前内存分配已提供请求的Slack,该函数将不释放内存。但若请求的Slack较大,其将分配更多内存:
Shrink 函数可移除所有Slack。此函数将把分配重新调整为所需要的大小,使其保存当前的元素序列,而无需实际移动元素
本质上而言,TArray 只是分配内存的包装器。直接修改分配的字节和自行创建元素即可将其用作包装器,此操作十分实用。Tarray 将尽量利用其拥有的信息进行执行,但有时需降低一个等级。
利用以下函数可在较低级别快速访问 TArray 及其数据,但若利用不当,可能会导致容器无效和未知行为。在调用此类函数后(但在调用其他常规函数前),可决定是否将容器返回有效状态。
AddUninitialized 和 InsertUninitialized 函数可将未初始化的空间添加到数组。两者工作方式分别与 Add 和 Insert 函数相同,只是不调用元素类型的构造函数。若要避免调用构造函数,建议使用此类函数。类似以下范例的情况中建议使用此类函数,其中计划用 Memcpy 调用完全覆盖结构体
也可使用此功能保留计划自行构建对象所需内存
AddZeroed 和 InsertZeroed 的工作方式相似,不同点是会将添加/插入的空间字节清零

TArray::SetNumUninitialized 和 TArray::SetNumZeroed 函数的工作方式与 TArray::SetNum 类似,
不同之处在于新数量大于当前数量时,将保留新元素的空间为未初始化或按位归零。
与 TArray::AddUninitialized 和 TArray::InsertUninitialized 函数相同,必要时需将新元素正确构建到新空间中

应谨慎使用"TArray::Uninitialized"和"TArray::Zeroed"函数族。
如函数类型包含要构建的成员或未处于有效按位清零状态的成员,
可导致数组元素无效和未知行为。此类函数适用于固定的数组类型,例如FMatrix和FVector。













游戏安全课程 学员办理咨询联系QQ150330575 手机 139 9636 2600  免费课程 在 www.bilibili.com 搜 郁金香灬老师
您需要登录后才可以回帖 登录 | 立即注册

QQ咨询

QQ|Archiver|手机版|小黑屋|郁金香游戏技术

GMT+8, 2024-11-23 06:36 , Processed in 0.086865 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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