From 387de1409eb262a31305b851a93b1c4555f8f496 Mon Sep 17 00:00:00 2001 From: Sun Daowen Date: Thu, 28 Mar 2019 00:40:56 +0800 Subject: [PATCH] improve lock region --- CMakeLists.txt | 2 +- README.md | 1 + bin/ext_key.txt | 63 +++++++++++++++++++++++++++++++++++++++++++++++ src/3dstool.cpp | 4 +-- src/code.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 132 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b4b79ad..c6c95572 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,7 +24,7 @@ if(APPLE) endif() set(_3DSTOOL_MAJOR 1) set(_3DSTOOL_MINOR 2) -set(_3DSTOOL_PATCHLEVEL 3) +set(_3DSTOOL_PATCHLEVEL 4) if(NOT MSVC_IDE AND NOT XCODE_VERSION AND NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE) endif() diff --git a/README.md b/README.md index 81eb48bc..ee6ef413 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ An all-in-one tool for extracting/creating 3ds roms. - v1.2.1 @ 2018.07.26 - Support openssl 1.1.0 - v1.2.2 @ 2018.08.27 - Fix not encrypt bug - v1.2.3 @ 2018.09.03 - Fix extract cxi without exefs bug +- v1.2.4 @ 2019.03.28 - Improve lock region ### v1.1 diff --git a/bin/ext_key.txt b/bin/ext_key.txt index cba51343..a5469d1a 100644 --- a/bin/ext_key.txt +++ b/bin/ext_key.txt @@ -1159,6 +1159,7 @@ 00040000001B8100 6698A2E2932FF0A80BEAAFAF285A254C 00040000001B8200 31EAB11FBB308282ACF522A8120621EF 00040000001B8300 06820591168AE59CFB76699EDB124B2C +00040000001B8400 3859A1F75EAE219F47D61F0223CFC60A 00040000001B8600 2C2AC69D04BB08888FE830F14424B852 00040000001B8700 26A22CD09E64BD4719D7E9FC5A46BD99 00040000001B8800 283544D3AFCAC3980D3623EC3891CBAF @@ -1325,6 +1326,7 @@ 00040000001C6900 B8B95C723E8E97543F8806C4FB861EFC 00040000001C6B00 0D3F984D2462E853ECCCCAFAFC285F80 00040000001C6C00 B85ABA102A48D559F7E63C36B33EB397 +00040000001C6D00 28EFC296ADA0008BA173CC1D9D667A80 00040000001C6E00 A01E3EEA1908BFB83585722804875CB0 00040000001C7200 7AA960471D21D481D54B72E9BC616731 00040000001C7300 02E06CCCF83F612704B4BE34096F6CA6 @@ -1335,6 +1337,7 @@ 00040000001C7B00 31F02A1261AC885FCE3386F26EAB6E93 00040000001C7D00 6BCA8B2BFB00445E560E2858C5F9478F 00040000001C7E00 9C63AD66731B3ACD47804025AEF5D57F +00040000001C7F00 6939B06B884CAEAC84EFB7458F730EB7 00040000001C8200 E093B5B390DC2A7A3840A622CEDB6DE6 00040000001C8300 A8BE57F742FE3C0B1BAAAA686AB8F6CF 00040000001C8F00 F989E5CC074D7F7448688884F7909E7A @@ -1355,11 +1358,14 @@ 00040000001CA200 D3A31A447A81425C4308D2D99310E502 00040000001CA300 6F179DF0E355AB23414208BAFAD065DB 00040000001CA400 53D071EFCB252B0C246765A17498E458 +00040000001CA500 01366BF8549F70E4839A37BDC06194A8 00040000001CA800 BC766C1AAA7AD881F3705B894240D727 +00040000001CA900 D14A49DE8677E5E65AACD895DC4DFD1F 00040000001CAA00 8FAE83DA2D9C9569F27603EB5272103E 00040000001CAB00 28F9D733E828EC064934EC36FACE3D07 00040000001CAC00 3753BB5D4CF2B52DE87899C76C7B204C 00040000001CAD00 DFF0981B156D63BD1BFB52475C4A7BED +00040000001CAF00 AE038D31BE7FAF900B9EEEB4A53990A8 00040000001CB000 4E73E57B7F2BD60857B294AE58B61CA3 00040000001CB100 28E43A09F5B3377D648C02841F70412C 00040000001CB200 4E6CB3CC968C565129923BA664CD2F55 @@ -1368,6 +1374,9 @@ 00040000001CB600 338D239998E441C2EE84C5B5B514161B 00040000001CB800 1FBBF2D59FBC81943A624DA34FEEC162 00040000001CB900 6F0311322FAB582D51993568DED3D7E8 +00040000001CBC00 8BD41630DDDFE8D9DD233D93EC23EAB6 +00040000001CBD00 25E7C9D17F783DB1B86A94B19AF8B108 +00040000001CBE00 AC2315994C584CEFF63A275318C19D0F 00040000001CBF00 24615F24DF7C3A1D4A373BC09D3DF958 00040000001CC200 A87C0C386FB328FBCD9ED0E3637556D9 00040000001CC300 25422DE201F14165BA517AD43B4DEEA9 @@ -1391,7 +1400,9 @@ 00040000001CE000 B9C2D4CFDD33FEC7A65A5BC474A7AE1D 00040000001CE100 71D654EAA1A6B322D23D36B8A91A4201 00040000001CE800 BA12D61C0947FE59A22CC94EB32D3B5A +00040000001CEB00 72B530DFF67FD8C551A8183597C50F80 00040000001CEC00 FD82BA4BDA0D4746B68094BD7CFFEB9B +00040000001CEF00 53D1B727BA6BDF7D9A7CEC78EBB1F596 00040000001CF000 888CE18D78792D602193157C6AFA1B06 00040000001CF300 36DFFFEE9A7DFCAC75384E1E6A8C84A2 00040000001CF400 92B2CAD88DD7FC96A71115B1FFB4CED4 @@ -1410,18 +1421,28 @@ 00040000001D0600 67455478122D3EB0A8539D6492DAD510 00040000001D0700 863C695C3DFD2644C85D73F151500C57 00040000001D0900 E9D344283411C3C4EE702EBF98DB6F85 +00040000001D0B00 FE6EB0A7F1FEACAF40848CD010028F9A 00040000001D0C00 9ACF1243D40F4E79C75F3CC0B7254736 00040000001D0E00 208312DE6B0ABFD40E22CE974A285D1D 00040000001D0F00 532E9503CF50506843B4C76836CB0D21 00040000001D1100 B561A912C0A3631CFA7FE5E8597690BD +00040000001D1200 ECCAFDADC7BDF8777E67CB318CFF7289 00040000001D1300 09E9B2205D3DDFB05E9E440804B08E30 +00040000001D1400 D36DEE9E54626273BFD0668274BDB188 +00040000001D1500 3CF2955127C4FA64ADAB320DBFDFFD75 00040000001D1700 2B96FE16B49BDC862A17DFA0D449E43E +00040000001D1800 F0CC33A3E1335974330DD8AFDBF02E2F +00040000001D1900 79D9395948A747315BC29A02E13065BE +00040000001D1A00 1B60C2805B2FB1369E5231DF9A65F7DA 00040000001D1C00 07F366441872A944EF83E9E1F78F0805 00040000001D1D00 A25E54024200B2CBB261FE47DE3A92D6 +00040000001D1E00 3711FE785629B420DDE9D310C0B09446 +00040000001D1F00 AEC6A8A7ABD5E2487079949CAE40D3C3 00040000001D2100 B0A550FACE9B99AFC9910A578C9C7865 00040000001D2300 46D91E9C044DD75B854703026B85E169 00040000001D2400 A5F5AA0FBE6505649980012251C533B9 00040000001D2500 BC9243370D77A84CAC5DC3DC9C482859 +00040000001D2700 84CEA7E7A68CAC2F8ED1BC7C87704E34 00040000001D2900 464AB26F2E87E980A5C7292B4E8E50DC 00040000001D2A00 5FB90283DE9DB528AC91BCA44428C355 00040000001D2B00 CE2F69DD4FCFFF021AE75FA77C52900D @@ -1432,16 +1453,54 @@ 00040000001D3200 BEA057914ED08ADE66495EDF381AEE3A 00040000001D3400 24B0CF214481EEF76A7A2F10B56E5EF5 00040000001D3500 06157406D199D1CEF9CFD89F82660BD2 +00040000001D3700 F8FB4F00309B0C2D31258D10DE646F7F 00040000001D3800 960160100ACA5C0E53E0CFDFCC021484 +00040000001D3900 BC30320024FFF702A89471FE4975D028 00040000001D3A00 55B883541350862ECEEAE64CA7A39EB8 +00040000001D3B00 747C0F10C9D222EA59501114DB024192 00040000001D3C00 B7A0294B8712C2346438BFACD27B9D37 00040000001D3F00 1A82A36C84C2ECF1933D6156D7E3F333 00040000001D4000 80CA8BB3E11F631F01E7540AA3454CAE 00040000001D4500 9F62F7E161D51974F2CCE8B860CE749F +00040000001D4C00 DAC522C7FA4B8E1F3ED9D78A424624C9 +00040000001D4E00 227757FFA5299D99F4D47DCBBB96CB67 +00040000001D4F00 714793CA52E6C415EFB87AB4714881C2 +00040000001D5000 2E6044040D93EA4F7AC4D7E1F49A6152 00040000001D5100 A17EC76A9967D1BDB177FC5EF59357D6 +00040000001D5200 0D39528BAF4FAD790157BD69474B9040 00040000001D5300 255CDFBE6A1C3972C38D459363BBAB6C 00040000001D5400 49D45E1F8210ADAF2239F00B5B2987B2 00040000001D5500 3571D703D2A9B0B3FBE2465B6944EDC1 +00040000001D5600 64531ECAAF1388CA9D25FF6CFE895EF4 +00040000001D5700 97178F84A64C4076F33EC71F048F1D02 +00040000001D5800 7A9275B3C6E3ED739967EE710507D289 +00040000001D5900 5B2EACB93DFB1AC608FC96D8CC93CDE9 +00040000001D5B00 61DDB60C735BC462213384CFBDD0A7E2 +00040000001D5D00 C6444D1B4BF87167D4E2BCFDB672A5D3 +00040000001D6400 6B73F89859EB463EB36ED56CF76ED059 +00040000001D6500 A9BAEFBE2A26130D3F3CF4B9B459EB6D +00040000001D6600 E8B14AAC6B97F8DD5419D63E17BD86A8 +00040000001D6700 9500A0CD71862351808F562A9E0A61F1 +00040000001D6800 2EE8BB0C1277220EA80515A67BE795F5 +00040000001D6900 C3BCF1424F34B32B283A22C328FB0CD0 +00040000001D6A00 A73958BB9D4D2FE68230B15F35A31683 +00040000001D6B00 DA03A2E1DBD7A9E3BE1926DDB679FC02 +00040000001D6C00 CE196657DAD057778690FC84A3C84BE3 +00040000001D6F00 5010F2D2C840FA5ABE9D7CA94B765B1E +00040000001D7200 8974BF03C548F5D2ECED338753E19D80 +00040000001D7300 4245F9F8820DFFCD18020FC5A7A9FFE9 +00040000001D7400 BC02E6103907A3604599573F37FE73EC +00040000001D7800 EB704CAC88F3CFF78B27F268C679CB1A +00040000001D7D00 14A95854B221AA65D740FDD4682DF318 +00040000001D7E00 1D2C4FD379D03B2881AEA20BD5EA6081 +00040000001D7F00 A4EC005FB33643721577738EECE512D3 +00040000001D8100 6EEADE2CC983935F827054F17E423A66 +00040000001D8300 442AF214741B666F339A785592145E0F +00040000001D8400 7BE6DF9CACD9A8D95845FFA69ED63707 +00040000001D8500 C18928E8BEDAD9FB221F9B2959BA7C72 +00040000001D8700 A7B10AC983C49A605405CBF6788F7169 +00040000001D8800 BA292273F10F7F85FD6F739E94DF7575 +00040000001D8900 ACB6BF8C424DDAB2146607ECEB2040C3 000400000F700400 0D65CBD40F2728586CA4DAE3B8681313 000400000F700700 C6EE84F157E15E8B7E716090D2ED5DE4 000400000F700800 9A83F7FEB62E8D9AACB5AA7761A00590 @@ -1654,6 +1713,7 @@ 000400000F710600 7DF7D88BBE3938303682FE47614B1866 000400000F710900 204613AD9F10E857A75E09C2681C279D 000400000F710A00 BE305B9D3A68CD6B3F9A88DC1E683710 +000400000F710B00 B181FE0F1094BF6C0D6EF11D7DA65929 000400000F710C00 23721014F98DDAE5512E2FDFDAF08D3D 000400000F710D00 CD3EF3D92CCDB32D2C7936D5F45BE04B 000400000F710E00 A334FE1E14A1C6226E80B6217EC78606 @@ -1661,6 +1721,9 @@ 000400000F711300 1D7C4C84CD379BF6F5C761A9FF231394 000400000F711400 05ECFDAF4523E89731D6C7DAF8F2187E 000400000F711900 D626917A7152D30EB538365D644569E8 +000400000F711D00 458BBD07FB3CD75A1EA094799C2416FF 000400000F711F00 AC73C3A018E83E89FA41A139BF054569 000400000F712000 60423DBB2E17052D3E04ABB04351F74D +000400000F712500 2D5A7BC5ED0F050E77E7E97297988235 +000400000F712A00 1B0009156DABDE9D0B8CB0C1C41C2D70 000400000FF3E300 AA9B98FB66563D5E847A619E4D03DF15 diff --git a/src/3dstool.cpp b/src/3dstool.cpp index 4e6339e5..65f4e8e4 100644 --- a/src/3dstool.cpp +++ b/src/3dstool.cpp @@ -56,7 +56,7 @@ C3dsTool::SOption C3dsTool::s_Option[] = { USTR("compress-type"), 0, USTR("[blz|lz(ex)|h4|h8|rl|yaz0]\n\t\tthe type of the compress") }, { USTR("compress-out"), 0, USTR("the output file of uncompressed or compressed") }, { nullptr, 0, USTR(" yaz0:") }, - { USTR("yaz0-align"), 0, USTR("[0|128]\n\t\tthe alignment property of the yaz0 compressed file, optional") }, + { USTR("yaz0-align"), 0, USTR("[0|128|8192]\n\t\tthe alignment property of the yaz0 compressed file, optional") }, { nullptr, 0, USTR(" diff:") }, { USTR("old"), 0, USTR("the old file") }, { USTR("new"), 0, USTR("the new file") }, @@ -978,7 +978,7 @@ C3dsTool::EParseOptionReturn C3dsTool::parseOptions(const UChar* a_pName, int& a } UString sYaz0Align = a_pArgv[++a_nIndex]; n32 nYaz0Align = SToN32(sYaz0Align); - if (nYaz0Align != 0 && nYaz0Align != 128) + if (nYaz0Align != 0 && nYaz0Align != 128 && nYaz0Align != 8192) { m_sMessage = sYaz0Align; return kParseOptionReturnUnknownArgument; diff --git a/src/code.cpp b/src/code.cpp index 7373a9bf..44b583cf 100644 --- a/src/code.cpp +++ b/src/code.cpp @@ -314,6 +314,71 @@ void CCode::findGetRegionFunctionArm(SFunction& a_Function) } } } + for (n32 i = 0; i < m_nArmCount; i++) + { + // mov r0, #0x20000 + if (m_pArm[i] == 0xE3A00802) + { + SFunction function = { i, i }; + findFunctionArm(function); + for (n32 j = i + 1; j < function.Last; j++) + { + // nn::svc::SendSyncRequest + m_uDisasmCount = cs_disasm(m_uHandle, reinterpret_cast(m_pArm + j), 4, 0x100000 + j * 4, 0, &m_pInsn); + if (m_uDisasmCount > 0) + { + if (strcmp(m_pInsn->mnemonic, "bl") == 0 && m_pInsn->detail != nullptr) + { + cs_arm* pDetail = &m_pInsn->detail->arm; + if (pDetail->op_count == 1) + { + cs_arm_op* pArmOp0 = &pDetail->operands[0]; + if (pArmOp0->type == ARM_OP_IMM && pArmOp0->imm >= 0x100000 && pArmOp0->imm + 8 <= 0x100000 + m_nArmCount * 4 && pArmOp0->imm % 4 == 0) + { + n32 nFunction = (pArmOp0->imm - 0x100000) / 4; + // svc 0x32 + // bx lr + if (m_pArm[nFunction] == 0xEF000032 && m_pArm[nFunction + 1] == 0xE12FFF1E) + { + vFunction.push_back(function); + break; + } + } + } + } + } + } + } + } + // nn::cfg::CTR::detail::Initialize + for (n32 i = 0; i < m_nArmCount; i++) + { + // nn::srv::Initialize + // nn::Result + // Level -5 LEVEL_PERMANENT + // Summary 5 SUMMARY_INVALID_STATE + // Module 64 MODULE_NN_CFG + if (m_pArm[i] == 0xD8A103F9) + { + for (n32 j = i - 4; j < i + 4; j++) + { + if (j >= 0 && j < m_nArmCount) + { + for (vector::iterator it = vFunction.begin(); it != vFunction.end(); ++it) + { + SFunction& function = *it; + // nn::cfg::CTR::detail::IpcUser::s_Session + if (function.Last + 1 < m_nArmCount && m_pArm[j] == m_pArm[function.Last + 1]) + { + a_Function.First = function.First; + a_Function.Last = function.Last; + return; + } + } + } + } + } + } } // nn::cfg::CTR::detail::IpcUser::GetRegion