From 91f33b6d489ef95d508ec214c037fcd8e6e2a37e Mon Sep 17 00:00:00 2001 From: Dmitry Isaenko Date: Fri, 30 Aug 2019 08:49:00 +0300 Subject: [PATCH] NPDM KAC improvements --- README.md | 4 +- src/main/java/konogonka/RainbowHexDump.java | 4 + .../ACID/KernelAccessControlProvider.java | 82 ++++++++++++++++++- 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 59aa9e4..1d188ff 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,8 @@ JRE/JDK 8u60 or higher. * [X] XCI (+HFS0) * [X] TIK * [X] XML - -* [ ] LogPrinter to singleton implementation +* [X] NRO +* [ ] LogPrinter to singleton implementation. * [ ] NPDM support * [ ] CNMT support * [ ] NSO support diff --git a/src/main/java/konogonka/RainbowHexDump.java b/src/main/java/konogonka/RainbowHexDump.java index 9a29400..f53a6f7 100644 --- a/src/main/java/konogonka/RainbowHexDump.java +++ b/src/main/java/konogonka/RainbowHexDump.java @@ -29,4 +29,8 @@ public class RainbowHexDump { System.out.println(); System.out.print(new String(byteArray, StandardCharsets.UTF_8)+"\n"); } + + public static void octDumpInt(int value){ + System.out.println(String.format("%32s", Integer.toBinaryString( value )).replace(' ', '0')+" | "+value); + } } diff --git a/src/main/java/konogonka/Tools/NPDM/ACID/KernelAccessControlProvider.java b/src/main/java/konogonka/Tools/NPDM/ACID/KernelAccessControlProvider.java index d916315..add60ab 100644 --- a/src/main/java/konogonka/Tools/NPDM/ACID/KernelAccessControlProvider.java +++ b/src/main/java/konogonka/Tools/NPDM/ACID/KernelAccessControlProvider.java @@ -1,10 +1,90 @@ package konogonka.Tools.NPDM.ACID; +import konogonka.LoperConverter; import konogonka.RainbowHexDump; +/* +NOTE: +KAC is set of 4-byes blocks +Consider them as uInt32 (Read as Little endian) +Look on the tail of each block (low bits). If tail is equals to mask like 0111111 then such block is related to one of the possible sections (KernelFlags etc.) +If it's related to the one of the blocks, then we could pick useful data from this block. +Example: +36 BYES on this section, then 9 blocks with len = 4-bytes each available +1 00-01-02-03 +2 04-05-06-07 +3 08-09-10-11 +4 12-13-14-15 +5 16-17-18-19 +6 20-21-22-23 +7 24-25-26-27 +8 28-29-30-31 +9 32-33-34-35 + +Possible patterns are: +Octal | Decimal +00000000000000000000000000000111 | 7 <- KernelFlags +00000000000000000000000000001111 | 15 <- SyscallMask +00000000000000000000000000111111 | 63 <- MapIoOrNormalRange +00000000000000000000000001111111 | 127 <- MapNormalPage (RW) +00000000000000000000011111111111 | 2047 <- InterruptPair +00000000000000000001111111111111 | 8191 <- ApplicationType +00000000000000000011111111111111 | 16383 <- KernelReleaseVersion +00000000000000000111111111111111 | 32767 <- HandleTableSize +00000000000000001111111111111111 | 65535 <- DebugFlags +Other masks could be implemented by N in future (?). + +TIP: Generate +int j = 0xFFFFFFFF; +for (byte i = 0; i < 16; i++){ + j = (j << 1); + RainbowHexDump.octDumpInt(~j); +} + */ + public class KernelAccessControlProvider { - KernelAccessControlProvider(byte[] bytes){ + KernelAccessControlProvider(byte[] bytes) throws Exception{ + if (bytes.length < 4) + throw new Exception("ACID-> KernelAccessControlProvider: too small size of the Kernel Access Control"); + final int pattrnKernFlags = 7; + final int pattrnSyscallMsk = 15; + final int pattrnMapIoNormalRange = 63; + final int pattrnRw = 127; + final int pattrnInterrPair = 2047; + final int pattrnAppType = 8191; + final int pattrnKernRelVer = 16383; + final int pattrnHandlTblSize = 32767; + final int pattrnDbgFlags = 65535; + RainbowHexDump.hexDumpUTF8(bytes); + for (int o = 0; o < bytes.length; o += 4) { + RainbowHexDump.octDumpInt(LoperConverter.getLEint(bytes, o)); + } + System.out.println(); + + RainbowHexDump.octDumpInt(pattrnKernFlags); + RainbowHexDump.octDumpInt(pattrnSyscallMsk); + RainbowHexDump.octDumpInt(pattrnMapIoNormalRange); + RainbowHexDump.octDumpInt(pattrnRw); + RainbowHexDump.octDumpInt(pattrnInterrPair); + RainbowHexDump.octDumpInt(pattrnAppType); + RainbowHexDump.octDumpInt(pattrnKernRelVer); + RainbowHexDump.octDumpInt(pattrnHandlTblSize); + RainbowHexDump.octDumpInt(pattrnDbgFlags); + + + int KernelFlagsHiCpuId; // 7 31-24 + int KernelFlagsLoCpuId; // 7 23-16 + int KernelFlagsHiThreadPrio; // 5 15-10 + int KernelFlagsLoThreadPrio; // 5 9-4 + int SyscallMask; + int MapIoOrNormalRange; + int MapNormalPage_RW; + int InterruptPair; + int ApplicationType; + int KernelReleaseVersion; + int HandleTableSize ; + int DebugFlags; } }