diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..741701c
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+*.rc diff
+resource.h diff
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a2efc5f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.vs/
+x64/
+ProxiFy/x64/
+ProxiFy/ProxiFy.aps
\ No newline at end of file
diff --git a/ProxiFy.sln b/ProxiFy.sln
new file mode 100644
index 0000000..25ee236
--- /dev/null
+++ b/ProxiFy.sln
@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ProxiFy", "ProxiFy\ProxiFy.vcxproj", "{C4B3B1EC-1E28-4B7D-B662-05C7B51AFCE2}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C4B3B1EC-1E28-4B7D-B662-05C7B51AFCE2}.Debug|x64.ActiveCfg = Debug|x64
+ {C4B3B1EC-1E28-4B7D-B662-05C7B51AFCE2}.Debug|x64.Build.0 = Debug|x64
+ {C4B3B1EC-1E28-4B7D-B662-05C7B51AFCE2}.Debug|x86.ActiveCfg = Debug|Win32
+ {C4B3B1EC-1E28-4B7D-B662-05C7B51AFCE2}.Debug|x86.Build.0 = Debug|Win32
+ {C4B3B1EC-1E28-4B7D-B662-05C7B51AFCE2}.Release|x64.ActiveCfg = Release|x64
+ {C4B3B1EC-1E28-4B7D-B662-05C7B51AFCE2}.Release|x64.Build.0 = Release|x64
+ {C4B3B1EC-1E28-4B7D-B662-05C7B51AFCE2}.Release|x86.ActiveCfg = Release|Win32
+ {C4B3B1EC-1E28-4B7D-B662-05C7B51AFCE2}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/ProxiFy/ProxiFy.rc b/ProxiFy/ProxiFy.rc
new file mode 100644
index 0000000..6951c9d
Binary files /dev/null and b/ProxiFy/ProxiFy.rc differ
diff --git a/ProxiFy/ProxiFy.vcxproj b/ProxiFy/ProxiFy.vcxproj
new file mode 100644
index 0000000..c867fa1
--- /dev/null
+++ b/ProxiFy/ProxiFy.vcxproj
@@ -0,0 +1,152 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+
+
+
+ {C4B3B1EC-1E28-4B7D-B662-05C7B51AFCE2}
+ Win32Proj
+ ProxiFy
+ 8.1
+
+
+
+ Application
+ true
+ v140
+ Unicode
+
+
+ Application
+ false
+ v140
+ true
+ MultiByte
+
+
+ Application
+ true
+ v140
+ Unicode
+
+
+ Application
+ false
+ v140
+ true
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ true
+
+
+ false
+
+
+ false
+
+
+
+
+
+ Level3
+ Disabled
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+
+
+ Console
+ true
+
+
+
+
+
+
+ Level3
+ Disabled
+ _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+
+
+ Console
+ true
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+
+
+ Console
+ true
+ true
+ true
+ Imagehlp.lib;dbghelp.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+ Level3
+
+
+ MaxSpeed
+ true
+ true
+ NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+
+
+ Console
+ true
+ true
+ true
+ Imagehlp.lib;dbghelp.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ProxiFy/ProxiFy.vcxproj.filters b/ProxiFy/ProxiFy.vcxproj.filters
new file mode 100644
index 0000000..0d8d9e4
--- /dev/null
+++ b/ProxiFy/ProxiFy.vcxproj.filters
@@ -0,0 +1,22 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;hm;inl;inc;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
+
+
+
\ No newline at end of file
diff --git a/ProxiFy/ProxiFy.vcxproj.user b/ProxiFy/ProxiFy.vcxproj.user
new file mode 100644
index 0000000..be25078
--- /dev/null
+++ b/ProxiFy/ProxiFy.vcxproj.user
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/ProxiFy/main.cpp b/ProxiFy/main.cpp
new file mode 100644
index 0000000..0d8ebca
--- /dev/null
+++ b/ProxiFy/main.cpp
@@ -0,0 +1,292 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+using namespace std;
+
+// Check if its 32bit or 64bit
+WORD fileType;
+
+// Exported names
+vector names;
+
+const vector explode(const string& s, const char& c)
+{
+ string buff{ "" };
+ vector v;
+
+ for (auto n : s)
+ {
+ if (n != c) buff += n; else
+ if (n == c && buff != "") { v.push_back(buff); buff = ""; }
+ }
+ if (buff != "") v.push_back(buff);
+
+ return v;
+}
+
+bool GetImageFileHeaders(string fileName, IMAGE_NT_HEADERS &headers)
+{
+ HANDLE fileHandle = CreateFile(
+ fileName.c_str(),
+ GENERIC_READ,
+ FILE_SHARE_READ,
+ nullptr,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ 0
+ );
+ if (fileHandle == INVALID_HANDLE_VALUE)
+ return false;
+
+ HANDLE imageHandle = CreateFileMapping(
+ fileHandle,
+ nullptr,
+ PAGE_READONLY,
+ 0,
+ 0,
+ nullptr
+ );
+ if (imageHandle == 0)
+ {
+ CloseHandle(fileHandle);
+ return false;
+ }
+
+ void *imagePtr = MapViewOfFile(
+ imageHandle,
+ FILE_MAP_READ,
+ 0,
+ 0,
+ 0
+ );
+ if (imagePtr == nullptr)
+ {
+ CloseHandle(imageHandle);
+ CloseHandle(fileHandle);
+ return false;
+ }
+
+ PIMAGE_NT_HEADERS headersPtr = ImageNtHeader(imagePtr);
+ if (headersPtr == nullptr)
+ {
+ UnmapViewOfFile(imagePtr);
+ CloseHandle(imageHandle);
+ CloseHandle(fileHandle);
+ return false;
+ }
+
+ headers = *headersPtr;
+
+ UnmapViewOfFile(imagePtr);
+ CloseHandle(imageHandle);
+ CloseHandle(fileHandle);
+
+ return true;
+}
+
+void ListDLLFunctions(string sADllName, vector& slListOfDllFunctions)
+{
+ DWORD *dNameRVAs(0);
+ DWORD *dNameRVAs2(0);
+ _IMAGE_EXPORT_DIRECTORY *ImageExportDirectory;
+ unsigned long cDirSize;
+ _LOADED_IMAGE LoadedImage;
+ string sName;
+ slListOfDllFunctions.clear();
+ if (MapAndLoad(sADllName.c_str(), NULL, &LoadedImage, TRUE, TRUE))
+ {
+
+
+
+ ImageExportDirectory = (_IMAGE_EXPORT_DIRECTORY*)
+ ImageDirectoryEntryToData(LoadedImage.MappedAddress,
+ false, IMAGE_DIRECTORY_ENTRY_EXPORT, &cDirSize);
+
+ if (ImageExportDirectory != NULL)
+ {
+ dNameRVAs = (DWORD *)ImageRvaToVa(LoadedImage.FileHeader,
+ LoadedImage.MappedAddress,
+ ImageExportDirectory->AddressOfNames, NULL);
+
+ for (size_t i = 0; i < ImageExportDirectory->NumberOfNames; i++)
+ {
+ sName = (char *)ImageRvaToVa(LoadedImage.FileHeader,
+ LoadedImage.MappedAddress,
+ dNameRVAs[i], NULL);
+
+ slListOfDllFunctions.push_back(sName);
+ }
+
+ }
+ UnMapAndLoad(&LoadedImage);
+ }
+}
+
+void GenerateDEF(string name, vector names)
+{
+ std::fstream file;
+ file.open(name + ".def", std::ios::out);
+ file << "LIBRARY " << name << endl;
+ file << "EXPORTS" << endl;
+
+ // Loop them
+ for (int i = 0; i < names.size(); i++)
+ {
+ file << "\t" << names[i] << "=PROXY_" << names[i] << " @" << i+1 << endl;
+ }
+
+ file.close();
+}
+
+void GenerateMainCPP(string name, vector names)
+{
+ std::fstream file;
+ file.open(name + ".cpp", std::ios::out);
+ file << "#include " << endl << endl;
+
+ file << "HINSTANCE hLThis = 0;" << endl;
+ file << "FARPROC p[" << names.size() << "];" << endl;
+ file << "HINSTANCE hL = 0;" << endl << endl;
+
+
+ file << "BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID)" << endl;
+ file << "{" << endl;
+ file << "\tif (reason == DLL_PROCESS_ATTACH)" << endl;
+ file << "\t{" << endl;
+ file << "\t\thLThis = hInst;" << endl;
+ file << "\t\thL = LoadLibrary(\".\\\\" << name << "_.dll\");" << endl;
+ file << "\t\tif(!hL) return false;" << endl;
+ file << "\t}" << endl << endl;
+
+ // Exports addresses
+ for (int i = 0; i < names.size(); i++)
+ {
+ file << "\tp[" << i << "] = GetProcAddress(hL, \"" << names[i] << "\");" << endl;
+ }
+
+
+ file << "\tif (reason == DLL_PROCESS_DETACH)" << endl;
+ file << "\t{" << endl;
+ file << "\t\tFreeLibrary(hL);" << endl;
+ file << "\t\treturn 1;" << endl;
+
+ file << "\t}" << endl << endl;;
+ file << "\treturn 1;" << endl;
+ file << "}" << endl << endl;
+
+
+ // Generate Exports
+ file << "extern \"C\"" << endl << "{" << endl;
+
+ if (fileType == IMAGE_FILE_MACHINE_AMD64)
+ {
+ file << "\tFARPROC PA = NULL;" << endl;
+ file << "\tint RunASM();" << endl << endl;
+
+ for (int i = 0; i < names.size(); i++)
+ {
+ file << "\tvoid " << "PROXY_" << names[i] << "() {" << endl;
+ file << "\t\tPA = p[" << i << "];" << endl;
+ file << "\t\tRunASM();" << endl;
+ file << "\t}" << endl;
+ }
+ } else {
+ for (int i = 0; i < names.size(); i++)
+ {
+ file << "\tvoid " << "PROXY_" << names[i] << "() {" << endl;
+ file << "\t\t__asm" << endl << "\t\t {";
+ file << "\t\t\tjmp p[" << i+1 << " * 4]" << endl;
+ file << "\t\t}" << endl;
+ file << "\t}" << endl;
+ }
+ }
+
+ file << "}" << endl;
+
+ file.close();
+}
+
+void GenerateASM(string name)
+{
+ std::fstream file;
+ file.open(name + ".asm", std::ios::out);
+ file << ".data" << endl;
+ file << "extern PA : qword" << endl;
+ file << ".code" << endl;
+ file << "RunASM proc" << endl;
+ file << "jmp qword ptr [PA]" << endl;
+ file << "RunASM endp" << endl;
+ file << "end" << endl;
+
+ file.close();
+}
+
+int main()
+{
+ OPENFILENAME ofn;
+ char szFile[100];
+
+ // open a file name
+ ZeroMemory(&ofn, sizeof(ofn));
+ ofn.lStructSize = sizeof(ofn);
+ ofn.hwndOwner = NULL;
+ ofn.lpstrFile = szFile;
+ ofn.lpstrFile[0] = '\0';
+ ofn.nMaxFile = sizeof(szFile);
+ ofn.lpstrFilter = "DLL\0*.dll\0";
+ ofn.nFilterIndex = 1;
+ ofn.lpstrFileTitle = NULL;
+ ofn.nMaxFileTitle = 0;
+ ofn.lpstrInitialDir = NULL;
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR;
+
+ cout << "ProxiFy - Copyright (C) Kristoffer Blasiak." << endl;
+ cout << "Select the DLL you want to make a proxy for." << endl;
+
+ if (!GetOpenFileName(&ofn))
+ {
+ MessageBox(NULL, "You have to choose a file.", "File not opened", MB_OK);
+ return 0;
+ }
+
+
+ IMAGE_NT_HEADERS headers;
+ if (GetImageFileHeaders(ofn.lpstrFile, headers))
+ {
+ fileType = headers.FileHeader.Machine;
+ }
+
+ if (fileType == IMAGE_FILE_MACHINE_AMD64)
+ MessageBox(NULL, "64 bit file", "64 bit file", MB_OK);
+
+ if (fileType == IMAGE_FILE_MACHINE_I386)
+ MessageBox(NULL, "32 bit file", "32 bit file", MB_OK);
+
+ // Get filename
+ vector fileNameV = explode(ofn.lpstrFile, '\\');
+ std::string fileName = fileNameV[fileNameV.size() - 1];
+ fileName = fileName.substr(0, fileName.size() - 4);
+
+ // Get dll export names
+ ListDLLFunctions(ofn.lpstrFile, names);
+
+
+ // Create Def File
+ GenerateDEF(fileName, names);
+ GenerateMainCPP(fileName, names);
+
+ if (fileType == IMAGE_FILE_MACHINE_AMD64)
+ GenerateASM(fileName);
+
+
+ return 0;
+}
\ No newline at end of file
diff --git a/ProxiFy/resource.h b/ProxiFy/resource.h
new file mode 100644
index 0000000..de225b8
Binary files /dev/null and b/ProxiFy/resource.h differ