Здравствуйте, forston, Вы писали:
F>Приветствую, возникла проблемка, не могу разобраться.
F>DLL инжектится в уже запущенный процесс — приложение пустышка вызывающее несколько раз MessageBoxW, с инжектом моей dll у функци трамплина затирается код на джамп назад в оригинальную функцию, у оригинальной функции затираются первые пять байт джампом на подставную. А вот с подставной проблема, не знаю почему но тело функции при дизасме заставлено int 3
вот что у меня получилось
// Tramp.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "Tramp.h"
#include <windows.h>
//#include "detours.h"
//#pragma comment(lib, "detours.lib")
extern "C" __declspec(dllexport) LRESULT CALLBACK dllfnc(int nCode, WPARAM wParam, LPARAM lParam);
BOOL _stdcall InterceptAPI(HMODULE hLocalModule, LPCWSTR c_szDllName, const char* c_szApiName, DWORD dwReplaced, DWORD dwTrampoline, int offset);
BOOL WINAPI _stdcall TrampolineMessageBoxW(HWND hWnd,LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
//BOOL _stdcall TrampolineFunc(HWND hWnd,LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
BOOL __declspec(naked) TrampolineFunc(HWND hWnd,LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{
__asm{
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
}
//return TRUE;
}
BOOL WINAPI _stdcall TrampolineMessageBoxW(HWND hWnd,LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) {
TCHAR * str = L"WAS HOOKED";
return TrampolineFunc(hWnd, str, str, uType);
}
BOOL _stdcall InterceptAPI(HMODULE hLocalModule, LPCWSTR c_szDllName, const char* c_szApiName, DWORD dwReplaced, DWORD dwTrampoline, int offset) {
int i;
DWORD dwOldProtect;
HMODULE hm = GetModuleHandleW(c_szDllName);
DWORD dwAddressToIntercept = (DWORD)GetProcAddress(hm, (char*)c_szApiName);
BYTE *pbTargetCode = (BYTE *) dwAddressToIntercept;
BYTE *pbReplaced = (BYTE *) dwReplaced;
BYTE *pbTrampoline = (BYTE *) dwTrampoline;
// Change the protection of the trampoline region
// so that we can overwrite the first 5 + offset bytes.
VirtualProtect((void *) dwTrampoline, 5+offset, PAGE_EXECUTE_READWRITE, &dwOldProtect);
for (i=0;i<offset;i++) {
*pbTrampoline++ = *pbTargetCode++;
}
pbTargetCode = (BYTE *) dwAddressToIntercept;
// Insert unconditional jump in the trampoline.
*pbTrampoline++ = 0xE9; // jump rel32
*((signed int *)(pbTrampoline)) = (pbTargetCode+offset) - (pbTrampoline + 4);
VirtualProtect((void *) dwTrampoline, 5+offset, PAGE_EXECUTE_READWRITE, &dwOldProtect);
// Overwrite the first 5 bytes of the target function
VirtualProtect((void *) dwAddressToIntercept, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect);
*pbTargetCode++ = 0xE9; // jump rel32
*((signed int *)(pbTargetCode)) = pbReplaced - (pbTargetCode +4);
VirtualProtect((void *) dwAddressToIntercept, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect);
FlushInstructionCache(GetCurrentProcess(), NULL, NULL);
return TRUE;
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
InterceptAPI(hInstance, L"user32.dll", "MessageBoxW", (DWORD)TrampolineMessageBoxW, (DWORD)TrampolineFunc, 0);
MessageBoxW(NULL, NULL, NULL, 0); // to load user32.dll into exe
return 0;
}
и дальше проблема stack overflow, из за бесконечной рекурсии (прыгает не в оригинал, а сам в себя)
вообще еще будет много проблем

не проще для обычных функций использовать перехват через таблицу экспорт/импорта? (по рихтеру, статья есть даже где-то тут на сайте)