挂海论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
 友情提示:文字/图片广告均非网站意见,请担保交易勿直接付款,由此产生的责任自负
玩游戏来117游戏网(H5不下载也能玩手游传奇,吃鸡,竞技都有)不懂社区·好资源不错过·各位资源站大佬欢迎来采集搬运██【我要租此广告位】██
查看: 1310|回复: 0
打印 上一主题 下一主题

[辅助源码分享] 瓦Fname解密分享

[复制链接]
6高级会员
619/1100

619

积分

11

主题

11

听众
已帮网友解决0 个问题
好评
0
贡献
608
海币
598
交易币
0
跳转到指定楼层
楼主
发表于 2026-1-5 06:22:41 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).

友情提示:文字/图片广告均非本站意见,请担保交易勿直接付款,由此产生的责任自负!!!↑↑


#include "GetNamePool.h"
#define HIDWORD(x) ((uint32_t)(((uint64_t)(x) >> 32) & 0xFFFFFFFF)) // 宏:从 64 位值中提取高 32 位
#define _DWORD unsigned int // 宏别名:将 _DWORD 当作 unsigned int 使用

// 内联函数:对 64 位值执行右循环移位(rotate right)
inline uint64_t ROR64(uint64_t value, unsigned int count) {
        return (value >> count) | (value << ((64 - count) & 63));
}
// 内联函数:对 64 位值执行左循环移位(rotate left)
inline uint64_t ROL64(uint64_t value, unsigned int count) {
        return (value << count) | (value >> ((64 - count) & 63));
}

