From c29116774fa5a8d30c3d12f1e08013666a77b165 Mon Sep 17 00:00:00 2001 From: AtelierWindows Date: Thu, 11 Jul 2019 15:49:15 +1200 Subject: [PATCH] Inital src --- .gitignore | 41 -- Interlectural Property Notices.txt | 295 ++++++++++++ LICENSE | 21 - README.md | 52 +- app.xml | 33 ++ app/CMakeLists.txt | 70 +++ app/app.info | Bin 0 -> 17472 bytes app/pstvConfig.txt | 120 +++++ app/sce_sys/icon0.png | Bin 0 -> 4351 bytes app/sce_sys/livearea/contents/bg.png | Bin 0 -> 125475 bytes app/sce_sys/livearea/contents/template.xml | 157 ++++++ app/src/ctrl.c | 58 +++ app/src/ctrl.h | 2 + app/src/debugScreen.h | 184 ++++++++ app/src/debugScreenFont.c | 111 +++++ app/src/main.c | 525 +++++++++++++++++++++ app/src/pup.c | 222 +++++++++ app/src/pup.h | 102 ++++ app/vitaConfig.txt | 139 ++++++ build.sh | 27 ++ kernel/CMakeLists.txt | 51 ++ kernel/exports.yml | 16 + kernel/src/cex2rex_kern.h | 4 + kernel/src/main.c | 183 +++++++ kernel/src/power.h | 1 + kernel/src/spkg.c | 121 +++++ kernel/src/spkg.h | 78 +++ kernel/src/sysroot.h | 1 + kmspico/CMakeLists.txt | 42 ++ kmspico/exports.yml | 8 + kmspico/src/main.c | 28 ++ make_appinfo.bat | 6 + memdump_license | 14 - spoofer/LICENSE | 201 ++++++++ spoofer/Makefile | 31 ++ spoofer/README.md | 7 + spoofer/exports.yml | 8 + spoofer/mmu_dump.c | 286 +++++++++++ spoofer/mmu_dump.o | Bin 0 -> 1872 bytes user/CMakeLists.txt | 40 ++ user/exports.yml | 16 + user/src/cex2rex_user.h | 6 + user/src/main.c | 33 ++ 43 files changed, 3223 insertions(+), 117 deletions(-) delete mode 100644 .gitignore create mode 100644 Interlectural Property Notices.txt delete mode 100644 LICENSE create mode 100644 app.xml create mode 100644 app/CMakeLists.txt create mode 100644 app/app.info create mode 100644 app/pstvConfig.txt create mode 100644 app/sce_sys/icon0.png create mode 100644 app/sce_sys/livearea/contents/bg.png create mode 100644 app/sce_sys/livearea/contents/template.xml create mode 100644 app/src/ctrl.c create mode 100644 app/src/ctrl.h create mode 100644 app/src/debugScreen.h create mode 100644 app/src/debugScreenFont.c create mode 100644 app/src/main.c create mode 100644 app/src/pup.c create mode 100644 app/src/pup.h create mode 100644 app/vitaConfig.txt create mode 100644 build.sh create mode 100644 kernel/CMakeLists.txt create mode 100644 kernel/exports.yml create mode 100644 kernel/src/cex2rex_kern.h create mode 100644 kernel/src/main.c create mode 100644 kernel/src/power.h create mode 100644 kernel/src/spkg.c create mode 100644 kernel/src/spkg.h create mode 100644 kernel/src/sysroot.h create mode 100644 kmspico/CMakeLists.txt create mode 100644 kmspico/exports.yml create mode 100644 kmspico/src/main.c create mode 100644 make_appinfo.bat delete mode 100644 memdump_license create mode 100644 spoofer/LICENSE create mode 100644 spoofer/Makefile create mode 100644 spoofer/README.md create mode 100644 spoofer/exports.yml create mode 100644 spoofer/mmu_dump.c create mode 100644 spoofer/mmu_dump.o create mode 100644 user/CMakeLists.txt create mode 100644 user/exports.yml create mode 100644 user/src/cex2rex_user.h create mode 100644 user/src/main.c diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 6fd0a37..0000000 --- a/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -# Compiled Lua sources -luac.out - -# luarocks build files -*.src.rock -*.zip -*.tar.gz - -# Object files -*.o -*.os -*.ko -*.obj -*.elf - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo -*.def -*.exp - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - diff --git a/Interlectural Property Notices.txt b/Interlectural Property Notices.txt new file mode 100644 index 0000000..fc8c65a --- /dev/null +++ b/Interlectural Property Notices.txt @@ -0,0 +1,295 @@ +Credits: + +Silica - All Graphics, Most Code +PSM INSTITUTIONS LLC (aka Silica) - Epic "Intellectual Property Notices" +Princess Of Sleeping - PUP Extractor +TheFlow0 - SPKG Decryptor (modoru) +"FAPS TEAM" / dots_tb - kscePowerSetCallbackEnabled(); nid +zecoaxco - spoof_testkit / memdump + +-- MEMDUMP CHANGES: + Removed #include + Removed all calls to LOG() + + +CEX 2 REX 2.0-- + +The MIT License (MIT) + +Copyright (c) 2019 Silica + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +KMSPico Activator-- + +The MIT License (MIT) + +Copyright (c) 2019 Silica + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +Modoru-- https://github.com/TheOfficialFloW/modoru + +The MIT License (MIT) + +Copyright (c) 2019 TheFloW + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +PSV-PUP-Extractor-- https://github.com/Princess-of-Sleeping/PSV-PUP-Extractor + +NO LICENSE INFORMATION + +memdump / testkit spoofer-- https://github.com/zecoxao/memdump/tree/spoof_testkit + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 9cdff5b..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Silica - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md index a4dcf8d..fc60acd 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,14 @@ -# RELEASES: -Its VERY important that you download the correct binary for your console.. if you dont you will probably have a semibrick after install +# CEX2REX 2.0 +How to use: +1) Download the Testkit/DEX PUP file for your firmware and put it @ ux0:/DEX.PUP +2) Run the app and press X to install -!!3.61, 3.63, 3.67, and 3.68 are NOT supported! ONLY 3.60 and 3.65!! - -# For PSTV's ON 3.60: -use: https://bitbucket.org/SilicaAndPina/cex-2-rex/downloads/CexToRex360PSTV.vpk - -# For PSVITA's ON 3.60: -use: https://bitbucket.org/SilicaAndPina/cex-2-rex/downloads/CexToRex360VITA.vpk - -# For PSTV's ON 3.65: -use: https://bitbucket.org/SilicaAndPina/cex-2-rex/downloads/CexToRex365PSTV.vpk - -# For PSVITA's ON 3.65: -use: https://bitbucket.org/SilicaAndPina/cex-2-rex/downloads/CexToRex365VITA.vpk - -# Readme - -Cex To Rex aims to convert a retail console into a Testkit (DEX) console, - -Currently working Testkit features: -Debug Utility -Trophy App "Unlock All" (Doesnt sync, for trophy hacks that sync. check out TropHAX) -Package Installer -Set Auto-Time Off to Never or 60 seconds -Browser app has no "Playstation.com" -PS Store doesnt show up. (can still be added to app.db or launched with psns:) -Both Title Stores. -CMA "Copy Savedata Only" -Show Mode Key Combo (L + R + RIGHT on DPAD + START) -Checker -MiniSettings For QA -Debug Settings -Quick Sign Up -Executing Unsigned Code. (henkaku allready allows this.) - -Currently not working: -Testkit Activation (do we really want this?) -Downgrading.. - -Made in LPP Makes use of VitaRW by Major_Tom, Thx to CelesteBlue for VitaRW_for_lua.bin Thx to: notzecoxao for the Testkit Spoofer kDump.skprx Thx to Voxel9 for Checker and Debug Settings unlock. Thx to: skgleba for dumping 3.65 DEX Firmware. +# Credits +Silica - All Graphics, Most Code +PSM INSTITUTIONS LLC (aka Silica) - Epic "Intellectual Property Notices" +Princess Of Sleeping - PUP Extractor +TheFlow0 - SPKG Decryptor (modoru) +"FAPS TEAM" / dots_tb - CUTTING EDGE NID TECHNOLOGY!!! NOT YET IN VITASDK/MASTER +zecoaxco - spoof_testkit / memdump diff --git a/app.xml b/app.xml new file mode 100644 index 0000000..20339f5 --- /dev/null +++ b/app.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt new file mode 100644 index 0000000..ef7f229 --- /dev/null +++ b/app/CMakeLists.txt @@ -0,0 +1,70 @@ +cmake_minimum_required(VERSION 2.8) + +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + if(DEFINED ENV{VITASDK}) + set(CMAKE_TOOLCHAIN_FILE "$ENV{VITASDK}/share/vita.toolchain.cmake" CACHE PATH "toolchain file") + else() + message(FATAL_ERROR "Please define VITASDK to point to your SDK path!") + endif() +endif() + +project(CEX2REX) + +include("${VITASDK}/share/vita.cmake" REQUIRED) + +set(VITA_APP_NAME "CEX 2 REX 2.0") +set(VITA_TITLEID "CEX2REX20") + +set(VITA_VERSION "02.00") + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + +set(VITA_MKSFOEX_FLAGS "${VITA_MKSFOEX_FLAGS} -s CATEGORY=gdb") +set(VITA_MAKE_FSELF_FLAGS "${VITA_MAKE_FSELF_FLAGS}") + +include_directories( +) + +link_directories( + ${CMAKE_CURRENT_BINARY_DIR} +) + +add_executable(${PROJECT_NAME} + src/main.c + src/ctrl.c + src/pup.c +) + +target_link_libraries(${PROJECT_NAME} + c + SceLibKernel_stub + SceIofilemgr_stub + SceAppMgr_stub + SceCtrl_stub + SceDisplay_stub + SceVshBridge_stub + SceShellSvc_stub + ScePower_stub + SceRegistryMgr_stub + Cex2Rex_User_stub_weak + taihen_stub +) + +vita_create_self(eboot.bin ${PROJECT_NAME} UNSAFE) + +vita_create_vpk(${PROJECT_NAME}.vpk ${VITA_TITLEID} eboot.bin + VERSION ${VITA_VERSION} + NAME ${VITA_APP_NAME} + + FILE sce_sys/icon0.png sce_sys/icon0.png + FILE sce_sys/livearea/contents/bg.png sce_sys/livearea/contents/bg.png + FILE sce_sys/livearea/contents/template.xml sce_sys/livearea/contents/template.xml + FILE user.suprx user.suprx + FILE kernel.skprx kernel.skprx + FILE kmspico.skprx kmspico.skprx + FILE testkit.skprx testkit.skprx + FILE vitaConfig.txt vitaConfig.txt + FILE pstvConfig.txt pstvConfig.txt + FILE app.info app.info +) diff --git a/app/app.info b/app/app.info new file mode 100644 index 0000000000000000000000000000000000000000..ad03e977616bd67f678573815709693673c4bf26 GIT binary patch literal 17472 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 XlPfNl+;#fzdvo0FV)uBbU-JI|T>Qk( literal 0 HcmV?d00001 diff --git a/app/sce_sys/livearea/contents/bg.png b/app/sce_sys/livearea/contents/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..70ff09fa7fb49a08bd3b4b033e434bdd36480f79 GIT binary patch literal 125475 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%0DCM+i?6e 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 KMNUMnLSTZ|dN5}I literal 0 HcmV?d00001 diff --git a/app/sce_sys/livearea/contents/template.xml b/app/sce_sys/livearea/contents/template.xml new file mode 100644 index 0000000..bf0c200 --- /dev/null +++ b/app/sce_sys/livearea/contents/template.xml @@ -0,0 +1,157 @@ + + + + + bg.png + + + + + ja + psm_manual:ux0:psm/CEXR20202 + + | 知的財産の表記 | + + + + en + psm_manual:ux0:psm/CEXR20202 + + | Intellectual Property Notices | + + + + fr + psm_manual:ux0:psm/CEXR20202 + + | Avis de propriété intellectuelle | + + + + es + psm_manual:ux0:psm/CEXR20202 + + | Avisos sobre propiedad intelectual | + + + + de + psm_manual:ux0:psm/CEXR20202 + + | Geistiges Eigentum | + + + + it + psm_manual:ux0:psm/CEXR20202 + + | Avvisi sulla proprietà intellettuale | + + + + nl + psm_manual:ux0:psm/CEXR20202 + + | Intellectuele eigendomsmeldingen | + + + + pt + psm_manual:ux0:psm/CEXR20202 + + | Avisos de propriedade intelectual | + + + + ru + psm_manual:ux0:psm/CEXR20202 + + | Уведомления об интеллектуальной собственности | + + + + ko + psm_manual:ux0:psm/CEXR20202 + + | 지적 재산권 표기 | + + + + ch + psm_manual:ux0:psm/CEXR20202 + + | 知識產權資訊 | + + + + zh + psm_manual:ux0:psm/CEXR20202 + + | 知识产权信息 | + + + + fi + psm_manual:ux0:psm/CEXR20202 + + | Immateriaalioikeudelliset huomautukset | + + + + sv + psm_manual:ux0:psm/CEXR20202 + + | Meddelande om upphovsrätt | + + + + da + psm_manual:ux0:psm/CEXR20202 + + | Meddelelser om immateriel ejendomsret | + + + + no + psm_manual:ux0:psm/CEXR20202 + + | Opphavsrettvarsel | + + + + pl + psm_manual:ux0:psm/CEXR20202 + + | Informacje dotyczące własności intelektualnej | + + + + pt-br + psm_manual:ux0:psm/CEXR20202 + + | Avisos de propriedade intelectual | + + + + en-gb + psm_manual:ux0:psm/CEXR20202 + + | Intellectual Property Notices | + + + + tr + psm_manual:ux0:psm/CEXR20202 + + | Fikri Mülkiyet Bildirimleri | + + + + psm_manual:ux0:psm/CEXR20202 + + | Intellectual Property Notices | + + + + + diff --git a/app/src/ctrl.c b/app/src/ctrl.c new file mode 100644 index 0000000..e7d50d1 --- /dev/null +++ b/app/src/ctrl.c @@ -0,0 +1,58 @@ +#include +#include +#include +#include + +#define printf psvDebugScreenPrintf + +int get_key(int type) { + + + SceCtrlData pad; + + if(type == 0){ + + while (1) { + //memset(&pad, 0, sizeof(pad)); + sceCtrlPeekBufferPositive(0, &pad, 1); + + if (pad.buttons != 0) + return pad.buttons; + + sceKernelDelayThread(1000); // 1ms + } + + }else{ + + while (1) { + + //memset(&pad, 0, sizeof(pad)); + sceCtrlPeekBufferPositive(0, &pad, 1); + if(pad.buttons == 0){ + + break; + + } + + sceKernelDelayThread(1000); // 1ms + + } + + } + + return 0; + +} + + +void press_exit(void) { + + get_key(1); + + printf("Press any key to exit this application.\n"); + + get_key(0); + + sceKernelExitProcess(0); + +} \ No newline at end of file diff --git a/app/src/ctrl.h b/app/src/ctrl.h new file mode 100644 index 0000000..7c21e14 --- /dev/null +++ b/app/src/ctrl.h @@ -0,0 +1,2 @@ +int get_key(int type); +void press_exit(void); \ No newline at end of file diff --git a/app/src/debugScreen.h b/app/src/debugScreen.h new file mode 100644 index 0000000..e06ce5d --- /dev/null +++ b/app/src/debugScreen.h @@ -0,0 +1,184 @@ +#ifndef DEBUG_SCREEN_H +#define DEBUG_SCREEN_H + +#include +#include +#include +#include + + +typedef struct PsvDebugScreenFont { + unsigned char* glyphs, width, height, first, last, size_w, size_h; +} PsvDebugScreenFont; + +#include "debugScreenFont.c" + +#define SCREEN_WIDTH (960) +#define SCREEN_HEIGHT (544) +#define SCREEN_FB_WIDTH (960) +#define SCREEN_FB_SIZE (2 * 1024 * 1024) //Must be 256KB aligned +#ifndef SCREEN_TAB_SIZE /* this allow easy overriding */ +#define SCREEN_TAB_SIZE (8) +#endif +#define SCREEN_TAB_W ((F.size_w) * SCREEN_TAB_SIZE) +#define F psvDebugScreenFont + +#define FROM_GREY(c ) ((((c)*9) <<16) | (((c)*9) <<8) | ((c)*9)) +#define FROM_3BIT(c,dark) (((!!((c)&4))<<23) | ((!!((c)&2))<<15) | ((!!((c)&1))<<7) | (dark ? 0 : 0x7F7F7F)) +#define FROM_6BIT(c ) ((((c)%6)*(51<<16)) | ((((c)/6)%6)*(51<<8)) | ((((c)/36)%6)*51)) +#define FROM_FULL(r,g,b ) ((r<<16) | (g<<8) | (b)) +#define CLEARSCRN(H,toH,W,toW) for(int h = H; h < toH; h++)for(int w = W; w < toW; w++)((uint32_t*)base)[h*SCREEN_FB_WIDTH + w] = colorBg; + +static int mutex, coordX, savedX, coordY, savedY; +static uint32_t defaultFg = 0xFFFFFFFF, colorFg = 0xFFFFFFFF; +static uint32_t defaultBg = 0xFF000000, colorBg = 0xFF000000; + + +#ifdef __vita__ +#include +#include +#include +static void* base; // pointer to frame buffer +#else +#define sceKernelLockMutex(m,v,x) m=v +#define sceKernelUnlockMutex(m,v) m=v +static char base[SCREEN_FB_WIDTH * SCREEN_HEIGHT * 4]; +#endif + +static size_t psvDebugScreenEscape(const unsigned char *str) { + for(unsigned i = 0, argc = 0, arg[32] = {0}; argc < (sizeof(arg)/sizeof(*arg)) && str[i]!='\0'; i++) + switch(str[i]) { + case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9': + arg[argc]=(arg[argc]*10) + (str[i] - '0');continue; + case ';': argc++;continue; + case 's': savedX = coordX; savedY = coordY; return i; + case 'u': coordX = savedX; coordY = savedY; return i; + case 'A': coordY -= arg[0] * (F.size_h); return i; + case 'B': coordY += arg[0] * (F.size_h); return i; + case 'C': coordX += arg[0] * (F.size_w); return i; + case 'D': coordX -= arg[0] * (F.size_w); return i; + case 'E': coordY += arg[0] * (F.size_h); coordX = 0; return i; + case 'F': coordY -= arg[0] * (F.size_h); coordX = 0; return i; + case 'G': coordX = (arg[0]-1) * (F.size_w); return i; + case 'H': + case 'f': coordY = (arg[0]-1) * (F.size_h); + coordX = (arg[1]-1) * (F.size_w); return i; + case 'J': //clear part of (J=screen, K=Line) so J code reuse part of K + case 'K': if(arg[0]==0)CLEARSCRN(coordY, coordY + F.size_h, coordX, SCREEN_WIDTH);//from curosr to end + if(arg[0]==1)CLEARSCRN(coordY, coordY + F.size_h, 0, coordX);//from begining to cursor + if(arg[0]==2)CLEARSCRN(coordY, coordY + F.size_h, 0, SCREEN_WIDTH);//whole line + if(str[i]=='K')return i; + if(arg[0]==0)CLEARSCRN(coordY, SCREEN_HEIGHT, 0, SCREEN_WIDTH); + if(arg[0]==1)CLEARSCRN(0, coordY, 0, SCREEN_WIDTH); + if(arg[0]==2)CLEARSCRN(0, SCREEN_HEIGHT, 0, SCREEN_WIDTH); + return i; + case 'm':// Color + if(!arg[0]) {arg[0] = 39;arg[1] = 49;argc = 1;}//no/0 args == reset BG + FG + for(unsigned c = 0; c <= argc; c++) { + uint32_t unit = arg[c] % 10, mode = arg[c] / 10, *color = mode&1 ? &colorFg : &colorBg; + if (arg[c]==1)colorFg|=0x808080; + if (arg[c]==2)colorFg&=0x7F7F7F; + if (mode!=3 && mode!=4 && mode!=9 && mode!=10)continue;//skip unsported modes + if (unit == 9){ // reset FG or BG + *color = mode&1 ? defaultFg : defaultBg; + } else if ((unit==8) && (arg[c+1]==5)) { // 8bit : [0-15][16-231][232-256] color map + c+=2;*color = arg[c]<=15?FROM_3BIT(arg[c],mode<9):arg[c]>=232?FROM_GREY(arg[c]-232):FROM_6BIT(arg[c]-16); + } else if ((unit==8) && (arg[c+1]==2)) { // 24b color space + *color = FROM_FULL(arg[c+4], arg[c+3], arg[c+2]);c+=4; + } else *color = FROM_3BIT(unit,mode<9); // standard 8+8 colors + } + return i; + } + return 0; +} +int psvDebugScreenInit() { + mutex = sceKernelCreateMutex("log_mutex", 0, 0, NULL); + SceUID displayblock = sceKernelAllocMemBlock("display", SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW, SCREEN_FB_SIZE, NULL); + sceKernelGetMemBlockBase(displayblock, (void**)&base); + SceDisplayFrameBuf frame = { sizeof(frame), base, SCREEN_FB_WIDTH, 0, SCREEN_WIDTH, SCREEN_HEIGHT}; + //reset X/Y + coordX = 0; + coordY = 0; + return sceDisplaySetFrameBuf(&frame, SCE_DISPLAY_SETBUF_NEXTFRAME); +} + +int psvDebugScreenPuts(const char * _text) { + const unsigned char*text = (const unsigned char*)_text; + int bytes_per_glyph = (F.width * F.height) / 8; + sceKernelLockMutex(mutex, 1, NULL); + int c; + for (c = 0; text[c] ; c++) { + unsigned char t = text[c]; + if (t == '\t') { + coordX += SCREEN_TAB_W - coordX % SCREEN_TAB_W; + continue; + } + if (coordX + F.width > SCREEN_WIDTH) { + coordY += F.size_h; + coordX = 0; + } + if (coordY + F.height > SCREEN_HEIGHT) { + coordX = coordY = 0; + } + if (t == '\n') { + coordX = 0; + coordY += F.size_h; + continue; + } else if (t == '\r') { + coordX = 0; + continue; + } else if ((t == '\e') && (text[c+1] == '[')) { + c += psvDebugScreenEscape(text + c + 2) + 2; + if(coordX < 0)coordX = 0;// CSI position are 1-based, + if(coordY < 0)coordY = 0;// prevent 0-based coordiate from producing a negativ X/Y + continue; + }else if ((t > F.last) || (t < F.first)) + continue; // skip non printable glyph + uint32_t *vram = ((uint32_t*)base) + coordX + coordY * SCREEN_FB_WIDTH; + uint8_t *font = &F.glyphs[ (t - F.first) * bytes_per_glyph]; + for (int row = 0, mask = 1 << 7; row < F.height; row++, vram += SCREEN_FB_WIDTH) { + for (uint32_t *pixel = vram, col = 0; col < F.width ; col++, mask>>=1) { + if (!mask) {font++; mask = 1 << 7;}// no more mask : we exausted this byte + *pixel++ = (*font&mask)?colorFg:colorBg; + } + for (uint32_t *pixel = vram + F.width, col = F.width; col < F.size_w ; col++) + *pixel++ = colorBg;// right margin + } + for (int row = F.height; row < F.size_h; row++, vram += SCREEN_FB_WIDTH) + for (uint32_t *pixel = vram, col = 0; col < F.size_w ; col++) + *pixel++ = colorBg;// bottom margin + coordX += F.size_w; + } + sceKernelUnlockMutex(mutex, 1); + return c; +} + +__attribute__((__format__ (__printf__, 1, 2))) +int psvDebugScreenPrintf(const char *format, ...) { + char buf[4096]; + + va_list opt; + va_start(opt, format); + int ret = vsnprintf(buf, sizeof(buf), format, opt); + psvDebugScreenPuts(buf); + va_end(opt); + + return ret; +} + +void psvDebugScreenSetFgColor(uint32_t rgb){ + psvDebugScreenPrintf("\e[38;2;%lu;%lu;%lum", (rgb>>16)&0xFF, (rgb>>8)&0xFF, rgb&0xFF); +} +void psvDebugScreenSetBgColor(uint32_t rgb){ + psvDebugScreenPrintf("\e[48;2;%lu;%lu;%lum", (rgb>>16)&0xFF, (rgb>>8)&0xFF, rgb&0xFF); +} +void psvDebugScreenClear(){ + psvDebugScreenPrintf(" "); + psvDebugScreenPrintf(" "); + psvDebugScreenPrintf(" "); + psvDebugScreenPrintf(" "); + coordX = 0; + coordY = 0; +} +#undef F +#endif diff --git a/app/src/debugScreenFont.c b/app/src/debugScreenFont.c new file mode 100644 index 0000000..cc7f41c --- /dev/null +++ b/app/src/debugScreenFont.c @@ -0,0 +1,111 @@ +/* + * PSP Software Development Kit - http://www.pspdev.org + * ----------------------------------------------------------------------- + * Licensed under the BSD license, see LICENSE in PSPSDK root for details. + * + * font.c - Debug Font. + * + * Copyright (c) 2005 Marcus R. Brown + * Copyright (c) 2005 James Forshaw + * Copyright (c) 2005 John Kelley + * + * $Id: font.c 540 2005-07-08 19:35:10Z warren $ + */ + +PsvDebugScreenFont psvDebugScreenFont = { glyphs:(unsigned char*) +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // +"\x01\x80\x03\xC0\x03\xC0\x03\xC0\x03\xC0\x03\xC0\x03\xC0\x03\xC0\x03\xC0\x03\x80\x01\x80\x01\x80\x01\x80\x00\x00\x00\x00\x01\x80\x03\xC0\x03\xC0\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ! +"\x00\x00\x00\x00\x06\x30\x06\x30\x0C\x60\x0C\x60\x0E\x70\x0E\x70\x06\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // " +"\x00\x00\x00\x00\x03\x18\x03\x18\x07\x38\x07\x38\x3F\xFC\x3F\xFC\x06\x70\x0E\x70\x0E\x70\x0E\x60\x3F\xFC\x3F\xFC\x1C\xE0\x1C\xE0\x1C\xC0\x18\xC0\x18\xC0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // # +"\x01\x80\x01\x80\x07\xC0\x1F\xF0\x1F\xF8\x3D\xB8\x39\xB8\x39\x98\x3D\x80\x1F\x80\x0F\xF0\x03\xF8\x01\xBC\x31\x9C\x39\x9C\x39\x9C\x3D\xB8\x1F\xF8\x07\xE0\x01\x80\x01\x80\x01\x80\x00\x00\x00\x00" // $ +"\x00\x00\x78\x10\xF8\x30\xCC\x20\xCC\x60\xCC\x40\xCC\xC0\xCC\x80\x79\x80\x01\x3C\x03\x66\x02\x66\x06\x66\x0C\x66\x0C\x66\x18\x3C\x10\x3C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // % +"\x00\x00\x00\x00\x00\x00\x00\x00\x07\x80\x0F\xC0\x1C\xE0\x1C\xE0\x1C\xE0\x0F\xC0\x07\x00\x1F\x08\x3B\x9C\x71\xD8\x71\xF8\x70\xF0\x78\xFC\x3F\xDE\x0F\x8C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // & +"\x00\xE0\x00\xC0\x01\xC0\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ' +"\x00\x40\x00\xC0\x01\xC0\x01\x80\x03\x80\x03\x80\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x03\x80\x03\x80\x01\x80\x01\xC0\x00\xC0\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00" // ( +"\x02\x00\x03\x00\x03\x80\x01\x80\x01\xC0\x01\xC0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x01\xC0\x01\xC0\x01\x80\x03\x80\x03\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ) +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xC0\x00\xC0\x00\xC0\x06\xD8\x07\xF8\x00\xC0\x01\xE0\x03\x30\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // * +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x80\x01\x80\x01\x80\x01\x80\x1F\xF8\x1F\xF8\x01\x80\x01\x80\x01\x80\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // + +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x80\x03\x80\x01\x80\x01\x80\x03\x00\x00\x00\x00\x00" // , +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0F\xF0\x0F\xF0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // - +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // . +"\x00\x30\x00\x70\x00\x70\x00\x60\x00\xE0\x00\xE0\x00\xE0\x00\xC0\x01\xC0\x01\xC0\x01\xC0\x01\x80\x03\x80\x03\x80\x03\x80\x03\x00\x07\x00\x07\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // / +"\x00\x00\x07\xE0\x0F\xF0\x1F\xF8\x1C\x38\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x1C\x38\x1F\xF8\x0F\xF0\x07\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 0 +"\x00\x00\x00\x60\x00\xE0\x01\xE0\x03\xE0\x07\xE0\x1F\xE0\x1C\xE0\x18\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 1 +"\x00\x00\x07\xE0\x1F\xF8\x1F\xF8\x3C\x3C\x38\x1C\x38\x1C\x00\x1C\x00\x38\x00\x78\x00\xF0\x03\xE0\x07\x80\x0F\x00\x1E\x00\x3C\x00\x3F\xF8\x3F\xFC\x3F\xFC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 2 +"\x00\x00\x07\xE0\x0F\xF0\x1F\xF8\x3C\x78\x38\x38\x00\x38\x00\x78\x01\xF0\x01\xF0\x00\xF8\x00\x3C\x30\x1C\x38\x1C\x38\x3C\x3C\x78\x1F\xF8\x0F\xF0\x07\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 3 +"\x00\x00\x00\x60\x00\xF0\x00\xF0\x01\xF0\x03\xF0\x03\x70\x07\x70\x0E\x70\x0C\x70\x1C\x70\x38\x70\x38\x70\x3F\xFC\x3F\xFC\x00\x70\x00\x70\x00\x70\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 4 +"\x00\x00\x1F\xFC\x1F\xFC\x1F\xF8\x1C\x00\x1C\x00\x1C\x00\x1F\xE0\x1F\xF0\x1F\xF8\x1C\x3C\x00\x1C\x00\x1C\x00\x1C\x38\x1C\x3C\x38\x3F\xF8\x1F\xF0\x07\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 5 +"\x00\x00\x03\xE0\x0F\xF0\x1F\xF8\x1C\x38\x3C\x18\x38\x00\x38\x00\x3B\xE0\x3F\xF0\x3F\xF8\x3C\x3C\x38\x1C\x38\x1C\x38\x1C\x1C\x3C\x1F\xF8\x0F\xF0\x03\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 6 +"\x00\x00\x3F\xFC\x3F\xFC\x1F\xFC\x00\x38\x00\x70\x00\x70\x00\xE0\x01\xC0\x01\xC0\x03\x80\x03\x80\x03\x80\x07\x80\x07\x00\x07\x00\x07\x00\x07\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 7 +"\x00\x00\x07\xE0\x0F\xF0\x1F\xF8\x1E\x78\x1C\x38\x1C\x38\x1E\x78\x0F\xF0\x0F\xF0\x1C\x38\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x3C\x3C\x1F\xF8\x0F\xF0\x07\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 8 +"\x00\x00\x07\xC0\x0F\xF0\x1F\xF8\x3C\x38\x38\x1C\x38\x1C\x38\x1C\x3C\x3C\x1F\xFC\x0F\xFC\x07\xDC\x00\x1C\x00\x1C\x18\x3C\x1C\x38\x1F\xF8\x0F\xF0\x07\xC0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 9 +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // : +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x80\x03\x80\x01\x80\x01\x80\x03\x00\x02\x00\x00\x00" // ; +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x38\x00\xF8\x03\xF8\x0F\xC0\x1F\x00\x1C\x00\x1F\x00\x0F\xC0\x03\xF8\x00\xF8\x00\x38\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // < +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3F\xFC\x3F\xFC\x3F\xFC\x00\x00\x00\x00\x3F\xFC\x3F\xFC\x3F\xFC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // = +"\x00\x00\x00\x00\x00\x00\x10\x00\x1C\x00\x1F\x00\x1F\xC0\x03\xF0\x00\xF8\x00\x38\x00\xF8\x03\xF0\x1F\xC0\x1F\x00\x1C\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // > +"\x07\xC0\x0F\xF0\x1F\xF0\x3C\x78\x38\x38\x38\x38\x30\x38\x00\x70\x00\xF0\x01\xE0\x03\xC0\x03\x80\x03\x80\x01\x00\x00\x00\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ? +"\x00\x00\x00\x00\x00\x00\x00\x00\x03\xE0\x0F\xF8\x1C\x1C\x10\x04\x23\xB6\x27\xF2\x4C\x72\x5C\x62\x58\x62\x58\x62\x58\x64\x58\xEC\x6F\xF8\x27\x70\x30\x06\x18\x0C\x0F\xFC\x03\xF0\x00\x00\x00\x00" // @ +"\x00\x00\x00\x00\x01\x80\x03\xC0\x03\xC0\x07\xE0\x07\xE0\x0E\x60\x0E\x70\x0E\x70\x1C\x78\x1C\x38\x1C\x38\x3F\xFC\x3F\xFC\x38\x1C\x70\x0E\x70\x0E\x60\x0E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // A +"\x00\x00\x00\x00\x3F\xE0\x3F\xF0\x38\x78\x38\x38\x38\x38\x38\x38\x38\x38\x3F\xF0\x3F\xF0\x38\x38\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x3C\x3F\xF8\x3F\xF0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // B +"\x00\x00\x00\x00\x07\xE0\x0F\xF0\x1E\x78\x3C\x3C\x38\x1C\x78\x0C\x70\x00\x70\x00\x70\x00\x70\x00\x70\x0C\x70\x0C\x38\x1C\x3C\x3C\x1E\x78\x0F\xF0\x07\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // C +"\x00\x00\x00\x00\x3F\xC0\x3F\xF0\x38\xF0\x38\x78\x38\x38\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x38\x38\x78\x38\xF0\x3F\xF0\x3F\xC0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // D +"\x00\x00\x00\x00\x1F\xFC\x1F\xFC\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1F\xF8\x1F\xF8\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1F\xFC\x1F\xFC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // E +"\x00\x00\x00\x00\x0F\xFC\x0F\xFC\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0F\xF8\x0F\xF8\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // F +"\x00\x00\x00\x00\x03\xE0\x0F\xF8\x1C\x3C\x38\x1C\x38\x0E\x70\x0C\x70\x00\x70\x00\x70\xFE\x70\xFE\x70\x0E\x70\x0E\x38\x0E\x38\x0E\x1C\x3E\x0F\xFC\x03\xF0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // G +"\x00\x00\x00\x00\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x3F\xFC\x3F\xFC\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // H +"\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // I +"\x00\x00\x00\x00\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x00\xE0\x70\xE0\x70\xE0\x70\xE0\x79\xE0\x3F\xC0\x3F\xC0\x0F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // J +"\x00\x00\x00\x00\x38\x0C\x38\x1C\x38\x3C\x38\x78\x38\xF0\x39\xE0\x3B\xC0\x3F\xC0\x3F\xE0\x3E\xF0\x3C\x70\x38\x78\x38\x3C\x38\x3C\x38\x1E\x38\x0E\x38\x0E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // K +"\x00\x00\x00\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1F\xF8\x1F\xF8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // L +"\x00\x00\x00\x00\xF8\x1F\xF8\x1F\xFC\x3F\xFC\x3F\xFC\x3F\xEC\x37\xEE\x77\xEE\x77\xEE\x77\xE6\x67\xE7\xE7\xE7\xE7\xE7\xE7\xE3\xC7\xE3\xC7\xE3\xC7\xE1\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // M +"\x00\x00\x00\x00\x18\x1C\x3C\x1C\x3C\x1C\x3E\x1C\x3E\x1C\x3F\x1C\x3B\x1C\x3B\x9C\x39\x9C\x39\xDC\x38\xDC\x38\xFC\x38\x7C\x38\x7C\x38\x3C\x38\x3C\x38\x1C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // N +"\x00\x00\x00\x00\x07\xE0\x0F\xF0\x1F\xF8\x3C\x3C\x38\x1C\x78\x1E\x70\x0E\x70\x0E\x70\x0E\x70\x0E\x70\x0E\x78\x1E\x38\x1C\x3C\x3C\x1F\xF8\x0F\xF0\x07\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // O +"\x00\x00\x00\x00\x3F\xF0\x3F\xF8\x38\x3C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x38\x3F\xF8\x3F\xE0\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // P +"\x00\x00\x00\x00\x07\xE0\x0F\xF0\x1F\xF8\x3C\x3C\x38\x1C\x78\x0E\x70\x0E\x70\x0E\x70\x0E\x70\x0E\x70\x0E\x79\x9E\x38\xFC\x3C\x7C\x1F\xF8\x0F\xFE\x07\xEF\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00" // Q +"\x00\x00\x00\x00\x3F\xF8\x3F\xFC\x38\x1E\x38\x0E\x38\x0E\x38\x0E\x38\x1E\x3F\xFC\x3F\xF0\x38\xE0\x38\x70\x38\x78\x38\x3C\x38\x3C\x38\x1E\x38\x0E\x38\x0E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // R +"\x00\x00\x00\x00\x07\xE0\x1F\xF0\x1C\x38\x38\x38\x38\x18\x3C\x00\x3F\x00\x1F\xE0\x0F\xF8\x01\xF8\x00\x3C\x30\x1C\x38\x1C\x38\x1C\x3C\x38\x1F\xF8\x07\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // S +"\x00\x00\x00\x00\x7F\xFC\x7F\xFC\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // T +"\x00\x00\x00\x00\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x3C\x38\x1F\xF8\x0F\xF0\x07\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // U +"\x00\x00\x00\x00\x38\x06\x38\x0E\x38\x0E\x1C\x1C\x1C\x1C\x1C\x1C\x0E\x18\x0E\x38\x0E\x38\x0E\x30\x07\x70\x07\x70\x07\x60\x03\xE0\x03\xE0\x03\xC0\x01\xC0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // V +"\x00\x00\x00\x00\xC1\x83\xC3\xC3\xE3\xC7\xE3\xC7\xE3\xC7\x63\xC6\x66\x66\x66\x66\x76\x6E\x76\x6E\x36\x6C\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x1C\x38\x18\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // W +"\x00\x00\x00\x00\x30\x0C\x38\x1E\x3C\x1C\x1C\x3C\x1E\x78\x0F\xF0\x07\xF0\x07\xE0\x03\xC0\x07\xE0\x0F\xF0\x1F\xF8\x1E\x78\x3C\x3C\x78\x1E\x78\x1E\x70\x0E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // X +"\x00\x00\x00\x00\x30\x18\x78\x1C\x38\x38\x3C\x38\x1C\x70\x1E\xF0\x0E\xE0\x07\xC0\x07\xC0\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // Y +"\x00\x00\x00\x00\x3F\xF8\x3F\xF8\x00\x78\x00\x78\x00\xF0\x01\xF0\x01\xE0\x03\xC0\x07\x80\x07\x80\x0F\x00\x1E\x00\x1E\x00\x3C\x00\x78\x00\x7F\xFC\x7F\xFC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // Z +"\x00\x00\x01\xE0\x01\xE0\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\xE0\x01\xE0\x00\x00\x00\x00" // [ +"\x00\x00\x00\x00\x0C\x00\x1E\x00\x0E\x00\x0F\x00\x07\x00\x07\x00\x07\x80\x03\x80\x03\x80\x03\xC0\x01\xC0\x01\xC0\x01\xE0\x00\xE0\x00\xE0\x00\xF0\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // +"\x00\x00\x0F\x80\x0F\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x0F\x80\x0F\x80\x00\x00\x00\x00" // ] +"\x00\x00\x00\x00\x03\x80\x07\x80\x07\x80\x07\xC0\x0E\xC0\x0C\xE0\x1C\xE0\x1C\x60\x38\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ^ +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00" // _ +"\x00\x00\x00\x00\x1C\x00\x3E\x00\x63\x00\x63\x00\x63\x00\x3E\x00\x1C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ` +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0F\xC0\x1F\xE0\x18\x70\x10\x70\x00\xF0\x0F\xF0\x1E\x70\x38\x70\x38\x70\x38\xF0\x1F\xF0\x0E\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // a +"\x00\x00\x00\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1C\x00\x1D\xF0\x1F\xF8\x1E\x38\x1E\x1C\x1C\x1C\x1C\x1C\x1C\x1C\x1C\x1C\x1E\x1C\x1E\x38\x1F\xF8\x1D\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // b +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xC0\x0F\xF0\x1C\x70\x3C\x38\x38\x10\x38\x00\x38\x00\x38\x10\x3C\x38\x1C\x78\x0F\xF0\x07\xC0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // c +"\x00\x00\x00\x00\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x0F\xB8\x1F\xF8\x1C\x78\x38\x78\x38\x38\x38\x38\x38\x38\x38\x38\x38\x78\x1C\x78\x1F\xF8\x07\xB8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // d +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xC0\x0F\xE0\x1C\x70\x38\x38\x38\x38\x3F\xF8\x3F\xF0\x38\x00\x38\x10\x1C\x38\x0F\xF0\x07\xC0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // e +"\x00\x00\x00\x00\x03\xE0\x07\xE0\x07\x00\x07\x00\x07\x00\x1F\xC0\x1F\xC0\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // f +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0F\xB8\x1F\xF8\x1C\x78\x38\x38\x38\x38\x38\x38\x38\x38\x38\x38\x38\x38\x1C\x78\x1F\xF8\x07\xB8\x10\x38\x38\x38\x1C\x70\x1F\xF0\x07\xC0" // g +"\x00\x00\x00\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x3B\xC0\x3F\xE0\x3C\xF0\x38\x70\x38\x70\x38\x70\x38\x70\x38\x70\x38\x70\x38\x70\x38\x70\x38\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // h +"\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // i +"\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x1F\x80\x1F\x00" // j +"\x00\x00\x00\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x18\x0E\x38\x0E\x70\x0E\xE0\x0F\xC0\x0F\xE0\x0F\x70\x0E\x70\x0E\x38\x0E\x38\x0E\x1C\x0E\x0C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // k +"\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // l +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xEF\x9E\xFF\xFF\xF1\xE7\xE1\xC7\xE1\xC7\xE1\xC7\xE1\xC7\xE1\xC7\xE1\xC7\xE1\xC7\xE1\xC7\xE1\xC7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // m +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1D\xE0\x1F\xF0\x1E\x78\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // n +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0F\x80\x1F\xC0\x38\xE0\x70\x70\x70\x70\x70\x70\x70\x70\x70\x70\x70\x70\x38\xE0\x1F\xC0\x0F\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // o +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3B\xC0\x3F\xF0\x3C\x70\x3C\x38\x38\x38\x38\x38\x38\x38\x38\x38\x3C\x38\x3C\x70\x3F\xF0\x3B\xC0\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00" // p +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xB8\x1F\xF8\x1C\x78\x38\x78\x38\x38\x38\x38\x38\x38\x38\x38\x38\x78\x1C\x78\x1F\xF8\x07\xB8\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38" // q +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0E\xE0\x0F\xF0\x0F\x10\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x0E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // r +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xC0\x0F\xF0\x1C\x70\x1C\x30\x1F\x00\x0F\xE0\x03\xF0\x00\x78\x1C\x38\x1E\x38\x0F\xF0\x07\xE0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // s +"\x00\x00\x00\x00\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x07\xE0\x0F\xE0\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\xF0\x01\xF0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // t +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1C\x38\x1E\x78\x0F\xF8\x07\xB8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // u +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x1C\x38\x1C\x38\x0C\x30\x0E\x70\x0E\x70\x06\x60\x07\xE0\x03\xC0\x03\xC0\x03\xC0\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // v +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xC1\x83\xE3\xC7\xE3\xC7\x63\xC6\x67\xE6\x76\x6E\x36\x6C\x36\x6C\x3E\x7C\x1C\x38\x1C\x38\x1C\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // w +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x38\x3C\x78\x1E\xF0\x0F\xE0\x07\xC0\x07\xC0\x0F\xE0\x0E\xE0\x1E\xF0\x3C\x78\x38\x38\x30\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // x +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x18\x1C\x38\x1C\x38\x0C\x30\x0E\x70\x0E\x70\x06\x60\x07\x60\x07\xE0\x03\xC0\x03\xC0\x03\xC0\x01\x80\x03\x80\x03\x80\x1F\x00\x1E\x00" // y +"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3F\xF8\x3F\xF8\x00\x78\x00\xF0\x01\xE0\x03\xC0\x07\x80\x07\x00\x0E\x00\x1E\x00\x3F\xF8\x3F\xF8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // z +"\x00\x70\x00\xF0\x01\xF0\x01\xC0\x01\xC0\x01\xC0\x01\xC0\x01\xC0\x01\xC0\x03\x80\x07\x80\x07\x80\x03\x80\x01\xC0\x01\xC0\x01\xC0\x01\xC0\x01\xC0\x01\xC0\x01\xF0\x00\xF0\x00\x70\x00\x00\x00\x00" // { +"\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x03\x80\x00\x00\x00\x00" // | +"\x1C\x00\x1E\x00\x1F\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x03\x80\x03\xC0\x03\xC0\x03\x80\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x1F\x00\x1E\x00\x1C\x00\x00\x00\x00\x00" // } +"\x00\x00\x00\x00\x00\x00\x1E\x08\x3F\xF8\x3F\xF8\x20\xF0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", // ~ +width:16, height:24, first:32, last:126, size_w:16, size_h:24}; \ No newline at end of file diff --git a/app/src/main.c b/app/src/main.c new file mode 100644 index 0000000..bae80d8 --- /dev/null +++ b/app/src/main.c @@ -0,0 +1,525 @@ +#include +#include +#include +#include +#include + +#include + +#include "ctrl.h" +#include "debugScreen.h" +#include "pup.h" + +#define printf psvDebugScreenPrintf + +int ret; +int left = -1; + +int getFileSize(const char *file) { + SceUID fd = sceIoOpen(file, SCE_O_RDONLY, 0); + if (fd < 0) + return fd; + int fileSize = sceIoLseek(fd, 0, SCE_SEEK_END); + sceIoClose(fd); + return fileSize; +} + +int WriteFile(char *file, void *buf, int size) { + SceUID fd = sceIoOpen(file, SCE_O_RDWR | SCE_O_CREAT, 0777); + if (fd < 0) + return fd; + + int written = sceIoWrite(fd, buf, size); + + sceIoClose(fd); + return written; +} + +int ReadFile(char *file, void *buf, int size) { + SceUID fd = sceIoOpen(file, SCE_O_RDONLY, 0777); + if (fd < 0) + return fd; + + int readed = sceIoRead(fd, buf, size); + + sceIoClose(fd); + return readed; +} + +int CopyFile(char *src, char *dst) +{ + int size = getFileSize(src); + char *data = malloc(size); + memset(data,0,size); + ret = ReadFile(src,data,size); + if(ret < 0){ + psvDebugScreenPrintf("ReadFile() failed. ret = 0x%x\n", ret); + while(1){}; + } + ret = WriteFile(dst,data,size); + if(ret < 0){ + psvDebugScreenPrintf("WriteFile() failed. ret = 0x%x\n", ret); + } + return 0; +} + +void load_modules() +{ + char titleid[12]; + char kplugin_path[0x200]; + char uplugin_path[0x200]; + + sceAppMgrUmount("app0:"); + sceAppMgrAppParamGetString(0, 12, titleid , 256); + + sprintf(kplugin_path, "ux0:app/%s/kernel.skprx", titleid); + sprintf(uplugin_path, "ux0:app/%s/user.suprx", titleid); + printf("kplugin_path: %s\n",kplugin_path); + printf("uplugin_path: %s\n",uplugin_path); + int kernel_modid, user_modid; + + kernel_modid = taiLoadStartKernelModule(kplugin_path, 0, NULL, 0); + if(kernel_modid < 0){ + printf("taiLoadStartKernelModule() failed. ret = 0x%x\n", kernel_modid); + } + user_modid = sceKernelLoadStartModule(uplugin_path, 0, NULL, 0, NULL, NULL); + if(user_modid < 0){ + printf("sceKernelLoadStartModule() failed. ret = 0x%x\n", user_modid); + } + psvDebugScreenClear(0); + return; +} + + +void config() +{ + int spoofer = 0; + int activator = 0; + psvDebugScreenClear(0); + + psvDebugScreenPrintf("Installation Type\n"); + psvDebugScreenPrintf("X: Full Install (spoofer + activator + testkit vsh)\n"); + psvDebugScreenPrintf("O: Warning Message Install (spoofer + testkit vsh)\n"); + psvDebugScreenPrintf("[]: Enso-less Install (testkit vsh)\n"); + + sceKernelDelayThread(100000); + + switch(get_key(0)) { + case SCE_CTRL_CROSS: + activator = 1; + spoofer = 1; + break; + case SCE_CTRL_CIRCLE: + spoofer = 1; + break; + case SCE_CTRL_SQUARE: + break; + default: + sceKernelExitProcess(0); + break; + } + + + psvDebugScreenClear(); + sceIoRemove("ur0:tai/testkit.skprx"); + sceIoRemove("ur0:tai/kmspico.skprx"); + + if(spoofer) + { + psvDebugScreenPrintf("Writing testkit.skprx"); + CopyFile("app0:/testkit.skprx","ur0:tai/testkit.skprx"); + + int pstv = vshSblAimgrIsGenuineDolce(); + if(pstv) + { + CopyFile("app0:/pstvConfig.txt","ur0:tai/boot_config.txt"); + } + else + { + CopyFile("app0:/vitaConfig.txt","ur0:tai/boot_config.txt"); + } + } + + if(activator) + { + psvDebugScreenPrintf("Writing kmspico.skprx"); + CopyFile("app0:/kmspico.skprx","ur0:tai/kmspico.skprx"); + } +} + +void cleanup() +{ + char path[0x1028]; + SceUID dfd = sceIoDopen("ur0:/pup_out"); + if (dfd >= 0) { + int ret = 0; + do { + SceIoDirent dir; + memset(&dir, 0, sizeof(SceIoDirent)); + ret = sceIoDread(dfd, &dir); + if (ret > 0) { + snprintf(path, 0x1028, "ur0:/pup_out/%s", dir.d_name); + sceIoRemove(path); + } + } + while(ret > 0); + } + sceIoRemove("ur0:/vs0.img"); + sceIoRmdir("ur0:/pup_out"); +} + +void lock() +{ + sceShellUtilInitEvents(0); + sceShellUtilLock(SCE_SHELL_UTIL_LOCK_TYPE_QUICK_MENU | + SCE_SHELL_UTIL_LOCK_TYPE_POWEROFF_MENU | + SCE_SHELL_UTIL_LOCK_TYPE_USB_CONNECTION | + SCE_SHELL_UTIL_LOCK_TYPE_MC_INSERTED | + SCE_SHELL_UTIL_LOCK_TYPE_MC_REMOVED | + SCE_SHELL_UTIL_LOCK_TYPE_MUSIC_PLAYER | + SCE_SHELL_UTIL_LOCK_TYPE_PS_BTN_2); + scePowerSetCallbackEnabled(0); // Magical NID engineered by FAPS TEAM ;) +} + +void extract() +{ + cleanup(); + psvDebugScreenClear(); + psvDebugScreenPrintf("Extracting DEX.PUP...\n"); + scePlayStartionUpdatePackageExtractStage1("ux0:/DEX.PUP"); +} + +void vercheck() +{ + static char version[16]; + char target_version[16]; + + memset(version, 0x00, 16); + memset(target_version, 0x00, 16); + + psvDebugScreenClear(); + + SceKernelFwInfo data; + data.size = sizeof(SceKernelFwInfo); + + _vshSblGetSystemSwVersion(&data); + + snprintf(version, 16, "%s", data.versionString); + ReadFile("ur0:/pup_out/version.txt",target_version,4); + + if(strcmp(target_version,version) != 0) + { + psvDebugScreenPrintf("ux0:/DEX.PUP version is %s\nBut your current version is %s. cannot continue\nPlease update your console to retail %s first.\nor download the DEX %s.PUP",target_version,version,target_version,version); + sceKernelDelayThread(10000000); + cleanup(); + sceKernelExitProcess(0); + } + +} + +void decrypt() +{ + char path[0x1028]; + char pathout[0x1028]; + + int vs0Count = 0; + int type = 0; + + psvDebugScreenClear(); + psvDebugScreenPrintf("Decrypting DEX.PUP\n"); + + for(int i = 0; i <= 26; i++) + { + memset(path,0x00,0x1028); + memset(pathout,0x00,0x1028); + sprintf(path,"ur0:/pup_out/package_data%02i.pkg",i); + sprintf(pathout,"ur0:/pup_out/pkg-%i.dec",i); + int sz = getFileSize(path); + if(sz > 0) + { + + psvDebugScreenPrintf("Decrypting %s\n",path); + int ret = DecryptSpkgFile(path,pathout); + if(ret < 0) + { + psvDebugScreenClear(); + psvDebugScreenPrintf("Error decrypting %s",path); + sceKernelDelayThread(10000000); + cleanup(); + sceKernelExitProcess(0); + } + sceIoRemove(path); + + int fd = sceIoOpen(pathout, SCE_O_RDONLY, 0777); + sceIoLseek(fd,0x404,SCE_SEEK_SET); + sceIoRead(fd,&type, sizeof(int)); + sceIoClose(fd); + + if(type == 0x0A) + { + char newName[0x1028]; + memset(newName,0x00,0x1028); + sprintf(newName,"ur0:/pup_out/vs0-%i.dec",vs0Count); + sceIoRename(pathout, newName); + vs0Count += 1; + } + sceIoRemove(pathout); + + } + + } + return; +} + +void join() +{ + psvDebugScreenClear(); + psvDebugScreenPrintf("Concatenating package data...\n"); + char path[0x1028]; + int fd = 0; + int sz = 0; + char buffer[0x8000]; + int vs0Img = sceIoOpen("ur0:/vs0.img", SCE_O_RDWR | SCE_O_CREAT, 0777); + + for(int i = 0; i <= 26; i++) + { + memset(path,0x00,0x1028); + sprintf(path,"ur0:/pup_out/vs0-%i.dec",i); + psvDebugScreenPrintf("Adding %s to vs0.img\n",path); + + sz = getFileSize(path) - 0x480; + + fd = sceIoOpen(path,SCE_O_RDONLY, 0777); + sceIoLseek(fd, 0x480, SCE_SEEK_SET); + + while(!(sz <= 0)) + { + memset(buffer,0x00,0x8000); + if(sz < 0x8000) + { + sceIoRead(fd, buffer, sz); + ret = sceIoWrite(vs0Img, buffer, sz); + sz -= sz; + } + else + { + sceIoRead(fd, buffer, 0x8000); + ret = sceIoWrite(vs0Img, buffer, 0x8000); + sz -= 0x8000; + } + } + sceIoClose(fd); + sceIoRemove(path); + + } + sceIoClose(vs0Img); + psvDebugScreenClear(); +} + +void restore() +{ + psvDebugScreenClear(); + if(getFileSize("ur0:/vs0-orig.img") < 0){ + psvDebugScreenPrintf("ur0:/vs0-orig.img MISSING, cannot restore\nIf you must go back, reinstall your firmware w official updater"); + sceKernelDelayThread(10000000); + sceKernelExitProcess(0); + } + + psvDebugScreenPrintf("Beginning restore in 10 seconds,\nDO NOT TURN OFF YOUR CONSOLE\nOR EXIT THIS APP WHILE RESTORING!\n"); + sceKernelDelayThread(10000000); + + psvDebugScreenClear(); + + dd("ur0:/vs0-orig.img","sdstor0:int-lp-ign-vsh", 0x10000000); // start dd + do + { + left = getTotalLeft(); + + int total = 0x10000000 - left; + float percent = (float)total / 268435456 * 100.0; + + psvDebugScreenPrintf("Restoring ur0:/vs0-orig.img %i/268435456 - %.2f%%\n",total, percent); + + sceKernelPowerTick(SCE_KERNEL_POWER_TICK_DISABLE_AUTO_SUSPEND); + sceKernelPowerTick(SCE_KERNEL_POWER_TICK_DISABLE_OLED_OFF); + coordX = 0; + coordY = 0; + } + while(left != 0x50000001); + + psvDebugScreenClear(); + + sceIoRemove("ur0:tai/testkit.skprx"); + sceIoRemove("ur0:tai/kmspico.skprx"); + sceIoRemove("ur0:/vs0-orig.img"); + + psvDebugScreenClear(); + psvDebugScreenPrintf("Restore complete~ Your console is now a retail again"); + sceKernelDelayThread(10000000); + scePowerRequestColdReset(); +} + +void backup() +{ + sceIoRemove("ur0:/vs0-orig.img"); + WriteFile("ur0:/vs0-orig.img",NULL,0x00); // create vs0.img + + dd("sdstor0:int-lp-ign-vsh","ur0:/vs0-orig.img", 0x10000000); //start dd + do + { + left = getTotalLeft(); + + int total = 0x10000000 - left; + float percent = (float)total / 268435456 * 100.0; + + psvDebugScreenPrintf("Creating ur0:/vs0-orig.img %i/268435456 - %.2f%%\n",total, percent); + + sceKernelPowerTick(SCE_KERNEL_POWER_TICK_DISABLE_AUTO_SUSPEND); + sceKernelPowerTick(SCE_KERNEL_POWER_TICK_DISABLE_OLED_OFF); + coordX = 0; + coordY = 0; + } + while(left != 0x50000001); + + psvDebugScreenClear(); +} + +void flash() +{ + psvDebugScreenPrintf("Beginning flash in 10 seconds,\nDO NOT TURN OFF YOUR CONSOLE OR EXIT THIS APP WHILE FLASHING\n"); + sceKernelDelayThread(10000000); + + psvDebugScreenClear(); + + dd("ur0:/vs0.img","sdstor0:int-lp-ign-vsh", 0x10000000); // start dd + do + { + left = getTotalLeft(); + + int total = 0x10000000 - left; + float percent = (float)total / 268435456 * 100.0; + + psvDebugScreenPrintf("Flashing ur0:/vs0.img %i/268435456 - %.2f%%\n",total, percent); + + sceKernelPowerTick(SCE_KERNEL_POWER_TICK_DISABLE_AUTO_SUSPEND); + sceKernelPowerTick(SCE_KERNEL_POWER_TICK_DISABLE_OLED_OFF); + coordX = 0; + coordY = 0; + } + while(left != 0x50000001); + + cleanup(); + psvDebugScreenClear(); + psvDebugScreenPrintf("Flash complete~ Your console is now a \"testkit\""); + sceKernelDelayThread(10000000); + scePowerRequestColdReset(); +} + +void uninstall() +{ + load_modules(); + lock(); + restore(); +} + +void install() +{ + extract(); + vercheck(); + config(); + load_modules(); + lock(); + decrypt(); + join(); + backup(); + flash(); +} + +int isRex() +{ + if(getFileSize("vs0:/app/NPXS10104/eboot.bin") > 0) + { + return 1; + } + else + { + return 0; + } +} + +void copyappinfo() // Setup Epic "interlectural property notices" thing +{ + if(getFileSize("ux0:/psm/CEXR20202/RO/Application/app.info") != getFileSize("app0:/app.info")) + { + sceIoMkdir("ux0:/psm", 0777); + sceIoMkdir("ux0:/psm/CEXR20202", 0777); + sceIoMkdir("ux0:/psm/CEXR20202/RO", 0777); + sceIoMkdir("ux0:/psm/CEXR20202/RO/Application", 0777); + CopyFile("app0:/app.info","ux0:/psm/CEXR20202/RO/Application/app.info"); + } +} + +int main() { + copyappinfo(); + psvDebugScreenInit(); + psvDebugScreenClear(0); + int size = getFileSize("ux0:/DEX.PUP"); + if(size <= 0) + { + char version[16]; + SceKernelFwInfo data; + data.size = sizeof(SceKernelFwInfo); + _vshSblGetSystemSwVersion(&data); + snprintf(version, 16, "%s", data.versionString); + + psvDebugScreenPrintf("ux0:/DEX.PUP NOT FOUND!\nPlease download the DEX %s firmware update file (.PUP)\nAnd place it in ux0:/DEX.PUP",version); + while(1){}; + } + + if(isRex() == 0) + { + psvDebugScreenPrintf("CEX-2-REX 2.0 - Currently CEX\n"); + psvDebugScreenPrintf("X: Install TestKit Firmware\n"); + + sceKernelDelayThread(100000); + while(1) + { + switch(get_key(0)) { + case SCE_CTRL_CROSS: + install(); + break; + default: + break; + } + } + } + else + { + psvDebugScreenPrintf("CEX-2-REX 2.0 - Currently REX\n"); + psvDebugScreenPrintf("X: Uninstall TestKit Firmware\n"); + psvDebugScreenPrintf("O: Change Installation Type\n"); + + sceKernelDelayThread(100000); + while(1) + { + switch(get_key(0)) { + case SCE_CTRL_CROSS: + uninstall(); + break; + case SCE_CTRL_CIRCLE: + config(); + scePowerRequestColdReset(); + break; + default: + break; + } + } + } + + + + + + + return 0; +} diff --git a/app/src/pup.c b/app/src/pup.c new file mode 100644 index 0000000..37d62f4 --- /dev/null +++ b/app/src/pup.c @@ -0,0 +1,222 @@ +/* +* Adapted from Princess Of Sleeping's PUP extractor +* https://github.com/Princess-of-Sleeping/PSV-PUP-Extractor +*/ + +#include "pup.h" +int psvDebugScreenPrintf(const char *format, ...); +void psvDebugScreenClear(); + +int NotExistMkdir(char *path){ + + int dfd = sceIoDopen(path); + if(dfd >= 0){ + + sceIoDclose(dfd); + + }else{ + + sceIoMkdir(path, 0777); + + } + + return 0; + +} + + +int scePlayStartionUpdatePackageExtractStage1(char *ext_pup_path) { + SceUID file_check = sceIoOpen(ext_pup_path, SCE_O_RDONLY, 0); + if(file_check < 0){ + return file_check; + } + + ScePlayStartionUpdatePackageHeader1 header; + sceIoPread(file_check, &header, sizeof(ScePlayStartionUpdatePackageHeader1), 0); + sceIoPread(file_check, temp_buff, sizeof(temp_buff), 0); + + if(BYTE_SWAP_64(header.magic) != 0x5343455546000001){ + return -1; + } + + sceGetPlayStartionUpdatePackageInfo(&header); + + sprintf(pup_dec_dir, "ur0:/pup_out/"); + NotExistMkdir(pup_dec_dir); + + for(int i=0;ipup_type); + return 0; + +} + + +void sceGetPlayStartionUpdatePackageFileEntryId(void *buff, int entry_id){ + switch (entry_id) { + + case 0x100:sprintf(buff, "version.txt");break; + case 0x101:sprintf(buff, "license.xml");break; + case 0x200:sprintf(buff, "psp2swu.self");break; + case 0x204:sprintf(buff, "cui_setupper.self");break; + + case 0x221:sprintf(buff, "psv_package_data01.pkg");break; + case 0x231:sprintf(buff, "psv_package_data02.pkg");break; + + case 0x301:sprintf(buff, "package_data01.pkg");break; + case 0x302:sprintf(buff, "package_data02.pkg");break; + case 0x303:sprintf(buff, "package_data03.pkg");break; + case 0x304:sprintf(buff, "package_data04.pkg");break; + case 0x305:sprintf(buff, "package_data05.pkg");break; + case 0x306:sprintf(buff, "package_data06.pkg");break; + case 0x307:sprintf(buff, "package_data07.pkg");break; + case 0x308:sprintf(buff, "package_data08.pkg");break; + case 0x309:sprintf(buff, "package_data09.pkg");break; + case 0x30A:sprintf(buff, "package_data10.pkg");break; + case 0x30B:sprintf(buff, "package_data11.pkg");break; + case 0x30C:sprintf(buff, "package_data12.pkg");break; + case 0x30D:sprintf(buff, "package_data13.pkg");break; + case 0x30E:sprintf(buff, "package_data14.pkg");break; + case 0x30F:sprintf(buff, "package_data15.pkg");break; + case 0x310:sprintf(buff, "package_data16.pkg");break; + case 0x311:sprintf(buff, "package_data17.pkg");break; + case 0x312:sprintf(buff, "package_data18.pkg");break; + case 0x313:sprintf(buff, "package_data19.pkg");break; + case 0x314:sprintf(buff, "package_data20.pkg");break; + case 0x315:sprintf(buff, "package_data21.pkg");break; + case 0x316:sprintf(buff, "package_data22.pkg");break; + case 0x317:sprintf(buff, "package_data23.pkg");break; + case 0x318:sprintf(buff, "package_data24.pkg");break; + case 0x319:sprintf(buff, "package_data25.pkg");break; + case 0x31A:sprintf(buff, "package_data26.pkg");break; + + case 0x31B:sprintf(buff, "unknown_0x31B");break; + case 0x31C:sprintf(buff, "unknown_0x31C");break; + case 0x31D:sprintf(buff, "unknown_0x31D");break; + case 0x31E:sprintf(buff, "unknown_0x31E");break; + case 0x31F:sprintf(buff, "unknown_0x31F");break; + case 0x320:sprintf(buff, "unknown_0x320");break; + case 0x321:sprintf(buff, "unknown_0x321");break; + case 0x322:sprintf(buff, "unknown_0x322");break; + case 0x323:sprintf(buff, "unknown_0x323");break; + case 0x324:sprintf(buff, "unknown_0x324");break; + case 0x325:sprintf(buff, "unknown_0x325");break; + + case 0x326:sprintf(buff, "debug_data00.pkg");break; + case 0x327:sprintf(buff, "debug_data01.pkg");break; + case 0x328:sprintf(buff, "debug_data02.pkg");break; + case 0x329:sprintf(buff, "debug_data03.pkg");break; + case 0x32A:sprintf(buff, "debug_data04.pkg");break; + case 0x32B:sprintf(buff, "debug_data05.pkg");break; + case 0x32C:sprintf(buff, "debug_data06.pkg");break; + + case 0x32D:sprintf(buff, "unknown_0x32D");break; + case 0x32E:sprintf(buff, "unknown_0x32E");break; + case 0x32F:sprintf(buff, "unknown_0x32F");break; + case 0x330:sprintf(buff, "unknown_0x330");break; + case 0x331:sprintf(buff, "unknown_0x331");break; + case 0x332:sprintf(buff, "unknown_0x332");break; + case 0x333:sprintf(buff, "unknown_0x333");break; + case 0x334:sprintf(buff, "unknown_0x334");break; + case 0x335:sprintf(buff, "unknown_0x335");break; + case 0x336:sprintf(buff, "unknown_0x336");break; + case 0x337:sprintf(buff, "unknown_0x337");break; + case 0x338:sprintf(buff, "unknown_0x338");break; + + case 0x400:sprintf(buff, "package_scewm.wm");break; + case 0x401:sprintf(buff, "package_sceas.as");break; + + + default:{ + + sprintf(buff, "unknown_0x%X", entry_id); + + } + + } + psvDebugScreenPrintf("Extracting ur0:/pup_out/%s\n",(char*)buff); +} + + +char pup_buffer[0x20000]; + +int scePlayStartionUpdatePackageExtractFiles(char *pup_dec_dir, SceUID file_check, int i, SceUInt32 file_count, void *header){ + + char write_file_name[0x100]; + char write_file_path[0x200]; + + uint32_t base_addr1 = 0x80 + (0x20 * i); + uint32_t base_addr2 = (0x80 + (0x20 * file_count)) + (0x40 * i); + + ScePlayStartionUpdatePackageHeader2 header2; + ScePlayStartionUpdatePackageHeader3 header3; + + sceIoPread(file_check, &header2, sizeof(ScePlayStartionUpdatePackageHeader2), base_addr1); + sceIoPread(file_check, &header3, sizeof(ScePlayStartionUpdatePackageHeader3), base_addr2); + + sceGetPlayStartionUpdatePackageFileEntryId(write_file_name, header2.entry_id); + + sprintf(write_file_path, "%s%s", pup_dec_dir, write_file_name); + + int fd = sceIoOpen(write_file_path, SCE_O_TRUNC | SCE_O_CREAT | SCE_O_WRONLY, 0777); + + + if(fd < 0){ + return fd; + } + + + uint32_t plus_address = 0x0, read_size = sizeof(pup_buffer); + + do { + + if((plus_address + sizeof(pup_buffer)) > header2.data_length){ + + read_size = (plus_address + sizeof(pup_buffer)) - header2.data_length; + + read_size = sizeof(pup_buffer) - read_size; + + } + + int sipr = sceIoPread(file_check, pup_buffer, read_size, header2.data_offset + plus_address); + + sceIoWrite(fd, pup_buffer, sipr); + + plus_address += sizeof(pup_buffer); + + } while (plus_address < header2.data_length); + + + + sceIoClose(fd); + + + return 0; + +} + diff --git a/app/src/pup.h b/app/src/pup.h new file mode 100644 index 0000000..ed285ae --- /dev/null +++ b/app/src/pup.h @@ -0,0 +1,102 @@ +/* +* Adapted from Princess Of Sleeping's PUP extractor +* https://github.com/Princess-of-Sleeping/PSV-PUP-Extractor +*/ + +#include + +#include +#include +#include + +#include + +#include +#include +#include + +#define _BYTE1(x) ( (x >> 0x00) & 0xFF ) +#define _BYTE2(x) ( (x >> 0x08) & 0xFF ) +#define _BYTE3(x) ( (x >> 0x10) & 0xFF ) +#define _BYTE4(x) ( (x >> 0x18) & 0xFF ) +#define _BYTE5(x) ( (x >> 0x20) & 0xFF ) +#define _BYTE6(x) ( (x >> 0x28) & 0xFF ) +#define _BYTE7(x) ( (x >> 0x30) & 0xFF ) +#define _BYTE8(x) ( (x >> 0x38) & 0xFF ) + +#define BYTE_SWAP_16(x) ((uint16_t)( _BYTE1(x)<<8 | _BYTE2(x) )) +#define BYTE_SWAP_32(x) ((uint32_t)( _BYTE1(x)<<0x18 | _BYTE2(x)<<0x10 | _BYTE3(x)<<8 | _BYTE4(x) )) +#define BYTE_SWAP_64(x) ((SceUInt64)( _BYTE1(x)<<0x38 | _BYTE2(x)<<0x30 | _BYTE3(x)<<0x28 | _BYTE4(x)<<0x20 | _BYTE5(x)<<0x18 | _BYTE6(x)<<0x10 | _BYTE7(x)<<0x8 | _BYTE8(x)<<0x0 )) + +typedef struct { + SceUInt64 magic; + SceUInt32 package_version; //0x00000008 + SceUInt32 unknown_0x0C; + SceUInt32 image_version; //0x00000010 + SceUInt32 unknown_0x14; + SceUInt32 file_count; //0x00000018 + SceUInt32 unknown_0x1C; + SceUInt32 header_length; //0x00000020 + SceUInt32 unknown_0x24; + SceUInt32 package_length; //0x00000028 + SceUInt32 unknown_0x2C; + SceUInt32 unknown_0x30; + SceUInt32 unknown_0x34; + SceUInt32 unknown_0x38; + SceUInt32 pup_type; //0x0000003C + SceUInt32 unknown_0x40; + SceUInt32 unknown_0x44; + SceUInt32 unknown_0x48; + SceUInt32 unknown_0x4C; + SceUInt32 unknown_0x50; + SceUInt32 unknown_0x54; + SceUInt32 unknown_0x58; + SceUInt32 unknown_0x5C; + SceUInt32 unknown_0x60; + SceUInt32 unknown_0x74; + SceUInt32 unknown_0x78; + SceUInt32 unknown_0x7C; +} __attribute__((packed)) ScePlayStartionUpdatePackageHeader1; + +typedef struct { + SceUInt32 entry_id; + SceUInt32 unknown_0x04; + SceUInt32 data_offset; //0x00000008 + SceUInt32 unknown_0x0C; + SceUInt32 data_length; //0x00000010 + SceUInt32 unknown_0x14; + SceUInt32 unknown_0x18; // 2? + SceUInt32 unknown_0x1C; +} __attribute__((packed)) ScePlayStartionUpdatePackageHeader2; + +typedef struct { + SceUInt32 index; + SceUInt32 unknown_0x04; + char hash[0x20]; //HMAC-sha256? + SceUInt32 unknown_0x28; + SceUInt32 unknown_0x2C; + SceUInt32 unknown_0x30; + SceUInt32 unknown_0x34; + SceUInt32 unknown_0x38; + SceUInt32 unknown_0x3C; +} __attribute__((packed)) ScePlayStartionUpdatePackageHeader3; + +char pup_type_buf[0x20]; +char pup_dec_dir[0x100]; +char temp_buff[0x2000]; + + +int get_key(int type); + +void press_next(void); + +void press_exit(void); + + +int scePlayStartionUpdatePackageExtractFiles(char *pup_dec_dir, SceUID file_check, int i, SceUInt32 file_count, void *header); + +void sceGetPlayStartionUpdatePackageFileEntryId(void *buff, int entry_id); + +int sceGetPlayStartionUpdatePackageInfo(ScePlayStartionUpdatePackageHeader1 *header); + +int scePlayStartionUpdatePackageExtractStage1(char *ext_pup_path); \ No newline at end of file diff --git a/app/vitaConfig.txt b/app/vitaConfig.txt new file mode 100644 index 0000000..18e0d53 --- /dev/null +++ b/app/vitaConfig.txt @@ -0,0 +1,139 @@ +# WARNING: DO NOT EDIT THIS FILE. IF YOU JUST WANT TO RUN A PLUGIN ON BOOT, +# EDIT ux0:tai/config.txt INSTEAD. IF YOU BREAK THIS FILE, YOUR VITA WILL NO +# LONGER BOOT. IF THAT HAPPENS, YOU CAN ENTER SAFE MODE AND RESET ALL SETTINGS +# TO RESET THIS FILE. THIS FILE IS UNIQUE TO EACH VITA MODEL. DO NOT BLINDLY +# USE SOMEONE ELSE'S CONFIG. +# +# PSP2 System Configuration for Release +# +# [NOTICE] +# +# This configuration is only for kernel_boot_loader_release.self. +# + +- load ur0:tai/testkit.skprx +load os0:kd/clockgen.skprx +#load os0:kd/syscon.skprx +#load os0:kd/rtc.skprx + +#load os0:kd/sm_comm.skprx +#load os0:kd/ss_mgr.skprx +load os0:kd/idstorage.skprx + +load os0:kd/ctrl.skprx +load os0:kd/touch.skprx +load os0:kd/motion.skprx +if AU_CODEC_IC_CONEXANT +load os0:kd/codec_cx.skprx +else +load os0:kd/codec.skprx +endif +load os0:kd/audio.skprx +load os0:kd/hpremote.skprx +load os0:kd/power.skprx + +load os0:kd/usbd.skprx +load os0:kd/udcd.skprx +load os0:kd/usbserv.skprx +load os0:kd/usbserial.skprx +load os0:kd/usbmtp.skprx +load os0:kd/mtpif.skprx + +load os0:kd/post_ss_mgr.skprx +load os0:kd/update_mgr.skprx +load os0:kd/regmgr.skprx + +if USB_ENUM_WAKEUP +load os0:kd/enum_wakeup.skprx +else + +load os0:kd/vnz_wrapper.skprx +#load os0:kd/applier.skprx +- load os0:kd/mgkeymgr.skprx + +load os0:kd/error.skprx + +#load os0:kd/gcauthmgr.skprx +load os0:kd/npdrm.skprx + +load os0:kd/ulobjmgr.skprx + +load os0:kd/net_ps.skprx +load os0:kd/gps.skprx +load os0:kd/bbmc.skprx +load os0:kd/wlanbt.skprx +load os0:kd/usb_ether_smsc.skprx +load os0:kd/usb_ether_rtl.skprx +load os0:kd/bt.skprx +load os0:kd/usbstor.skprx +load os0:kd/usbstorvstor.skprx +load os0:kd/usbpspcm.skprx + +- load os0:kd/magicgate.skprx +- load os0:kd/usbstormg.skprx +- load os0:kd/mgvideo.skprx + +load os0:kd/avcodec.skprx +load os0:kd/audioin.skprx +load os0:kd/ngs.skprx + +load os0:kd/hid.skprx + +load os0:kd/gpu_es4.skprx +load os0:kd/gpuinit_es4.skprx + +- load os0:kd/compat.skprx +load os0:kd/camera.skprx +load os0:kd/coredump.skprx + +if BSOD_REBOOT +load os0:kd/crashdump.skprx +endif + +load os0:kd/av_config.skprx +load os0:kd/fios2.skprx +load os0:kd/pfsmgr.skprx +load os0:kd/appmgr.skprx + +load os0:kd/sysmodule.skprx +load os0:kd/vshbridge.skprx +load os0:kd/marlin_hci.skprx +load os0:kd/krm.skprx +- load os0:kd/tty2uart.skprx + +umount_bootfs + +if MANUFACTURING_MODE +- spawnwait sd0:psp2diag.self +- spawnwait ux0:psp2diag.self +endif + +if SAFE_MODE +spawn os0:ue/safemode.self +end +endif + +if UPDATE_MODE +if UD0_EXIST +spawn ud0:PSP2UPDATE/psp2swu.self +else +spawn ur0:PSP2UPDATE/psp2swu.self +endif +end +endif + +- load ur0:tai/taihen.skprx +- load ur0:tai/henkaku.skprx +- load ur0:tai/kmspico.skprx + +- appspawn vs0:vsh/shell/shell.self SHELL_BUDGET_ID + +endif +end + +# Local variables: +# mode: c +# tab-width: 4 +# c-basic-offset: 4 +# coding: utf-8 +# End: diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..e04197b --- /dev/null +++ b/build.sh @@ -0,0 +1,27 @@ +export VITASDK=/usr/local/vitasdk +export PATH=$VITASDK/bin:$PATH + + +cd kernel/ +cmake . +make install + +cd ../spoofer/ +make clean +make + +cd ../user/ +cmake . +make install + +cd ../kmspico/ +cmake . +make install + +cd ../app/ +mv ../kmspico/kmspico.skprx kmspico.skprx +mv ../spoofer/kDump.skprx testkit.skprx +mv ../kernel/kernel.skprx kernel.skprx +mv ../user/user.suprx user.suprx +cmake . +make \ No newline at end of file diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt new file mode 100644 index 0000000..08dd1c7 --- /dev/null +++ b/kernel/CMakeLists.txt @@ -0,0 +1,51 @@ +cmake_minimum_required(VERSION 2.8) + +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + if(DEFINED ENV{VITASDK}) + set(CMAKE_TOOLCHAIN_FILE "$ENV{VITASDK}/share/vita.toolchain.cmake" CACHE PATH "toolchain file") + else() + message(FATAL_ERROR "Please define VITASDK to point to your SDK path!") + endif() +endif() + +project(cex2rex_kern) +include("${VITASDK}/share/vita.cmake" REQUIRED) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-q -Wall -O3 -nostdlib") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions") + +add_executable(${PROJECT_NAME} + src/main.c + src/spkg.c +) + +target_link_libraries(${PROJECT_NAME} + SceIofilemgrForDriver_stub + SceSysclibForDriver_stub + SceModulemgrForDriver_stub + SceThreadmgrForDriver_stub + SceProcessmgrForDriver_stub + ScePowerForDriver_stub + SceSysmemForDriver_stub + SceSysrootForKernel_stub + SceSblSsMgrForDriver_stub + SceCpuForDriver_stub + SceKernelUtilsForDriver_stub + SceSysmemForKernel_stub + SceDebugForDriver_stub + taihenForKernel_stub + taihenModuleUtils_stub +) + +vita_create_self(kernel.skprx ${PROJECT_NAME} CONFIG exports.yml UNSAFE) + +vita_create_stubs(stubs ${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/exports.yml KERNEL) + +install(DIRECTORY ${CMAKE_BINARY_DIR}/stubs/ + DESTINATION lib + FILES_MATCHING PATTERN "*.a" +) + +install(FILES src/cex2rex_kern.h + DESTINATION include +) diff --git a/kernel/exports.yml b/kernel/exports.yml new file mode 100644 index 0000000..3903647 --- /dev/null +++ b/kernel/exports.yml @@ -0,0 +1,16 @@ +Cex2Rex_Kern: + attributes: 0 + version: + major: 1 + minor: 0 + main: + start: module_start + stop: module_stop + modules: + kC2R: + syscall: true + functions: + - kdd + - kDecryptSpkgFile + - kgetTotalLeft + - kscePowerSetCallbackEnabledForUser \ No newline at end of file diff --git a/kernel/src/cex2rex_kern.h b/kernel/src/cex2rex_kern.h new file mode 100644 index 0000000..353e2f6 --- /dev/null +++ b/kernel/src/cex2rex_kern.h @@ -0,0 +1,4 @@ +int kdd(char *inf, char *of, int size); +int kDecryptSpkgFile(char *in, char *out); +int kgetTotalLeft(); +int kscePowerSetCallbackEnabledForUser(int enable); \ No newline at end of file diff --git a/kernel/src/main.c b/kernel/src/main.c new file mode 100644 index 0000000..b66a8f9 --- /dev/null +++ b/kernel/src/main.c @@ -0,0 +1,183 @@ +#include +#include +#include +#include +#include "power.h" +#include "sysroot.h" +#include "spkg.h" + +#define printf + +char infile[128]; +char outfile[128]; +int sz = -1; +int offst; +int progress = -1; + + +int getFileSize(const char *file) { + SceUID fd = ksceIoOpen(file, SCE_O_RDONLY, 0); + if (fd < 0) + return fd; + int fileSize = ksceIoLseek(fd, 0, SCE_SEEK_END); + ksceIoClose(fd); + return fileSize; +} + +int WriteFile(char *file, void *buf, int size) { + SceUID fd = ksceIoOpen(file, SCE_O_RDWR | SCE_O_CREAT, 0777); + if (fd < 0) + return fd; + + int written = ksceIoWrite(fd, buf, size); + + ksceIoClose(fd); + return written; +} + +int ReadFile(char *file, void *buf, int size) { + SceUID fd = ksceIoOpen(file, SCE_O_RDONLY, 0777); + if (fd < 0) + return fd; + + int readed = ksceIoRead(fd, buf, size); + + ksceIoClose(fd); + return readed; +} + +int run_on_thread(void *func) { + + int ret = 0; + int res = 0; + int uid = 0; + + ret = uid = ksceKernelCreateThread("run_on_thread", func, 64, 0x10000, 0, 0, 0); + + if (ret < 0) { + ret = -1; + goto cleanup; + } + if ((ret = ksceKernelStartThread(uid, 0, NULL)) < 0) { + ret = -1; + goto cleanup; + } + + ret = res; + +cleanup: + if (uid > 0) + ksceKernelDeleteThread(uid); + + return ret; +} + + + +int run_dd(void) +{ + int ret = 0; + + SceUID fd = ksceIoOpen(infile, SCE_O_RDONLY, 0777); + SceUID wfd = ksceIoOpen(outfile, SCE_O_WRONLY, 6); + static char buffer[0x100000]; + + while(!(sz <= 0)) + { + memset(buffer,0x00,0x100000); + if(sz < 0x100000) + { + ksceIoRead(fd, buffer, sz); + ret = ksceIoWrite(wfd, buffer, sz); + sz -= sz; + } + else + { + ksceIoRead(fd, buffer, 0x100000); + ret = ksceIoWrite(wfd, buffer, 0x100000); + sz -= 0x100000; + } + } + + if (fd > 0) + ksceIoClose(fd); + if (wfd > 0) + ksceIoClose(wfd); + sz = 0x50000001; + return ret; +} + + +int kgetTotalLeft() +{ + return sz; +} + +int kdd(char *inf, char *of, int size) +{ + + int state = 0; + ENTER_SYSCALL(state); + + ksceKernelStrncpyUserToKernel(&infile, (uintptr_t)inf, sizeof(infile)); + ksceKernelStrncpyUserToKernel(&outfile, (uintptr_t)of, sizeof(outfile)); + + sz = size; + + int ret = run_on_thread(run_dd); + EXIT_SYSCALL(state); + return ret; +} + +/* +* Magical FAPS TEAM technology V V V +*/ +int kscePowerSetCallbackEnabledForUser(int enable) +{ + return kscePowerSetCallbackEnabled(enable); +} + +int kDecryptSpkgFile(char *in, char *out) +{ + char infile[128]; + char outfile[128]; + void *spkg = 0; + + ksceKernelStrncpyUserToKernel(&infile, (uintptr_t)in, sizeof(infile)); + ksceKernelStrncpyUserToKernel(&outfile, (uintptr_t)out, sizeof(outfile)); + + int size = getFileSize(infile); + + int memblk = ksceKernelAllocMemBlock("spkg_block", 0x10C0D006, (size + 0xfff) & ~0xfff, NULL); + if(memblk < 0) + { + return memblk; + } + + int base = ksceKernelGetMemBlockBase(memblk, &spkg); + if(base < 0) + { + return base; + } + + if(spkg < 0) + { + return (int)spkg; + } + + ReadFile(infile,spkg,size); + int ret = decrypt_spkg(spkg, size); + WriteFile(outfile, spkg, size); + ksceKernelFreeMemBlock(memblk); + return ret; +} + +void _start() __attribute__ ((weak, alias("module_start"))); +int module_start(SceSize args, void *argp) { + return SCE_KERNEL_START_SUCCESS; +} + +int module_stop(SceSize args, void *argp) { + return SCE_KERNEL_STOP_SUCCESS; +} + \ No newline at end of file diff --git a/kernel/src/power.h b/kernel/src/power.h new file mode 100644 index 0000000..7f65fd6 --- /dev/null +++ b/kernel/src/power.h @@ -0,0 +1 @@ +int kscePowerSetCallbackEnabled(int enable); \ No newline at end of file diff --git a/kernel/src/spkg.c b/kernel/src/spkg.c new file mode 100644 index 0000000..9bdcac4 --- /dev/null +++ b/kernel/src/spkg.c @@ -0,0 +1,121 @@ +/* spkg.c -- spkg decryption + * + * Copyright (C) 2019 TheFloW + * + * This software may be modified and distributed under the terms + * of the MIT license. See the LICENSE file for details. + */ + +#include +#include + +#include +#include + +#include "spkg.h" + +int ksceSblDmac5AesCbcDec(void *src, void *dst, int size, void *key, int key_size, void *iv, int mask_enable); + +uint8_t spkg_key[0x20] = { + 0x2E, 0x6F, 0x47, 0x51, 0xD1, 0x5B, 0x06, 0xC5, 0x1F, 0x57, 0x2A, 0x93, 0x06, 0xE5, 0x2D, 0xD7, 0x00, 0x7E, 0xA5, 0x6A, 0x31, 0xD4, 0x59, 0xEC, 0x6D, 0x36, 0x81, 0xAB, 0x08, 0x62,0x55, 0x01 +}; + +uint8_t spkg_iv[0x10] = { + 0xB3,0xD5,0x41,0xA5,0x68,0x75,0x1D,0xF8,0xF4,0x83,0x3B,0xAB,0x4E,0xFE,0x05,0x37 +}; + +void xor_key(uint8_t *dst, uint8_t *src, int len) { + int i; + for (i = 0; i < len; i++) { + dst[i] ^= src[i]; + } +} + +void key_inc(uint8_t *key, int pos) { + if (key[pos] == 0xFF) { + key[pos] = 0; + key_inc(key, pos - 1); + } else { + key[pos] += 1; + } +} + +int aes_ctr_encrypt(void *data, int size, void *key, void *iv) { + uint8_t ikey[16], xkey[16]; + int res; + + SceAesContext ctx; + res = ksceAesInit1(&ctx, 128, 128, key); + if (res < 0) + return res; + + memcpy(ikey, iv, 16); + + int i; + for (i = 0; i < size; i += 16) { + memcpy(xkey, ikey, 16); + res = ksceAesEncrypt1(&ctx, xkey, xkey); + if (res < 0) + return res; + xor_key(data + i, xkey, 16); + key_inc(ikey, 15); + } + + return 0; +} + +int decrypt_spkg(void *buf, int size) { + char key[0x20], iv[0x10]; + int res; + + SceHeader *sce_header = (SceHeader *)buf; + if (sce_header->magic != 0x00454353 || sce_header->version != 3 || sce_header->sce_type != 3) + return SCE_SBL_ERROR_SL_EDATA; + + MetadataInfo *metadata_info = (MetadataInfo *)((char *)sce_header + sce_header->metadata_offset + 0x30); + + memcpy(key, spkg_key, 0x20); + memcpy(iv, spkg_iv, 0x10); + + res = ksceSblDmac5AesCbcDec(metadata_info, metadata_info, sizeof(MetadataInfo), key, 256, iv, 1); + if (res < 0) + return res; + + if (metadata_info->pad0 != 0 || metadata_info->pad1 != 0 || + metadata_info->pad2 != 0 || metadata_info->pad3 != 0) + return SCE_SBL_ERROR_SL_EDATA; + + char *dec = (char *)metadata_info + sizeof(MetadataInfo); + int dec_size = sce_header->header_length - sce_header->metadata_offset - 0x30 - sizeof(MetadataInfo); + + memcpy(key, metadata_info->key, 0x10); + memcpy(iv, metadata_info->iv, 0x10); + + res = ksceSblDmac5AesCbcDec(dec, dec, dec_size, key, 128, iv, 1); + if (res < 0) + return res; + + MetadataHeader *metadata_header = (MetadataHeader *)dec; + MetadataSection *metadata_section = (MetadataSection *)((char *)metadata_header + sizeof(MetadataHeader)); + + char *vault = (char *)metadata_section + metadata_header->section_count * sizeof(MetadataSection); + + int i; + for (i = 0; i < metadata_header->section_count; i++) { + if (metadata_section[i].encryption == 3) { + char *vault_key = vault + metadata_section[i].key_idx * 0x10; + char *vault_iv = vault + metadata_section[i].iv_idx * 0x10; + + memcpy(key, vault_key, 0x10); + memcpy(iv, vault_iv, 0x10); + + res = aes_ctr_encrypt(buf + metadata_section[i].offset, metadata_section[i].size, key, iv); + if (res < 0) + return res; + } + } + + ksceKernelCpuDcacheAndL2WritebackRange(buf, ALIGN(size, 0x40)); + + return 0; +} diff --git a/kernel/src/spkg.h b/kernel/src/spkg.h new file mode 100644 index 0000000..6e3dbf7 --- /dev/null +++ b/kernel/src/spkg.h @@ -0,0 +1,78 @@ +#ifndef __SPKG_H__ +#define __SPKG_H__ + +#define ALIGN(x, align) (((x) + ((align) - 1)) & ~((align) - 1)) + +#define SCE_SBL_ERROR_SL_EDATA 0x800F0226 +#define SCE_SBL_ERROR_SL_ESYSVER 0x800F0237 +#define SCE_SBL_SM_COMM_FID_SM_AUTH_SPKG 0x40002 + +typedef struct { + uint32_t magic; + uint32_t version; + uint8_t platform; + uint8_t key_revision; + uint16_t sce_type; + uint32_t metadata_offset; + uint64_t header_length; + uint64_t data_length; +} SceHeader; + +typedef struct { + uint8_t key[0x10]; + uint64_t pad0; + uint64_t pad1; + uint8_t iv[0x10]; + uint64_t pad2; + uint64_t pad3; +} MetadataInfo; + +typedef struct { + uint64_t signature_input_length; + uint32_t signature_type; + uint32_t section_count; + uint32_t key_count; + uint32_t opt_header_size; + uint32_t field_18; + uint32_t field_1C; +} MetadataHeader; + +typedef struct { + uint64_t offset; + uint64_t size; + uint32_t type; + uint32_t seg_idx; + uint32_t hashtype; + uint32_t hash_idx; + uint32_t encryption; + uint32_t key_idx; + uint32_t iv_idx; + uint32_t compression; +} MetadataSection; + +typedef struct { + uint32_t field_0; + uint32_t pkg_type; + uint32_t flags; + uint32_t field_C; + uint64_t update_version; + uint64_t final_size; + uint64_t decrypted_size; + uint64_t field_28; + uint32_t field_30; + uint32_t field_34; + uint32_t field_38; + uint32_t field_3C; + uint64_t field_40; + uint64_t field_48; + uint64_t offset; + uint64_t size; + uint64_t part_idx; + uint64_t total_parts; + uint64_t field_70; + uint64_t field_78; +} SpkgHeader; + +int decrypt_spkg(void *buf, int size); + +#endif diff --git a/kernel/src/sysroot.h b/kernel/src/sysroot.h new file mode 100644 index 0000000..88e38fc --- /dev/null +++ b/kernel/src/sysroot.h @@ -0,0 +1 @@ +void* ksceKernelSysrootAlloc(int size); \ No newline at end of file diff --git a/kmspico/CMakeLists.txt b/kmspico/CMakeLists.txt new file mode 100644 index 0000000..8ad1a3d --- /dev/null +++ b/kmspico/CMakeLists.txt @@ -0,0 +1,42 @@ +cmake_minimum_required(VERSION 2.8) + +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + if(DEFINED ENV{VITASDK}) + set(CMAKE_TOOLCHAIN_FILE "$ENV{VITASDK}/share/vita.toolchain.cmake" CACHE PATH "toolchain file") + else() + message(FATAL_ERROR "Please define VITASDK to point to your SDK path!") + endif() +endif() + +project(kmspico) +include("${VITASDK}/share/vita.cmake" REQUIRED) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-q -Wall -O3 -nostdlib") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions") + +add_executable(${PROJECT_NAME} + src/main.c +) + +target_link_libraries(${PROJECT_NAME} + SceIofilemgrForDriver_stub + SceSysclibForDriver_stub + SceModulemgrForDriver_stub + SceThreadmgrForDriver_stub + SceProcessmgrForDriver_stub + SceSysmemForDriver_stub + SceSysrootForKernel_stub + SceSysmemForKernel_stub + SceDebugForDriver_stub + taihenForKernel_stub + taihenModuleUtils_stub +) + +vita_create_self(kmspico.skprx ${PROJECT_NAME} CONFIG exports.yml UNSAFE) + +vita_create_stubs(stubs ${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/exports.yml KERNEL) + +install(DIRECTORY ${CMAKE_BINARY_DIR}/stubs/ + DESTINATION lib + FILES_MATCHING PATTERN "*.a" +) diff --git a/kmspico/exports.yml b/kmspico/exports.yml new file mode 100644 index 0000000..1bb4427 --- /dev/null +++ b/kmspico/exports.yml @@ -0,0 +1,8 @@ +kmspico: + attributes: 0 + version: + major: 1 + minor: 0 + main: + start: module_start + stop: module_stop diff --git a/kmspico/src/main.c b/kmspico/src/main.c new file mode 100644 index 0000000..16f7b5b --- /dev/null +++ b/kmspico/src/main.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include + +static int hook = -1; +static tai_hook_ref_t ref_hook; + +int ksceSblPostSsMgrGetExpireDate_patched(int *arg1, int arg2) +{ + return 1; +} + +void _start() __attribute__ ((weak, alias("module_start"))); +int module_start(SceSize args, void *argp) { + hook = taiHookFunctionExportForKernel(KERNEL_PID, + &ref_hook, + "SceSblPostSsMgr", + 0x2254E1B2, + 0x4FF2682F, + ksceSblPostSsMgrGetExpireDate_patched); + return SCE_KERNEL_START_SUCCESS; +} + +int module_stop(SceSize args, void *argp) { + return SCE_KERNEL_STOP_SUCCESS; +} + \ No newline at end of file diff --git a/make_appinfo.bat b/make_appinfo.bat new file mode 100644 index 0000000..d8f98ba --- /dev/null +++ b/make_appinfo.bat @@ -0,0 +1,6 @@ +@echo off +echo Building app.info +echo (needs PSM SDK) +"%SCE_PSM_SDK%\tools\python\python.exe" "%SCE_PSM_SDK%\tools\PublishingUtility\cxml\appinfo\appinfo_compiler.py" "%CD%\app.xml" +copy "app.cxml" "app/app.info" /y +del "app.cxml" diff --git a/memdump_license b/memdump_license deleted file mode 100644 index a366c23..0000000 --- a/memdump_license +++ /dev/null @@ -1,14 +0,0 @@ - memdump ---- - Copyright 2017 notzecoxao - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/spoofer/LICENSE b/spoofer/LICENSE new file mode 100644 index 0000000..5c304d1 --- /dev/null +++ b/spoofer/LICENSE @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/spoofer/Makefile b/spoofer/Makefile new file mode 100644 index 0000000..aa23206 --- /dev/null +++ b/spoofer/Makefile @@ -0,0 +1,31 @@ +TITLE_ID = NIDUMP001 +TARGET = mDump +PSVITAIP = 192.168.1.115 + +PLUGIN_OBJS = mmu_dump.o +HEADERS = $(wildcard *.h) + +PLUGIN_LIBS = -ltaihen_stub -lSceSysclibForDriver_stub -lSceModulemgrForKernel_stub -lSceIofilemgrForDriver_stub + +PREFIX = arm-vita-eabi +CC = $(PREFIX)-gcc +CFLAGS = -Wl,-q -Wall -O3 +ASFLAGS = $(CFLAGS) + +all: kDump.skprx + +kDump.skprx: kDump.velf + vita-make-fself -c $< $@ + +kDump.velf: kDump.elf + vita-elf-create -e exports.yml $< $@ + +kDump.elf: $(PLUGIN_OBJS) + $(CC) $(CFLAGS) $^ $(PLUGIN_LIBS) -o $@ -nostdlib + +clean: + @rm -rf *.velf *.elf *.vpk *.skprx $(MAIN_OBJS) $(PLUGIN_OBJS) param.sfo eboot.bin + +send: eboot.bin + curl -T eboot.bin ftp://$(PSVITAIP):1337/ux0:/app/$(TITLE_ID)/ + @echo "Sent." diff --git a/spoofer/README.md b/spoofer/README.md new file mode 100644 index 0000000..31d7b32 --- /dev/null +++ b/spoofer/README.md @@ -0,0 +1,7 @@ +# memdump +This homebrew can dump memory + +Credits: +anonymous - precious info + +yifanlu - for his mmu_dump code (which saves a lot of work when dumping both the table and memory!) diff --git a/spoofer/exports.yml b/spoofer/exports.yml new file mode 100644 index 0000000..b4b87cb --- /dev/null +++ b/spoofer/exports.yml @@ -0,0 +1,8 @@ +vita_dump: + attributes: 0 + version: + major: 1 + minor: 1 + main: + start: module_start + stop: module_stop diff --git a/spoofer/mmu_dump.c b/spoofer/mmu_dump.c new file mode 100644 index 0000000..aff2f38 --- /dev/null +++ b/spoofer/mmu_dump.c @@ -0,0 +1,286 @@ +/* + * mmu_dump.c - Bare metal ARMv7 translation table dumper + * Copyright 2014 Yifan Lu + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include + +static int afe; + +#define DUMP_PATH "ux0:dump/" + +void _start() __attribute__ ((weak, alias ("module_start"))); + +static unsigned int pa2va(unsigned int pa) +{ + unsigned int va; + unsigned int vaddr; + unsigned int paddr; + unsigned int i; + + va = 0; + for (i = 0; i < 0x100000; i++) + { + vaddr = i << 12; + __asm__("mcr p15,0,%1,c7,c8,0\n\t" + "mrc p15,0,%0,c7,c4,0\n\t" : "=r" (paddr) : "r" (vaddr)); + if ((pa & 0xFFFFF000) == (paddr & 0xFFFFF000)) + { + va = vaddr + (pa & 0xFFF); + break; + } + } + return va; +} + +static void mmu_get_perms(int ap2, int ap1, int *ur, int *uw, int *pr, int *pw) +{ + /* AFE enabled, use simple permissions */ + if (afe) + { + *ur = ap1 > 1; + *uw = !ap2 && ap1 > 1; + *pr = 1; + *pw = !ap2 && ap1 < 2; + } + else + { + *pw = (!ap2 && ap1); + *pr = *pw || ap1; + *ur = ap1 > 1; + *uw = !ap2 && ap1 == 3; + } +} + +//magic +unsigned char magic[0x8] = { + 0xA5, 0x9D, 0xCE, 0xAB, 0x00, 0x01, 0x01 +}; + +//spoof +unsigned char testkit_pscode[0x8] = { + 0x00, 0x01, 0x01, 0x02, 0x00, 0x10, 0x00, 0x03 +}; + +static int mmu_dump_pages(unsigned int vaddr, unsigned int entry) +{ + int xn; + int ng; + int s; + int ap2; + int ap1; + int pr; + int pw; + int ur; + int uw; + unsigned int paddr; + SceUID fd; + + if ((entry & 0x3) == 0x1) /* large page */ + { + xn = entry & 0x8000; + ng = entry & 0x800; + s = entry & 0x400; + ap2 = entry & 0x200; + ap1 = (entry >> 4) & 3; + mmu_get_perms(ap2, ap1, &ur, &uw, &pr, &pw); + paddr = entry & 0xFFFF0000; + if( paddr >= 0x40201000 && paddr < 0x5FD00000 && paddr != 0x44C20000 && paddr != 0x44C30000 && paddr != 0x443C0000){ + if( (paddr-0x44300000) <= (0x44400000-0x44300000) ){ + + }else if ( (paddr-0x45020000) <= (0x45030000-0x45020000) ){ + }else{ + + + + + //spoofing happens here + int counter = 0; + for (counter = 0; counter < 0x1000; counter ++){ + if(memcmp((void*)vaddr + counter, magic, 7) == 0 && counter == 0x5B0){ + counter = counter + 4; + memcpy((void*) vaddr + counter, testkit_pscode, 8); + return 0; + } + } + } + } + else{ + + } + } + else if ((entry & 0x2)) /* small page */ + { + xn = entry & 1; + ng = entry & 0x800; + s = entry & 0x400; + ap2 = entry & 0x200; + ap1 = (entry >> 4) & 3; + mmu_get_perms(ap2, ap1, &ur, &uw, &pr, &pw); + paddr = entry & 0xFFFFF000; + //0x4434C000 + if( paddr >= 0x40201000 && paddr < 0x5FD00000){ + if( (paddr-0x47D80000) <= (0x47D90000-0x47D80000) ){ + }else if ( (paddr-0x44C09000) <= (0x44C1A000-0x44C09000) ){ + }else if ( (paddr-0x44300000) <= (0x44400000-0x44300000) ){ + }else if ( (paddr-0x45009000) <= (0x45019000-0x45009000) ){ + }else if ( (paddr-0x44700000) <= (0x44710000-0x44700000) ){ + }else{ + + + //spoofing also happens here + int counter = 0; + for (counter = 0; counter < 0x1000; counter ++){ + if(memcmp((void*)vaddr + counter, magic, 7) == 0 && counter == 0x5B0){ + counter = counter + 4; + memcpy((void*) vaddr + counter, testkit_pscode, 8); + return 0; + } + } + } + + } + else{ + } + } + else + { + } + return 1; +} + +static int mmu_dump_sections(unsigned int vaddr, unsigned int entry) +{ + int ns; + int ss; + int ng; + int s; + int ap1; + int ap2; + int domain; + int xn; + int pr; + int pw; + int ur; + int uw; + unsigned int paddr; + unsigned int i; + unsigned int *tbl; + + + if ((entry & 0x3) == 2) /* section or supersection */ + { + ns = entry & 0x80000; + ss = entry & 0x40000; + ng = entry & 0x20000; + s = entry & 0x10000; + ap2 = entry & 0x8000; + ap1 = (entry >> 10) & 3; + domain = (entry >> 5) & 15; + xn = entry & 0x10; + mmu_get_perms(ap2, ap1, &ur, &uw, &pr, &pw); + paddr = ss ? entry & 0xFF000000 : entry & 0xFFF00000; + + } + else if ((entry & 0x3) == 1) /* page table */ + { + domain = (entry >> 5) & 15; + ns = entry & 8; + paddr = entry & 0xFFFFFC00; + tbl = (unsigned int *)pa2va(paddr); + for (i = 0; i < 0x100; i++) + { + int ret = mmu_dump_pages(vaddr+(i<<12), tbl[i]); + if (ret == 0) { + return 0; + } + } + } + else if ((entry & 0x3) == 0) /* not mapped */ + { + } + else + { + } + return 1; +} + +int mmu_dump(void) +{ + unsigned int ttbr[2]; + int ttbcr; + int n; + unsigned int i = 0; + + unsigned int *ttb_vaddr[2]; + unsigned int entry; + + + __asm__("mrc p15,0,%0,c2,c0,0" : "=r" (ttbr[0])); + __asm__("mrc p15,0,%0,c2,c0,1" : "=r" (ttbr[1])); + __asm__("mrc p15,0,%0,c2,c0,2" : "=r" (ttbcr)); + + n = ttbcr & 0x7; + ttbr[0] &= (unsigned int)((int)0x80000000 >> (31 - 14 + 1 - n)); + ttbr[1] &= 0xFFFFC000; + + ttb_vaddr[0] = (unsigned int *)pa2va(ttbr[0]); + ttb_vaddr[1] = (unsigned int *)pa2va(ttbr[1]); + + for (i = 0; i < (1 << (12 - n)); i++) + { + entry = ttb_vaddr[0][i]; + int ret = mmu_dump_sections(i<<20, entry); + if(ret == 0){ + return 0; + } + } + + if (n) + { + for (i = ((~0xEFFF & 0xFFFF) >> n); i < 0x1000; i++) + { + entry = ttb_vaddr[1][i]; + int ret = mmu_dump_sections(i<<20, entry); + if(ret == 0){ + return 0; + } + } + } + return 1; +} + +int module_start(SceSize argc, const void *args) +{ + unsigned int sctlr; + + __asm__("mrc p15,0,%0,c1,c0,0" : "=r" (sctlr)); + afe = sctlr & 0x20000000; + mmu_dump(); + + return SCE_KERNEL_START_SUCCESS; +} + +int module_stop(SceSize argc, const void *args) +{ + return SCE_KERNEL_STOP_SUCCESS; +} + + diff --git a/spoofer/mmu_dump.o b/spoofer/mmu_dump.o new file mode 100644 index 0000000000000000000000000000000000000000..39cdad8b9bce554783f68e4be8739ac50528bf1b GIT binary patch literal 1872 zcma)6UrbwN6hGhnLrWo9+sv$E%UUR6Ct0Z*Q#O~-(orTNB{(#DvG&hJiQL`Vds%?Q zQI`;TFmY}%F`|hx(H9>Cb;e{N3^SgluGK7Ajfv=k%#qa=dJEx!dcL+7ioSS~ufOx> z_nmXT?|iotojpE62xvmU0Xr7JO}-f6TZ`ZT15^XauqYJS5eT^BGyOS?m06V+%l^VA~W+rZ7$uV8pvS(jE$1q3iPJZk4TdUu>Tdin~-_HLwwvhi~l)ZWrIdG*)owz{W zWiGQzpLOtReBh15*$u9R$*_bR_9m|C*6uP73=FeUO+1|s?=jgn4^eHVSvB7NXNsLp zT4vR$_TN)X_UR5r?IY;7{*wAcHF_xHZi-Qj%$KN5&HFP@^Fyj8OKNltH`I9Ggs*0W zhg*rl`c~nF`i-QY2gl#Z`fjlEt6vXXxzEBRE{l(!nY*8P2d0?^*wHjusfIc?GyQX& zWuDmGom2B*hvsVuQmRjDSwBdT>`CnMBJHMJ`SO1%zxA)m3(L@SZkgB@mtkIybHa&u zuxF1s-5209Iv(%%^kUY`;2kQSO=cDB=Cn&{%1yjrP8+RFnf5A^n<>uf*+k`}y4?*O zYsrPR8jd@SIox2!4ABy^HL<@mQ!AZm%*`Nkk8d$s%lb1!uis=hxKq$XmVBLtgp0?y zSjm%x^*^@2p(eqG_wwfCtUnij-n+@Gx|K@J3x*X))UBin7EGjoJ*1-6CV3% z85-x7_1E!jusD0xls4j=p}+2BIs>rj=fD>2`t+k8KL`4j31PqpEOdFjCvA?d-T~WL zNg9@IgHp`q>3`1FDTahdM2Oh>Vp3R;Who{fwzWBrI$hwQ4?QRZLqk9wN0oo-hzF_+ zI**=IGX}Pnn7O^=5wef9ko}~N93+RBhRW}y_?h5OrH_MbLGx2&cSWhqR)*2ypcXwe z$H(}?pmt~%gFyW*n}ueyKin=_;?un)A>h>1B63Ckj;pkP$L64|Y;cGK`>7NbN`DHP zkA*5Yr5T7uTwYw)u>L(nGiK;P9Af|umhJuuy8+|p(0&i&v=ZeDi1aPfWx^X#5UFT3 zh~h{fG9pHu;cYb_3t?qQIxj<`0?r;!ulJ0<-vy14ZQ}_D4hkR&VpxoBZv#<^j0_6_ zSqa9J9YczOBFM^XLrNejhouPa3%)WG#vWe6)uIEqgy=%l<2em@=u2g!b6{|!<9MDH z1HeT@7vkH91`}>_%44Du3?VA9627WwF=5!L2&344B&YuQRA9 zv7yii_J*1Mw^)&hZQ-O!LZA8j*pDXKgb$#j8kf5qXvI-e9gkVuPkD3(kCtui<$jO3 z=-f5Y^3ium`5Nz6 + +int dd(char *inf, char *of, int size); +int DecryptSpkgFile(char *in, char *out); +int getTotalLeft(); +int scePowerSetCallbackEnabled(int enable); \ No newline at end of file diff --git a/user/src/main.c b/user/src/main.c new file mode 100644 index 0000000..db99b79 --- /dev/null +++ b/user/src/main.c @@ -0,0 +1,33 @@ +#include +#include +#include "cex2rex_user.h" + +int dd(char *inf, char *of, int size) +{ + return kdd(inf, of, size); +} + + +int DecryptSpkgFile(char *in, char *out) +{ + return kDecryptSpkgFile(in, out); +} + +int getTotalLeft() +{ + return kgetTotalLeft(); +} + +int scePowerSetCallbackEnabled(int enable) +{ + return kscePowerSetCallbackEnabledForUser(enable); +} + +void _start() __attribute__ ((weak, alias("module_start"))); +int module_start(SceSize args, void *argp) { + return SCE_KERNEL_START_SUCCESS; +} + +int module_stop(SceSize args, void *argp) { + return SCE_KERNEL_STOP_SUCCESS; +}