diff --git a/RyujinConsole/Ryujin Protector.sln b/RyujinConsole/Ryujin Protector.sln index 972a684..2ae7b78 100644 --- a/RyujinConsole/Ryujin Protector.sln +++ b/RyujinConsole/Ryujin Protector.sln @@ -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 diff --git a/RyujinConsole/RyujinGUI/RyujinApp.cc b/RyujinConsole/RyujinGUI/RyujinApp.cc new file mode 100644 index 0000000..fce4a0d --- /dev/null +++ b/RyujinConsole/RyujinGUI/RyujinApp.cc @@ -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); + +} \ No newline at end of file diff --git a/RyujinConsole/RyujinGUI/RyujinApp.hh b/RyujinConsole/RyujinGUI/RyujinApp.hh new file mode 100644 index 0000000..c12c71b --- /dev/null +++ b/RyujinConsole/RyujinGUI/RyujinApp.hh @@ -0,0 +1,34 @@ +#include +#include +#include +#include +#include + +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); diff --git a/RyujinConsole/RyujinGUI/RyujinGUI.vcxproj b/RyujinConsole/RyujinGUI/RyujinGUI.vcxproj new file mode 100644 index 0000000..65276de --- /dev/null +++ b/RyujinConsole/RyujinGUI/RyujinGUI.vcxproj @@ -0,0 +1,158 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {04712d9f-1c08-4605-b938-1ec74f2b0acf} + RyujinGUI + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + ..\..\compiled\release + + + ..\..\compiled\release + + + ..\..\compiled\release + + + ..\..\compiled\release + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(WXWIN)\include\msvc;$(WXWIN)\include;%(AdditionalIncludeDirectories) + + + Windows + true + $(WXWIN)\lib\vc_lib;%(AdditionalLibraryDirectories) + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(WXWIN)\include\msvc;$(WXWIN)\include;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + $(WXWIN)\lib\vc_lib;%(AdditionalLibraryDirectories) + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(WXWIN)\include\msvc;$(WXWIN)\include;%(AdditionalIncludeDirectories) + + + Windows + true + $(WXWIN)\lib\vc_x64_lib;%(AdditionalLibraryDirectories) + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(WXWIN)\include\msvc;$(WXWIN)\include;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + $(WXWIN)\lib\vc_x64_lib;%(AdditionalLibraryDirectories) + + + + + + + + + + + + \ No newline at end of file diff --git a/RyujinConsole/RyujinGUI/RyujinGUI.vcxproj.filters b/RyujinConsole/RyujinGUI/RyujinGUI.vcxproj.filters new file mode 100644 index 0000000..5c0b6b1 --- /dev/null +++ b/RyujinConsole/RyujinGUI/RyujinGUI.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + + + Header Files + + + \ No newline at end of file