PSVITACHEATZ06 您所在的位置:网站首页 psv金手指插件z05 PSVITACHEATZ06

PSVITACHEATZ06

2024-07-09 11:32| 来源: 网络整理| 查看: 265

普通作弊代码格式方式不够灵活,对于进阶者来说可能希望使用更灵活的插件方式编写作弊代码。

首先需要搭建PSV开发环境,此处略过不谈,可自行上网搜索解决。

然后来看Example,最终幻想X高清版(PCSH00042)的修改,原作弊代码来自于http://www.speedfly.cn/19985.html

这里仅做移植演示,下面对重要的地方作说明,其他地方参考Example来修改即可。

/** * 结构体代表一项修改 * {{language}}_name代表修改名称,vitacheat会根据菜单语言选择相应的选项 * func是函数指针,函数内执行修改 **/ typedef struct vitacheatinfo { char* english_name; char* simplified_name; char* traditional_name; char* japanese_name; /* 本来想做日文菜单的,没时间只能暂时放弃,这一项暂时没用 */ uintptr_t func; } vitacheatinfo; /** * 00. module name: ffx_phyreApp * path: ux0:/app/PCSH00042/ffx_phyreApp.self * vaddr: 0x81000000 * memsz: 0x62af50 * vaddr: 0x8162b000 * memsz: 0x1dd283c **/ /** * 由module name获取module信息,这里的module name是ffx_phyreApp **/ int get_ffx_phyreApp_module(tai_module_info_t* pt_module_info) { pt_module_info->size = sizeof(tai_module_info_t); return taiGetModuleInfo("ffx_phyreApp", pt_module_info); } /** * * Code Author: Dask * Source: http://www.speedfly.cn/19985.html * * _V0 Max Gil After Using => _V0 Max Gil After Using * $A100 811CD8C4 0000BF00 => $B200 00000000 00000000 * => $A100 001CD8C4 0000BF00 * **/ static SceUID mgauUID = -1; /** * CODE区修改 * 锁定/禁用 切换的时候会调用该函数 **/ static void max_gil_after_using(int lock) { if (lock) { /** * 锁定 **/ if (mgauUID > 0) { return; } /** * 获取module信息 **/ tai_module_info_t module_info; int ret = get_ffx_phyreApp_module(&module_info); if (ret != 0) { return; } /** * 设置offset和value,对应 * $A100 001CD8C4 0000BF00 **/ const uint32_t offset = 0x1CD8C4; const uint16_t value = 0xBF00; /** * 设置参数调用taiInjectDataForUser修改内存 **/ tai_offset_args_t args; args.size = sizeof(args); args.modid = module_info.modid; args.segidx = 0; args.offset = offset; args.source = &value; args.source_size = sizeof(value); /** * 记录injectid,后面释放需要 **/ mgauUID = taiInjectDataForUser(&args); } else { /** * 禁用,对应CODE区修改这里需要"解锁"释放内存,让程序值恢复原值 **/ if (mgauUID > 0) { taiInjectRelease(mgauUID); mgauUID = -1; } } } /** * Code Author: Dask * Source: http://www.speedfly.cn/19985.html * * _V0 All Item 99 => _V0 All Item 99 * $4101 8262A76C 00002000 => $B200 00000001 00000000 * $006F 00000002 00000001 => $4101 00FFF76C 00002000 * $4001 8262A96C 00000063 => $006F 00000002 00000001 * $006F 00000001 00000000 => $4001 00FFF96C 00000063 * => $006F 00000001 00000000 * **/ /** * DATA区修改 * 锁定/禁用 切换的时候会调用该函数 **/ static void all_item_99(int lock) { if (lock) { /** * 获取module信息 **/ tai_module_info_t module_info; int ret = get_ffx_phyreApp_module(&module_info); if (ret != 0) { return; } /** * 获取kernel_module_info **/ SceKernelModuleInfo kernel_module_info = {0}; ret = sceKernelGetModuleInfo(module_info.modid, &kernel_module_info); if (ret != 0) { return; } /** * 获取seg1(也就是DATA区)的base **/ SceKernelSegmentInfo* seg1 = &(kernel_module_info.segments[1]); uint16_t value1 = 0x2000; uint32_t offset = 0xFFF76C; for (int i = 0; i < 0x6F; ++i) { /** * 定位到实际地址 **/ void* addr = seg1->vaddr + offset + i * 0x2; *(uint16_t*)addr = value1; value1 += 0x1; } const uint8_t value2 = 0x63; offset = 0xFFF96C; for (int i = 0; i < 0x6F; ++i) { void* addr = seg1->vaddr + offset + i; *(uint8_t*)addr = value2; } } /** * 注意DATA区修改不需要记录injectid,也不需要恢复原值,所以禁用(lock=0)情况不需要编写代码 **/ } /** * CHEAT LIST * 定义作弊代码名称和对应上面的函数即可。 **/ static vitacheatinfo info[] = { { .english_name = "Max Gil After Using", .simplified_name = "金钱变动后MAX", .traditional_name = "金錢變動后MAX", .japanese_name = "Max Gil After Using", .func = (uintptr_t)max_gil_after_using }, { .english_name = "All Item 99", .simplified_name = "全道具99个", .traditional_name = "全道具99個", .japanese_name = "All Item 99", .func = (uintptr_t)all_item_99 }, { .english_name = NULL, .simplified_name = NULL, .traditional_name = NULL, .japanese_name = NULL, .func = 0 }, };

重点就是上面的内容,其他要修改的地方就是把Example涉及到titleid都替换成自己要改的titleid。

最后把源代码编译成{{titleid}}.suprx,放到ux0:vitacheat/plg目录下即可。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有