// 强制内联:根据输入的 32 位 key 和长度为 7 的 state 数组生成解密用的 64 位值
__forceinline uint64_t decrypt_xor_keys(const uint32_t key, const uint64_t* state) {
        // 通过常数乘和位操作混淆 key,生成种子 v3
        uintptr_t v3 = 0x2545F4914F6CDD1D * (key ^ ((key ^ (key >> 15)) >> 12) ^ (key << 25));
        // v4 为 v3 对 7 取模的结果,用作 state 数组索引
        uint32_t v4 = (uint32_t)(v3 % 7);
        // 从 state 中取出对应索引的值 v5
        uintptr_t v5 = state[v4];
        // v6 为 v3 的高 32 位(使用 HIDWORD 宏)
        uintptr_t v6 = HIDWORD(v3);
        // v7 再次保存 v4 % 7(与 v4 相同,保留逆向原貌)
        uint32_t v7 = (uint32_t)(v4 % 7);
        // 若干临时变量,供后续分支计算使用
        uintptr_t v26 = 0;
        uintptr_t v27 = 0;
        uintptr_t v28 = 0;
        uintptr_t v29 = 0;
        // 以下为多个分支,根据 v4/v7 的不同对 v5 进行不同的位运算变换
        if (v4 == 7 * (v4 / 7)) // 判断 v4 是否为 7 的倍数(风格化表达)
        {
                // 一系列复杂的位运算与掩码操作,用于混淆/变换 v5
                uintptr_t v8 = ((((v6 - 1) + v5) >> 1) ^ ((((v6 - 1) + v5) >> 1) ^ (2 * ((v6 - 1) + v5))) & 0xAAAAAAAAAAAAAAAAui64) >> 2;
                uintptr_t v9 = v8 ^ (v8 ^ (4
                        * ((((v6 - 1) + v5) >> 1) ^ ((((v6 - 1) + v5) >> 1) ^ (2 * ((v6 - 1) + v5))) & 0xAAAAAAAAAAAAAAAAui64))) & 0xCCCCCCCCCCCCCCCCui64;
                uintptr_t v10 = (v9 >> 4) ^ ((v9 >> 4) ^ (16 * v9)) & 0xF0F0F0F0F0F0F0F0ui64;
                // 将 v10 的字节重新排列并右旋 32 位
                v5 = ROR64((v10 >> 8) ^ ((v10 >> 8) ^ (v10 << 8)) & 0xFF00FF00FF00FF00ui64, 32);
                goto LABEL_5; // 跳转到共享处理段
        }
        if (v7 != 1)
        {
LABEL_5:
                // 如果 v7 不等于 2,则跳转到 LABEL_16 进行其它处理
                if (v7 != 2)
                        goto LABEL_16;
                // 当 v7 == 2 时,执行另一套混淆算法
                uintptr_t v11 = ~(v6 + 2 * v4) ^ v5;
                uintptr_t v12 = ((v11 >> 1) ^ ((v11 >> 1) ^ (2 * v11)) & 0xAAAAAAAAAAAAAAAAui64) >> 2;
                uintptr_t v13 = v12 ^ (v12 ^ (4 * ((v11 >> 1) ^ ((v11 >> 1) ^ (2 * v11)) & 0xAAAAAAAAAAAAAAAAui64))) & 0xCCCCCCCCCCCCCCCCui64;
                uintptr_t v14 = (v13 >> 4) ^ ((v13 >> 4) ^ (16 * v13)) & 0xF0F0F0F0F0F0F0F0ui64;
                v5 = ROR64((v14 >> 8) ^ ((v14 >> 8) ^ (v14 << 8)) & 0xFF00FF00FF00FF00ui64, 32);
                goto LABEL_7;
        }
        // 当 v7 == 1 的情况,使用带有可变移位量的移位/轮换操作处理 v5
        v5 = ((v5 ^ ~(v6 + 2 * v4)) << (((v6 + v4) % 0x3Fu) + 1)) | ((v5 ^ ~(v6 + 2 * v4)) >> (63 * ((v6 + v4) / 0x3Fu)
                - (v6
                        + v4)
                + 63));
LABEL_16:
        // 如果 v4 % 7 不等于 3,就进入 LABEL_7 的处理路径
        if (v4 % 7 != 3)
        {
LABEL_7:
                // 如果 v4 % 7 不等于 4,则跳转到 LABEL_18
                if (v4 % 7 != 4)
                        goto LABEL_18;
                // 当 v4 % 7 == 4 时,使用另一套变换(混合移位/轮换)
                v5 = (((v6 + 2 * v4) + v5) << (63 * ((v6 + v4) / 0x3Fu) - (v6 + v4) + 63)) | (((v6 + 2 * v4) + v5) >> (((v6 + v4) % 0x3Fu) + 1));
                goto LABEL_9;
        }
        // 当 v4 % 7 == 3 时,使用序列化位块拆分与拼装的操作
        v26 = ((v5 >> 1) ^ ((v5 >> 1) ^ (2 * v5)) & 0xAAAAAAAAAAAAAAAAui64) >> 2;
        v27 = v26 ^ (v26 ^ (4 * ((v5 >> 1) ^ ((v5 >> 1) ^ (2 * v5)) & 0xAAAAAAAAAAAAAAAAui64))) & 0xCCCCCCCCCCCCCCCCui64;
        v28 = v27 >> 4;
        v29 = ((v28 ^ (v28 ^ (16 * v27)) & 0xF0F0F0F0F0F0F0F0ui64) >> 8) ^ (((v28 ^ (v28 ^ (16 * v27)) & 0xF0F0F0F0F0F0F0F0ui64) >> 8) ^ ((v28 ^ (v28 ^ (16 * v27)) & 0xF0F0F0F0F0F0F0F0ui64) << 8)) & 0xFF00FF00FF00FF00ui64;
        // 将构造的 v29 与其高 32 位拼接并按动态移位量轮换
        v5 = (((v29 << 32) | HIDWORD(v29)) >> (63 * ((v6 + v4) / 0x3Fu) - (v6 + v4) + 63)) | (((v29 << 32) | HIDWORD(v29)) << (((v6 + v4) % 0x3Fu) + 1));
LABEL_18:
        // 当 v4 % 7 == 5 的情形,使用带加法与轮换的处理
        if (v4 % 7 == 5)
        {
                v5 = (v6 + v4)
                        + ((v5 >> (((v6 + 2 * v4) % 0x3Fu) + 1)) | (v5 << (63 * ((v6 + 2 * v4) / 0x3Fu) - (v6 + 2 * v4) + 63)));
                goto LABEL_11;
        }
LABEL_9:
        // 当 v4 % 7 == 6 时,先取反再按动态移位量轮换
        if (v4 % 7 == 6)
        {
                uintptr_t v15 = ~(v6 + 2 * v4) ^ v5;
                v5 = (v15 >> (((v6 + v4) % 0x3Fu) + 1)) | (v15 << (63 * ((v6 + v4) / 0x3Fu) - (v6 + v4) + 63));
        }
LABEL_11:
        // 最终结果与原始 key 做 XOR 并返回
        uintptr_t v16 = v5 ^ key;
        return v16;
}

