NPDM KAC improvements
This commit is contained in:
		
							parent
							
								
									4eace88e86
								
							
						
					
					
						commit
						91f33b6d48
					
				
					 3 changed files with 87 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue