bool CreateExeWithDllImport( TCHAR* exepath, TCHAR* dllpath ){ #ifdef UNICODE char szDllPath[256]; WideCharToMultiByte( 0, 0, dllpath, wcslen( dllpath ) + 1, szDllPath, 256, 0, 0 ); #else char* szDllPath = dllpath; #endif if ( !DetourDoesDllExportOrdinal1( dllpath ) ) return false; HANDLE hOld = INVALID_HANDLE_VALUE; HANDLE hNew = INVALID_HANDLE_VALUE; PDETOUR_BINARY pBinary = NULL; TCHAR newpath[256]; memset( newpath, 0, sizeof( newpath ) ); _tcscat( newpath, exepath ); _tcscat( newpath, _T( ".patched" ) ); hOld = CreateFile( exepath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); hNew = CreateFile( newpath, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL ); pBinary = DetourBinaryOpen( hOld ); DetourBinaryResetImports( pBinary ); DetourBinaryEditImports( pBinary, NULL, AddBywayCallback, NULL, NULL, NULL ); DetourBinaryEditImports( pBinary, szDllPath, AddBywayCallback, NULL, NULL, NULL ); DetourBinaryWrite( pBinary, hNew ); DetourBinaryClose( pBinary ); CloseHandle( hOld ); CloseHandle( hNew ); return true; }
BOOL EditFile(PCHAR pszInput, PCHAR pszOutput) { BOOL fGood = TRUE; HANDLE hOld = INVALID_HANDLE_VALUE; HANDLE hNew = INVALID_HANDLE_VALUE; PDETOUR_BINARY pBinary = NULL; if (pszOutput != NULL) { printf("%s -> %s:\n", pszInput, pszOutput); } else { printf("%s:\n", pszInput, pszOutput); } hOld = CreateFile(pszInput, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hOld == INVALID_HANDLE_VALUE) { printf("Couldn't open input file: %s, error: %d\n", pszInput, GetLastError()); fGood = FALSE; goto end; } if ((pBinary = DetourBinaryOpen(hOld)) == NULL) { printf("DetourBinaryOpen failed: %d\n", GetLastError()); goto end; } if (hOld != INVALID_HANDLE_VALUE) { CloseHandle(hOld); hOld = INVALID_HANDLE_VALUE; } if (s_fRestore) { if (!DetourBinaryEditImports(pBinary, NULL, RestoreByway, RestoreFile, RestoreSymbol, RestoreCommit)) { printf("DetourBinaryEditImports for munge failed: %d\n", GetLastError()); } } if (s_fMunge) { MUNGE_STATE state; state.fLastWasByway = FALSE; state.nBywayCount = 1; if (!DetourBinaryEditImports(pBinary, &state, MungeByway, MungeFile, MungeSymbol, MungeCommit)) { printf("DetourBinaryEditImports for munge failed: %d\n", GetLastError()); } } if (s_fList) { if (!DetourBinaryEditImports(pBinary, NULL, ListByway, ListFile, ListSymbol, ListCommit)) { printf("DetourBinaryEditImports for list failed: %d\n", GetLastError()); } } if (pszOutput != NULL) { hNew = CreateFile(pszOutput, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (hNew == INVALID_HANDLE_VALUE) { printf("Couldn't open output file: %s, error: %d\n", pszOutput, GetLastError()); fGood = FALSE; goto end; } if (!DetourBinaryWrite(pBinary, hNew)) { printf("DetourBinaryWrite failed: %d\n", GetLastError()); fGood = FALSE; } CloseHandle(hNew); hNew = INVALID_HANDLE_VALUE; } DetourBinaryClose(pBinary); pBinary = NULL; if (fGood && pszOutput != NULL) { if (!BindImageEx(BIND_NO_BOUND_IMPORTS, pszOutput, ".", ".", NULL)) { printf("Warning: Couldn't bind binary %s: %d\n", pszOutput, GetLastError()); } } end: if (pBinary) { DetourBinaryClose(pBinary); pBinary = NULL; } if (hNew != INVALID_HANDLE_VALUE) { CloseHandle(hNew); hNew = INVALID_HANDLE_VALUE; } if (hOld != INVALID_HANDLE_VALUE) { CloseHandle(hOld); hOld = INVALID_HANDLE_VALUE; } return fGood; }
BOOL SetFile(PCHAR pszPath) { BOOL bGood = TRUE; HANDLE hOld = INVALID_HANDLE_VALUE; HANDLE hNew = INVALID_HANDLE_VALUE; PDETOUR_BINARY pBinary = NULL; CHAR szOrg[MAX_PATH]; CHAR szNew[MAX_PATH]; CHAR szOld[MAX_PATH]; szOld[0] = '\0'; szNew[0] = '\0'; StringCchCopyA(szOrg, sizeof(szOrg), pszPath); StringCchCopyA(szNew, sizeof(szNew), szOrg); StringCchCatA(szNew, sizeof(szNew), "#"); StringCchCopyA(szOld, sizeof(szOld), szOrg); StringCchCatA(szOld, sizeof(szOld), "~"); printf(" %s:\n", pszPath); hOld = CreateFileA(szOrg, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hOld == INVALID_HANDLE_VALUE) { printf("Couldn't open input file: %s, error: %d\n", szOrg, GetLastError()); bGood = FALSE; goto end; } hNew = CreateFileA(szNew, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (hNew == INVALID_HANDLE_VALUE) { printf("Couldn't open output file: %s, error: %d\n", szNew, GetLastError()); bGood = FALSE; goto end; } if ((pBinary = DetourBinaryOpen(hOld)) == NULL) { printf("DetourBinaryOpen failed: %d\n", GetLastError()); goto end; } if (hOld != INVALID_HANDLE_VALUE) { CloseHandle(hOld); hOld = INVALID_HANDLE_VALUE; } { BOOL bAddedDll = FALSE; DetourBinaryResetImports(pBinary); if (!s_fRemove) { if (!DetourBinaryEditImports(pBinary, &bAddedDll, AddBywayCallback, NULL, NULL, NULL)) { printf("DetourBinaryEditImports failed: %d\n", GetLastError()); } } if (!DetourBinaryEditImports(pBinary, NULL, ListBywayCallback, ListFileCallback, NULL, NULL)) { printf("DetourBinaryEditImports failed: %d\n", GetLastError()); } if (!DetourBinaryWrite(pBinary, hNew)) { printf("DetourBinaryWrite failed: %d\n", GetLastError()); bGood = FALSE; } DetourBinaryClose(pBinary); pBinary = NULL; if (hNew != INVALID_HANDLE_VALUE) { CloseHandle(hNew); hNew = INVALID_HANDLE_VALUE; } if (bGood) { if (!DeleteFileA(szOld)) { DWORD dwError = GetLastError(); if (dwError != ERROR_FILE_NOT_FOUND) { printf("Warning: Couldn't delete %s: %d\n", szOld, dwError); bGood = FALSE; } } if (!MoveFileA(szOrg, szOld)) { printf("Error: Couldn't back up %s to %s: %d\n", szOrg, szOld, GetLastError()); bGood = FALSE; } if (!MoveFileA(szNew, szOrg)) { printf("Error: Couldn't install %s as %s: %d\n", szNew, szOrg, GetLastError()); bGood = FALSE; } } DeleteFileA(szNew); } end: if (pBinary) { DetourBinaryClose(pBinary); pBinary = NULL; } if (hNew != INVALID_HANDLE_VALUE) { CloseHandle(hNew); hNew = INVALID_HANDLE_VALUE; } if (hOld != INVALID_HANDLE_VALUE) { CloseHandle(hOld); hOld = INVALID_HANDLE_VALUE; } return bGood; }