Skip to content

Commit

Permalink
Add CommandLine parser, change syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
SilentHammerHUN committed Aug 2, 2019
1 parent 4b695dd commit 5653322
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 23 deletions.
11 changes: 11 additions & 0 deletions Rhydon.CLI/Options.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using CommandLine;

namespace Rhydon.CLI {
public class Options {
[Option("verbose", Default = false, HelpText = "Prints more info (can clog up the Console!)")]
public bool Verbose { get; set; }

[Option("custom-heap-name", Default = "Koi", HelpText = "Sets the stream name, in case if it isn't Koi")]
public string CustomHeapName { get; set; }
}
}
19 changes: 10 additions & 9 deletions Rhydon.CLI/Program.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Drawing;
using Colorful;
using dnlib.DotNet;
using Rhydon.Core;
using Rhydon.Core.Parser;
Expand All @@ -14,34 +15,34 @@ static void Main() {
};

Resolver.ResolveAssemblies(ctx);
ctx.Header = KoiHeader.Parse(ctx);
ctx.Map = OpCodeMap.Parse(ctx);
KoiHeader.Parse(ctx);
OpCodeMap.Parse(ctx);

foreach (var (key, value) in ctx.Map) {
Console.WriteLine($"{key:X2} : {value}");
//Console.WriteLine($"{key:X2} : {value}");
}
Console.ReadLine();
}

public class Logger : ILogger {
public void Debug(string message) {
Console.WriteLine(message);
Console.WriteLine("[-] " + message, Color.DarkGray);
}

public void Info(string message) {
Console.WriteLine(message);
Console.WriteLine("[*] " + message, Color.White);
}

public void Warning(string message) {
Console.WriteLine(message);
Console.WriteLine("[!] " + message, Color.OrangeRed);
}

public void Error(string message) {
Console.WriteLine(message);
Console.WriteLine("[#] " + message, Color.Red);
}

public void Success(string message) {
Console.WriteLine(message);
Console.WriteLine("[+] " + message, Color.Lime);
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions Rhydon.CLI/Rhydon.CLI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Colorful.Console" Version="1.2.9" />
<PackageReference Include="CommandLineParser" Version="2.6.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Rhydon.Core\Rhydon.Core.csproj" />
</ItemGroup>
Expand Down
6 changes: 3 additions & 3 deletions Rhydon.Core/Parser/KoiHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ public KoiHeader() {
Methods = new Dictionary<uint, MethodExport>();
}

public static KoiHeader Parse(RhydonContext ctx) {
public static void Parse(RhydonContext ctx) {
var heapname = ctx.Parameters["heap", "Koi"];

ctx.Logger.Debug($"Looking for #{heapname} stream...");
var heap = ctx.Module.Metadata.AllStreams.SingleOrDefault(s => s.Name == $"#{heapname}");
if (heap == null) {
ctx.Logger.Error($"#{heapname} stream not found...");
return null;
return;
}

ctx.Logger.Info("Parsing KoiVM header");
Expand All @@ -46,7 +46,7 @@ public static KoiHeader Parse(RhydonContext ctx) {
hdr.ReadMethods(ctx, metCount);
ctx.Logger.Success($"Parsed {metCount} exports");

return hdr;
ctx.Header = hdr;
}

void ReadReferences(RhydonContext ctx, int count) {
Expand Down
8 changes: 4 additions & 4 deletions Rhydon.Core/Parser/OpCodeMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@

namespace Rhydon.Core.Parser {
public class OpCodeMap : Dictionary<byte, KoiOpCodes> {
public static OpCodeMap Parse(RhydonContext ctx) {
public static void Parse(RhydonContext ctx) {
var constantstype = ctx.Module.Types.SingleOrDefault(t => t.HasFields && t.Fields.Count == 119);
if (constantstype == null)
return null;
return;

var map = new OpCodeMap();
var fields = constantstype.Fields.OrderBy(f => f.MDToken.Raw).ToList();
var ctor = constantstype.FindStaticConstructor();
if (ctor == null)
return null;
return;

var body = ctor.Body.Instructions;
for (var i = 1; i < body.Count; i++) {
Expand All @@ -28,7 +28,7 @@ public static OpCodeMap Parse(RhydonContext ctx) {
map[value] = (KoiOpCodes)fields.IndexOf(constant);
}

return map;
ctx.Map = map;
}
}
}
2 changes: 1 addition & 1 deletion Rhydon.Core/Resolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public static void ResolveAssemblies(RhydonContext ctx) {
ctx.Logger.Info("Resolving dependencies...");
foreach (var dep in mod.GetAssemblyRefs()) {
var asm = resolver.ResolveThrow(dep, mod);
ctx.Logger.Info($"Resolved {asm.Name}");
ctx.Logger.Debug($"Resolved {asm.Name}");
}

ctx.Module.Context = modctx;
Expand Down
13 changes: 7 additions & 6 deletions Rhydon.Tests/Parser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public void TestNoKoiHeader() {
mod.Write(ms);

var ctx = new RhydonContext { Module = ModuleDefMD.Load(ms), Logger = new DummyLogger() };
Assert.IsNull(KoiHeader.Parse(ctx));
KoiHeader.Parse(ctx);
Assert.IsNull(ctx.Header);

ms.Close();
}
Expand Down Expand Up @@ -50,9 +51,9 @@ public void TestValidOpCodeMap() {
mod.Write(ms);

var ctx = new RhydonContext { Module = ModuleDefMD.Load(ms), Logger = new DummyLogger() };
var map = OpCodeMap.Parse(ctx);
Assert.IsNotNull(map);
Assert.IsTrue(map[112] == KoiOpCodes.REG_R0);
OpCodeMap.Parse(ctx);
Assert.IsNotNull(ctx.Map);
Assert.IsTrue(ctx.Map[112] == KoiOpCodes.REG_R0);

ms.Close();
}
Expand All @@ -72,8 +73,8 @@ public void TestInvalidOpCodeMap() {
mod.Write(ms);

var ctx = new RhydonContext { Module = ModuleDefMD.Load(ms), Logger = new DummyLogger() };
var map = OpCodeMap.Parse(ctx);
Assert.IsNull(map);
OpCodeMap.Parse(ctx);
Assert.IsNull(ctx.Map);
}
}
}

0 comments on commit 5653322

Please sign in to comment.