Опытный
 
Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007
Репутация: 1 Всего: 1
|
Скачал эту либу и появилось несколько вопросов. Мне нужно перехватывать функции сокетов. Взял в примере код ДЛЛ(tracetcp.dll) | Код | ////////////////////////////////////////////////////////////////////////////// // // Detours Test Program (tracetcp.cpp of tracetcp.dll) // // Microsoft Research Detours Package, Version 2.1. // // Copyright (c) Microsoft Corporation. All rights reserved. // #define _WIN32_WINNT 0x0400 #define WIN32 #define NT
#define DBG_TRACE 0
#if _MSC_VER >= 1300 #include <winsock2.h> #endif #include <windows.h> #include <stdio.h> #include "detours.h" #include "syelog.h"
#define PULONG_PTR PVOID #define PLONG_PTR PVOID #define ULONG_PTR PVOID #define ENUMRESNAMEPROCA PVOID #define ENUMRESNAMEPROCW PVOID #define ENUMRESLANGPROCA PVOID #define ENUMRESLANGPROCW PVOID #define ENUMRESTYPEPROCA PVOID #define ENUMRESTYPEPROCW PVOID #define STGOPTIONS PVOID
////////////////////////////////////////////////////////////////////////////// #pragma warning(disable:4127) // Many of our asserts are constants. #pragma comment(lib, "wsock32.lib") #pragma comment(lib, "Ws2_32.lib")
#define ASSERT_ALWAYS(x) \ do { \ if (!(x)) { \ AssertMessage(#x, __FILE__, __LINE__); \ DebugBreak(); \ } \ } while (0)
#ifndef NDEBUG #define ASSERT(x) ASSERT_ALWAYS(x) #else #define ASSERT(x) #endif
#define UNUSED(c) (c) = (c) #define ARRAYOF(x) (sizeof(x)/sizeof(x[0]))
////////////////////////////////////////////////////////////////////////////// static HMODULE s_hInst = NULL; static WCHAR s_wzDllPath[MAX_PATH];
VOID _PrintDump(SOCKET socket, PCHAR pszData, INT cbData); VOID _PrintEnter(PCSTR psz, ...); VOID _PrintExit(PCSTR psz, ...); VOID _Print(PCSTR psz, ...);
VOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine);
////////////////////////////////////////////////////////////////////////////// // extern "C" { HANDLE (WINAPI * Real_CreateFileW)(LPCWSTR a0, DWORD a1, DWORD a2, LPSECURITY_ATTRIBUTES a3, DWORD a4, DWORD a5, HANDLE a6) = CreateFileW;
BOOL (WINAPI * Real_WriteFile)(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) = WriteFile;
int (WINAPI * Real_recv)(SOCKET a0, char* a1, int a2, int a3) = recv;
int (WINAPI * Real_recvfrom)(SOCKET a0, char* a1, int a2, int a3, sockaddr* a4, int* a5) = recvfrom;
int (WINAPI * Real_send)(SOCKET a0, CONST char* a1, int a2, int a3) = send;
int (WINAPI * Real_sendto)(SOCKET a0, CONST char* a1, int a2, int a3, CONST sockaddr* a4, int a5) = sendto;
///////////////////////////////////////////////////////////// // Detours //
......
VOID NullExport() { }
////////////////////////////////////////////////////////////////////////////// // // DLL module information // BOOL ThreadAttach(HMODULE hDll) { (void)hDll;
if (s_nTlsIndent >= 0) { TlsSetValue(s_nTlsIndent, (PVOID)0); } if (s_nTlsThread >= 0) { LONG nThread = InterlockedIncrement(&s_nThreadCnt); TlsSetValue(s_nTlsThread, (PVOID)(LONG_PTR)nThread); } return TRUE; }
BOOL ThreadDetach(HMODULE hDll) { (void)hDll;
if (s_nTlsIndent >= 0) { TlsSetValue(s_nTlsIndent, (PVOID)0); } if (s_nTlsThread >= 0) { TlsSetValue(s_nTlsThread, (PVOID)0); } return TRUE; }
BOOL ProcessAttach(HMODULE hDll) { s_bLog = FALSE; s_nTlsIndent = TlsAlloc(); s_nTlsThread = TlsAlloc();
WCHAR wzExeName[MAX_PATH]; s_hInst = hDll;
Real_GetModuleFileNameW(hDll, s_wzDllPath, ARRAYOF(s_wzDllPath)); Real_GetModuleFileNameW(NULL, wzExeName, ARRAYOF(wzExeName));
SyelogOpen("tracetcp", SYELOG_FACILITY_APPLICATION); Syelog(SYELOG_SEVERITY_INFORMATION, "##################################################################\n"); Syelog(SYELOG_SEVERITY_INFORMATION, "### %ls\n", wzExeName); LONG error = AttachDetours(); if (error != NO_ERROR) { Syelog(SYELOG_SEVERITY_FATAL, "### Error attaching detours: %d\n", error); }
ThreadAttach(hDll);
s_bLog = TRUE; return TRUE; }
BOOL ProcessDetach(HMODULE hDll) { ThreadDetach(hDll); s_bLog = FALSE;
LONG error = DetachDetours(); if (error != NO_ERROR) { Syelog(SYELOG_SEVERITY_FATAL, "### Error detaching detours: %d\n", error); }
Syelog(SYELOG_SEVERITY_NOTICE, "### Closing.\n"); SyelogClose(FALSE);
if (s_nTlsIndent >= 0) { TlsFree(s_nTlsIndent); } if (s_nTlsThread >= 0) { TlsFree(s_nTlsThread); } return TRUE; }
BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved) { (void)hModule; (void)lpReserved;
switch (dwReason) { case DLL_PROCESS_ATTACH: printf("tracetcp.dll: Starting.\n"); fflush(stdout); Sleep(50); Sleep(50); DetourRestoreAfterWith(); return ProcessAttach(hModule); case DLL_PROCESS_DETACH: return ProcessDetach(hModule); case DLL_THREAD_ATTACH: return ThreadAttach(hModule); case DLL_THREAD_DETACH: return ThreadDetach(hModule); } return TRUE; } // ///////////////////////////////////////////////////////////////// End of File.
|
Вот с момента сборки этой ДЛЛ появился вопрос, вверху оно пытается заинклудить detoured.h который вызывает функцию из detoured.dll вот мне интересно, как это оно так делает без доступа к той ДЛЛ и это при всем том, что оно не компилит а ругается что не найдена сама функция. Поскольку я посмотрел и функция вроде не несет ничего важного,то я ее просто закоментил. После чего все откомпилило. После чего взял дальше пример ЕХЕ который должен подключать эту ДЛЛ | Код | ////////////////////////////////////////////////////////////////////////////// // // Detours Test Program (setdll.cpp of setdll.exe) // // Microsoft Research Detours Package, Version 2.1. // // Copyright (c) Microsoft Corporation. All rights reserved. // #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <shellapi.h> #include "detours.h"
////////////////////////////////////////////////////////////// Error Messages. // VOID AssertMessage(PCSTR szMsg, PCSTR szFile, DWORD nLine) { printf("ASSERT(%s) failed in %s, line %d.", szMsg, szFile, nLine); }
#define ASSERT(x) \ do { if (!(x)) { AssertMessage(#x, __FILE__, __LINE__); DebugBreak(); }} while (0) ;
////////////////////////////////////////////////////////////////////////////// // static BOOLEAN s_fRemove = FALSE; static CHAR s_szDllPath[MAX_PATH] = "";
////////////////////////////////////////////////////////////////////////////// // // This code verifies that the named DLL has been configured correctly // to be imported into the target process. DLLs must export a function with // ordinal #1 so that the import table touch-up magic works. // static BOOL CALLBACK ExportCallback(PVOID pContext, ULONG nOrdinal, PCHAR pszSymbol, PVOID pbTarget) { (void)pContext; (void)pbTarget; (void)pszSymbol;
if (nOrdinal == 1) { *((BOOL *)pContext) = TRUE; } return TRUE; }
BOOL DoesDllExportOrdinal1(PCHAR pszDllPath) { HMODULE hDll = LoadLibraryEx(pszDllPath, NULL, DONT_RESOLVE_DLL_REFERENCES); if (hDll == NULL) { printf("withdll.exe: LoadLibraryEx(%s) failed with error %d.\n", pszDllPath, GetLastError()); return FALSE; }
BOOL validFlag = FALSE; DetourEnumerateExports(hDll, &validFlag, ExportCallback); FreeLibrary(hDll); return validFlag; }
////////////////////////////////////////////////////////////////////////////// // static BOOL CALLBACK ListBywayCallback(PVOID pContext, PCHAR pszFile, PCHAR *ppszOutFile) { (void)pContext;
*ppszOutFile = pszFile; if (pszFile) { printf(" %s\n", pszFile); } return TRUE; }
static BOOL CALLBACK ListFileCallback(PVOID pContext, PCHAR pszOrigFile, PCHAR pszFile, PCHAR *ppszOutFile) { (void)pContext;
*ppszOutFile = pszFile; printf(" %s -> %s\n", pszOrigFile, pszFile); return TRUE; }
static BOOL CALLBACK AddBywayCallback(PVOID pContext, PCHAR pszFile, PCHAR *ppszOutFile) { PBOOL pbAddedDll = (PBOOL)pContext; if (!pszFile && !*pbAddedDll) { // Add new byway. *pbAddedDll = TRUE; *ppszOutFile = s_szDllPath; } return TRUE; }
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';
#ifdef _CRT_INSECURE_DEPRECATE strcpy_s(szOrg, sizeof(szOrg), pszPath); strcpy_s(szNew, sizeof(szNew), szOrg); strcat_s(szNew, sizeof(szNew), "#"); strcpy_s(szOld, sizeof(szOld), szOrg); strcat_s(szOld, sizeof(szOld), "~"); #else strcpy(szOrg, pszPath); strcpy(szNew, szOrg); strcat(szNew, "#"); strcpy(szOld, szOrg); strcat(szOld, "~"); #endif printf(" %s:\n", pszPath);
hOld = CreateFile(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 = CreateFile(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 (!DeleteFile(szOld)) { DWORD dwError = GetLastError(); if (dwError != ERROR_FILE_NOT_FOUND) { printf("Warning: Couldn't delete %s: %d\n", szOld, dwError); bGood = FALSE; } } if (!MoveFile(szOrg, szOld)) { printf("Error: Couldn't back up %s to %s: %d\n", szOrg, szOld, GetLastError()); bGood = FALSE; } if (!MoveFile(szNew, szOrg)) { printf("Error: Couldn't install %s as %s: %d\n", szNew, szOrg, GetLastError()); bGood = FALSE; } }
DeleteFile(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; }
////////////////////////////////////////////////////////////////////////////// // void PrintUsage(void) { printf("Usage:\n" " setdll [options] binary_files\n" "Options:\n" " /d:file.dll : Add file.dll binary files\n" " /r : Remove extra DLLs from binary files\n" " /? : This help screen.\n"); }
//////////////////////////////////////////////////////////////////////// main. // int CDECL main(int argc, char **argv) { BOOL fNeedHelp = FALSE; PCHAR pszFilePart = NULL;
int arg = 1; for (; arg < argc; arg++) { if (argv[arg][0] == '-' || argv[arg][0] == '/') { CHAR *argn = argv[arg] + 1; CHAR *argp = argn; while (*argp && *argp != ':') argp++; if (*argp == ':') *argp++ = '\0';
switch (argn[0]) {
case 'd': // Set DLL case 'D': if ((strchr(argp, ':') != NULL || strchr(argp, '\\') != NULL) && GetFullPathName(argp, sizeof(s_szDllPath), s_szDllPath, &pszFilePart)) { } else { #ifdef _CRT_INSECURE_DEPRECATE sprintf_s(s_szDllPath, sizeof(s_szDllPath), "%s", argp); #else sprintf(s_szDllPath, "%s", argp); #endif } break;
case 'r': // Remove extra set DLLs. case 'R': s_fRemove = TRUE; break;
case '?': // Help fNeedHelp = TRUE; break;
default: fNeedHelp = TRUE; printf("Bad argument: %s:%s\n", argn, argp); break; } } } if (argc == 1) { fNeedHelp = TRUE; } if (!s_fRemove && s_szDllPath[0] == 0) { fNeedHelp = TRUE; } if (fNeedHelp) { PrintUsage(); return 1; }
if (s_fRemove) { printf("Removing extra DLLs from binary files.\n"); } else { if (!DoesDllExportOrdinal1(s_szDllPath)) { printf("Error: %hs does not export function with ordinal #1.\n", s_szDllPath); return 2; } printf("Adding %hs to binary files.\n", s_szDllPath); }
for (arg = 1; arg < argc; arg++) { if (argv[arg][0] != '-' && argv[arg][0] != '/') { SetFile(argv[arg]); } } return 0; }
// End of File
|
Сделало ЕХЕ пытаюсь запустить но получаю сообщение | Цитата | Error: %hs does not export function with ordinal #1.
|
Вот собственно и 2 вопроса: 1)Как оно пытается добратся до detours.dll 2)Что такое эти ординалы и как исправить ошибку Спасибо.
|