feat: Initialize Ryujin GUI with basic layout and functionality

- Set up base GUI project structure using wxWidgets.
- Implement main window with custom styles and fixed dimensions.
- Add input fields for EXE, PDB, and output paths.
- Include obfuscation options with styled checkboxes.
- Add procedure list with add/remove functionality.
- Implement progress bar and "Run Obfuscator" button.
- Bind events for file selection, procedure management, and obfuscation run.
This commit is contained in:
keowu
2025-07-01 21:17:23 -03:00
parent b078160d6b
commit 6d146f06bf
5 changed files with 861 additions and 0 deletions

View File

@@ -7,6 +7,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RyujinConsole", "RyujinCons
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RyujinCore", "..\RyujinCore\RyujinCore.vcxproj", "{AEFF626B-1317-4C8F-94B3-B3D405AE65B2}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RyujinGUI", "RyujinGUI\RyujinGUI.vcxproj", "{04712D9F-1C08-4605-B938-1EC74F2B0ACF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@@ -31,6 +33,14 @@ Global
{AEFF626B-1317-4C8F-94B3-B3D405AE65B2}.Release|x64.Build.0 = Release|x64
{AEFF626B-1317-4C8F-94B3-B3D405AE65B2}.Release|x86.ActiveCfg = Release|Win32
{AEFF626B-1317-4C8F-94B3-B3D405AE65B2}.Release|x86.Build.0 = Release|Win32
{04712D9F-1C08-4605-B938-1EC74F2B0ACF}.Debug|x64.ActiveCfg = Debug|x64
{04712D9F-1C08-4605-B938-1EC74F2B0ACF}.Debug|x64.Build.0 = Debug|x64
{04712D9F-1C08-4605-B938-1EC74F2B0ACF}.Debug|x86.ActiveCfg = Debug|Win32
{04712D9F-1C08-4605-B938-1EC74F2B0ACF}.Debug|x86.Build.0 = Debug|Win32
{04712D9F-1C08-4605-B938-1EC74F2B0ACF}.Release|x64.ActiveCfg = Release|x64
{04712D9F-1C08-4605-B938-1EC74F2B0ACF}.Release|x64.Build.0 = Release|x64
{04712D9F-1C08-4605-B938-1EC74F2B0ACF}.Release|x86.ActiveCfg = Release|Win32
{04712D9F-1C08-4605-B938-1EC74F2B0ACF}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -0,0 +1,632 @@
#include "RyujinApp.hh"
bool RyujinApp::OnInit() {
auto* frame = new wxFrame(
nullptr,
wxID_ANY,
"Ryujin Obfuscator",
wxDefaultPosition,
wxSize(
850,
580
),
wxDEFAULT_FRAME_STYLE & ~(wxRESIZE_BORDER | wxMAXIMIZE_BOX)
);
frame->SetBackgroundColour(
wxColour(
25,
25,
25
));
frame->SetFont(
wxFont(
10,
wxFONTFAMILY_SWISS,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL
));
auto* topSizer = new wxBoxSizer(
wxVERTICAL
);
auto* title = new wxStaticText(
frame,
wxID_ANY,
"Ryujin Obfuscator"
);
title->SetFont(
wxFont(
18,
wxFONTFAMILY_SWISS,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_BOLD
));
title->SetForegroundColour(
*wxWHITE
);
topSizer->Add(
title,
0,
wxALIGN_CENTER | wxTOP,
20
);
topSizer->Add(
new wxStaticLine(
frame
),
0,
wxEXPAND | wxLEFT | wxRIGHT | wxTOP,
15
);
auto* pathBox = new wxStaticBoxSizer(
wxVERTICAL,
frame,
"Paths"
);
pathBox->GetStaticBox()->SetForegroundColour(
*wxWHITE
);
m_input = DrawnPathRow(
frame,
pathBox,
"Input EXE:",
wxID_HIGHEST + 1
);
m_pdb = DrawnPathRow(
frame,
pathBox,
"PDB File:",
wxID_HIGHEST + 2
);
m_output = DrawnPathRow(
frame,
pathBox,
"Output EXE:",
wxID_HIGHEST + 3
);
topSizer->Add(
pathBox,
0,
wxEXPAND | wxALL,
15
);
auto* optionsBox = new wxStaticBoxSizer(
wxVERTICAL,
frame,
"Obfuscation Options"
);
optionsBox->GetStaticBox()->SetForegroundColour(
*wxWHITE
);
auto* optionsSizer = new wxGridSizer(
2,
3,
10,
10
);
m_virtualize = DrawnStyledCheckbox(
frame,
"Virtualize"
);
m_junk = DrawnStyledCheckbox(
frame,
"Junk Code"
);
m_encrypt = DrawnStyledCheckbox(
frame,
"Encrypt"
);
m_randomSection = DrawnStyledCheckbox(
frame,
"Random Section"
);
m_obfuscateIat = DrawnStyledCheckbox(
frame,
"Obfuscate IAT"
);
m_ignoreOriginalCodeRemove = DrawnStyledCheckbox(
frame,
"Ignore Original Code Removal"
);
optionsSizer->Add(
m_virtualize
);
optionsSizer->Add(
m_junk
);
optionsSizer->Add(
m_encrypt
);
optionsSizer->Add(
m_randomSection
);
optionsSizer->Add(
m_obfuscateIat
);
optionsSizer->Add(
m_ignoreOriginalCodeRemove
);
optionsBox->Add(
optionsSizer,
0,
wxEXPAND | wxALL,
10
);
topSizer->Add(
optionsBox,
0,
wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM,
15
);
auto* procBox = new wxStaticBoxSizer(
wxVERTICAL,
frame,
"Procedures to Obfuscate"
);
procBox->GetStaticBox()->SetForegroundColour(
*wxWHITE
);
m_procList = new wxListBox(
frame,
wxID_ANY,
wxDefaultPosition,
wxDefaultSize,
0,
nullptr,
wxBORDER_NONE
);
m_procList->SetBackgroundColour(
wxColour(
40,
40,
40
));
m_procList->SetForegroundColour(
*wxWHITE
);
procBox->Add(
m_procList,
1,
wxEXPAND | wxBOTTOM,
5
);
auto* procBtnRow = new wxBoxSizer(
wxHORIZONTAL
);
procBtnRow->Add(
DrawnRyujinButton(
frame,
"Add",
wxID_HIGHEST + 4
),
0,
wxRIGHT,
10
);
procBtnRow->Add(
DrawnRyujinButton(
frame,
"Remove",
wxID_HIGHEST + 5
));
procBox->Add(
procBtnRow,
0,
wxALIGN_RIGHT
);
topSizer->Add(
procBox,
1,
wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM,
15
);
m_progress = new wxGauge(
frame,
wxID_ANY,
100
);
m_progress->SetMinSize(
wxSize(
-1,
14
));
m_progress->SetForegroundColour(
wxColour(
0,
150,
255
));
m_progress->SetBackgroundColour(
wxColour(
45,
45,
45
));
auto* runBtn = DrawnRyujinButton(
frame,
"Run Obfuscator",
wxID_HIGHEST + 6
);
runBtn->SetMinSize(
wxSize(
160,
42
));
runBtn->SetFont(
wxFont(
11,
wxFONTFAMILY_SWISS,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_BOLD
));
auto* runRow = new wxBoxSizer(
wxHORIZONTAL
);
runRow->Add(
runBtn,
0,
wxRIGHT,
20
);
runRow->Add(
m_progress,
1,
wxALIGN_CENTER_VERTICAL
);
topSizer->Add(
runRow,
0,
wxLEFT | wxRIGHT | wxBOTTOM | wxEXPAND,
20
);
frame->CreateStatusBar();
frame->SetSizerAndFit(
topSizer
);
frame->Centre();
frame->Show();
BindFileDialogs(
frame
);
BindListEvents(
frame
);
BindRunEvent(
frame
);
return true;
}
auto RyujinApp::DrawnPathRow(wxWindow* parent, wxBoxSizer* sizer, const wxString& label, int buttonId) -> wxTextCtrl* {
auto* row = new wxBoxSizer(
wxHORIZONTAL
);
auto* lbl = new wxStaticText(
parent,
wxID_ANY,
label
);
lbl->SetForegroundColour(
*wxWHITE
);
auto* txt = new wxTextCtrl(
parent,
wxID_ANY,
"",
wxDefaultPosition,
wxSize(
-1,
28
),
wxBORDER_NONE
);
txt->SetBackgroundColour(
wxColour(
40,
40,
40
));
txt->SetForegroundColour(
*wxWHITE
);
auto* btn = DrawnRyujinButton(
parent,
"Browse",
buttonId
);
row->Add(
lbl,
0,
wxALIGN_CENTER_VERTICAL | wxRIGHT,
10
);
row->Add(
txt,
1,
wxRIGHT,
10
);
row->Add(
btn
);
sizer->Add(
row,
0,
wxEXPAND | wxALL,
8
);
return txt;
}
auto RyujinApp::DrawnStyledCheckbox(wxWindow* parent, const wxString& label) -> wxCheckBox* {
auto* box = new wxCheckBox(
parent,
wxID_ANY,
label
);
box->SetForegroundColour(
*wxWHITE
);
return box;
}
auto RyujinApp::DrawnRyujinButton(wxWindow* parent, const wxString& label, int id) -> wxButton* {
auto* btn = new wxButton(
parent,
id,
label,
wxDefaultPosition,
wxDefaultSize,
wxBORDER_NONE
);
btn->SetBackgroundColour(
wxColour(
60,
60,
60
));
btn->SetForegroundColour(
*wxWHITE
);
return btn;
}
auto RyujinApp::BindFileDialogs(wxFrame* frame) -> void {
auto bind = [=](int id, wxTextCtrl* target, const wxString& ext, bool save = false) {
frame->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) {
wxFileDialog dlg(frame, save ? "Save file" : "Select file", "", "", "*." + ext + "|*." + ext,
save ? wxFD_SAVE | wxFD_OVERWRITE_PROMPT : wxFD_OPEN);
if (dlg.ShowModal() == wxID_OK)
target->SetValue(dlg.GetPath());
}, id);
};
bind(wxID_HIGHEST + 1, m_input, "exe");
bind(wxID_HIGHEST + 2, m_pdb, "pdb");
bind(wxID_HIGHEST + 3, m_output, "exe", true);
}
auto RyujinApp::BindListEvents(wxFrame* frame) -> void {
frame->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) {
wxTextEntryDialog dlg(frame, "Enter comma-separated procedures or a unique procedure name:");
if (dlg.ShowModal() == wxID_OK) {
wxArrayString list = wxSplit(dlg.GetValue(), ',');
for (auto& p : list)
m_procList->Append(p.Trim());
}
}, wxID_HIGHEST + 4);
frame->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) {
int sel = m_procList->GetSelection();
if (sel != wxNOT_FOUND)
m_procList->Delete(sel);
}, wxID_HIGHEST + 5);
}
auto RyujinApp::BindRunEvent(wxFrame* frame) -> void {
frame->Bind(wxEVT_BUTTON, [=](wxCommandEvent&) {
frame->SetStatusText("Starting obfuscation...");
m_progress->Pulse();
wxMilliSleep(1000);
m_progress->SetValue(100);
frame->SetStatusText("Obfuscation complete.");
}, wxID_HIGHEST + 6);
}