// 从内存中读取 state 数组并返回解密后的 FNameKey
uintptr_t GetFNameKey(uintptr_t base) {

        uintptr_t state[7]{}; // 声明 7 个元素的 state 数组并初始化为 0
        for (int i = 0; i < 7; i++) {
                // 从驱动或进程内存读取 state[i],偏移基于 Val.Base + Offsets::FnameState
                state[i] = Driver:read<uintptr_t>(Val.Base + Offsets::FnameState + i * sizeof(uintptr_t));
        }
        // 读取位于 state 区之后的 key(偏移 0x38)
        uintptr_t key = Driver:read<uintptr_t>(Val.Base + Offsets::FnameState + 0x38);
        // 调用解密函数并返回解密结果
        return decrypt_xor_keys(key, state);
}


// 根据 FName 索引读取并解密名称字符串
std::string GetFName(int key)
{

        static uintptr_t cachedNameKey = 0; // 静态缓存,用于避免重复计算/读取密钥
        if (!cachedNameKey)
                cachedNameKey = getfnamekey(PasPas::Base); // 第一次调用时获取密钥(注意函数名/符号应一致)

        // 计算 chunk 索引(高 16 位)和在 chunk 内的偏移(低 16 位)
        uint32_t chunkOffset = (uint32_t)((int)(key) >> 16);
        uint16_t nameOffset = (uint16_t)key;
        // 读取名字池中对应 chunk 的基地址
        uint64_t namePoolChunk = Driver:read<uint64_t>((std::uintptr_t)(PasPas::Base + Offsets::FNamePool + ((chunkOffset + 2) * 8)));
        // 计算具体条目的偏移
        uint64_t entryOffset = namePoolChunk + (uint64_t)(4 * nameOffset);
        // 从内存读取 FNameEntry 结构
        FNameEntry nameEntry = Driver:read<FNameEntry>(entryOffset);
        // 如果长度异常(太长),返回占位符
        if (nameEntry.Header.Len > 55) return "None";


        // 构造 std::string,复制 AnsiName 字节
        std::string name(nameEntry.AnsiName, nameEntry.Header.Len);

        // 对每个字节执行异或解密:使用长度与从 decrypt_xor_keys 地址派生的字节作为密钥
        for (std::uint16_t i = 0; i < nameEntry.Header.Len; i++) {
                BYTE b = i & 3; // 取低 2 位作为索引
                name[i] ^= nameEntry.Header.Len ^ *((LPBYTE)&decrypt_xor_keys + b); // 异或解密
        }

        return name; // 返回解密后的名字
}

// 缓存层:通过 ID 查找名称,如果未缓存则从内存读取并缓存
std::string getNameFromID(std::uint32_t id) {

        auto it = std::find_if(fnamesids.begin(), fnamesids.end(), [id](const idnames& elem) {
                return elem.id == id; // 查找相同 id 的缓存项
                });

        if (it != fnamesids.end()) {

                return it->name; // 找到则直接返回缓存名
        }
        else {

                std::string finalname = GetFName(id); // 否则读取并解密名字

                idnames newIdName; // 构造新的缓存条目
                newIdName.id = id;
                newIdName.name = finalname;
                fnamesids.push_back(newIdName); // 将新条目加入缓存

                return finalname; // 返回新获取的名称
        }

}
另出
  瓦内部 DX11内绘 对接SDK文件 游戏更新只需要更新几个SDK文件即可
  功能:骨骼透视 内存自瞄 射线判断 漏打



联系我时,请说是在 挂海论坛 上看到的,谢谢!



上一篇:开源SJZ解密
下一篇:双机转换 长期稳定 无网络特征 内核tcp驱动 一手直招
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。

2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:xhzlw@foxmail.com),本站将立即改正。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明|Archiver|手机版|小黑屋|挂海论坛

GMT+8, 2026-1-16 08:56 , Processed in 0.088095 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.2

本站资源来自互联网用户收集发布,如有侵权请邮件与我们联系处理。xhzlw@foxmail.com

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