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