View File

@@ -0,0 +1,34 @@
#include <wx/wx.h>
#include <wx/filedlg.h>
#include <wx/gauge.h>
#include <wx/textdlg.h>
#include <wx/statline.h>
class RyujinApp : public wxApp {
private:
wxTextCtrl* m_input = nullptr;
wxTextCtrl* m_pdb = nullptr;
wxTextCtrl* m_output = nullptr;
wxCheckBox* m_virtualize = nullptr;
wxCheckBox* m_junk = nullptr;
wxCheckBox* m_encrypt = nullptr;
wxCheckBox* m_randomSection = nullptr;
wxCheckBox* m_obfuscateIat = nullptr;
wxCheckBox* m_ignoreOriginalCodeRemove = nullptr;
wxListBox* m_procList = nullptr;
wxGauge* m_progress = nullptr;
auto DrawnPathRow(wxWindow* parent, wxBoxSizer* sizer, const wxString& label, int buttonId) -> wxTextCtrl*;
auto DrawnStyledCheckbox(wxWindow* parent, const wxString& label) -> wxCheckBox*;
auto DrawnRyujinButton(wxWindow* parent, const wxString& label, int id) -> wxButton*;
auto BindFileDialogs(wxFrame* frame) -> void;
auto BindListEvents(wxFrame* frame) -> void;
auto BindRunEvent(wxFrame* frame) -> void;
public:
bool OnInit() override;
};
wxIMPLEMENT_APP(RyujinApp);

View File

@@ -0,0 +1,158 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{04712d9f-1c08-4605-b938-1ec74f2b0acf}</ProjectGuid>
<RootNamespace>RyujinGUI</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>..\..\compiled\release</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>..\..\compiled\release</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>..\..\compiled\release</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>..\..\compiled\release</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(WXWIN)\include\msvc;$(WXWIN)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(WXWIN)\lib\vc_lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(WXWIN)\include\msvc;$(WXWIN)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(WXWIN)\lib\vc_lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(WXWIN)\include\msvc;$(WXWIN)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(WXWIN)\lib\vc_x64_lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(WXWIN)\include\msvc;$(WXWIN)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(WXWIN)\lib\vc_x64_lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="RyujinApp.cc" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="RyujinApp.hh" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="RyujinApp.cc">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="RyujinApp.hh">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>