Возникли проблемы с обходом Microsoft - PullRequest
1 голос
/ 24 декабря 2011

Я пытаюсь сделать несколько основных перехватов с обходами Microsoft, и я не могу заставить его работать.Я использовал в основном код, который был размещен в этой теме:

Как я могу перехватить функции Windows в C / C ++?

, но без кубиков.Я обновил функции отправки / получения в коде DLL, чтобы просто записывать данные в файл, и я попытался подключить основную программу к программе «интернет-проверки», но файл журнала не создается, поэтому кажется, что DLLне вводили.

Я использую 64-битную Windows 7, Visual Studio 10.0, Detours 3.0 (похоже, что моя среда настроена правильно, никаких проблем со сборкой или что-то еще).Я создал проект DLL, вставил в код DLL по ссылке выше, с обновлением send / recv следующим образом:

FILE * pSendLogFile;
fopen_s(&pSendLogFile, "C:\\SendLog.txt", "a+");
fprintf(pSendLogFile, "%s\n", buf);
fclose(pSendLogFile);

и скомпилировал.Затем создал другой проект, вставил в основной код по ссылке выше, настроил его на поиск программы chkrzm.exe (checkers) и жестко запрограммировал путь к DLL:

fullPath = "C:\\Users\\PM\\Documents\\Programs\\C Code\\Test\\DLLTester2\\Debug\\DLLTester2.dll";

и запустил его, нобез костиЕсть идеи, почему я не могу заставить это работать?

Ответы [ 2 ]

2 голосов
/ 26 декабря 2011

К вашему сведению, это решено. Чтобы увидеть, какие процессы являются 32-битными, просто нажмите Ctrl-Alt-Delete и перейдите в диспетчер задач; 32-битные процессы перечислены с * 32 рядом с ними. Также получил мой крюк работает; вот код Я отказался от подхода CreateRemoteThread и просто использовал общесистемный хук. Я сшил код из:

Как подключить внешний процесс с помощью SetWindowsHookEx и WH_KEYBOARD http://www.codingthewheel.com/archives/how-i-built-a-working-online-poker-bot-4 http://www.codingthewheel.com/archives/how-i-built-a-working-online-poker-bot-7

Эта программа просто переворачивает текст в 32-битных процессах (как показано в последней ссылке выше). Например. открыть текстовую панель и навести курсор на меню; их текст должен быть перевернут.

DLL:

#include <windows.h>
#include <detours.h>
#include <stdio.h>
#include <iostream>
using namespace std;


// Initial stuff
#ifdef _MANAGED
#pragma managed(push, off)
#endif

#pragma comment( lib, "Ws2_32.lib" )
#pragma comment( lib, "detours.lib" )

#pragma data_seg("Shared")
HHOOK   g_hHook  = NULL;
#pragma data_seg()


// Globals
HINSTANCE  g_hInstance = NULL;


// ExtTextOut - original
BOOL (WINAPI * Real_ExtTextOut)(HDC hdc, int X, int Y, UINT options, const RECT* lprc, LPCTSTR text, UINT cbCount, const INT* lpSpacingValues) = ExtTextOut;

// ExtTextOut - overridden
BOOL WINAPI Mine_ExtTextOut(HDC hdc, int X, int Y, UINT options, const RECT* lprc, LPCTSTR text, UINT cbCount, const INT* lpSpacingValues)
{
    if (!text)
        return TRUE;

    // Make a copy of the supplied string..safely
    LPWSTR szTemp = (LPWSTR)LocalAlloc(0, (cbCount+1) * 2);
    memcpy(szTemp, text, cbCount*2); // can't use strcpy here
    szTemp[cbCount] = L'\0'; // append terminating null

    // Reverse it..
    wcsrev(szTemp);

    // Pass it on to windows...
    BOOL rv = Real_ExtTextOut(hdc, X, Y, options, lprc, szTemp, cbCount, lpSpacingValues);

    // Cleanup
    LocalFree(szTemp);

    return TRUE;
}


// DLLMain
BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved  )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            g_hInstance  = (HINSTANCE) hModule;

            DetourTransactionBegin(); 
            DetourUpdateThread(GetCurrentThread());
            DetourAttach(&(PVOID&)Real_ExtTextOut, Mine_ExtTextOut); // <- magic
            DetourTransactionCommit();
            break;

        case DLL_PROCESS_DETACH:
            DetourTransactionBegin(); 
            DetourUpdateThread(GetCurrentThread());
            DetourDetach(&(PVOID&)Real_ExtTextOut, Mine_ExtTextOut);
            DetourTransactionCommit();
            break;
    }

    return TRUE;
}


// CBT Hook - dll is hooked into all processes (only 32 bit processes on my machine)
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)
        return CallNextHookEx(g_hHook, nCode, wParam, lParam);

    // Return 0 to allow window creation/destruction/activation to proceed as normal.
    return 0;
}


// Install hook
extern "C" __declspec(dllexport) bool install()
{
    g_hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, g_hInstance, 0);

    return g_hHook != NULL;
}


// Uninstall hook
extern "C" __declspec(dllexport) void uninstall()
{
    if (g_hHook)
    {
        UnhookWindowsHookEx(g_hHook);
        g_hHook = NULL;
    }
}

Основная программа:

#include <Windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iostream>
using namespace std;


// Main
int _tmain(int argc, _TCHAR* argv[])
{
    // Load dll
    HINSTANCE hinst = LoadLibrary(_T("C:\\Users\\PM\\Documents\\Programs\\C Code\\Test\\DLLTesterFinal\\Debug\\DLLTesterFinal.dll")); 

    if (hinst)
    {
        // Get functions
        typedef bool (*Install)();
        typedef void (*Uninstall)();
        Install install = (Install) GetProcAddress(hinst, "install");
        Uninstall uninstall = (Uninstall) GetProcAddress(hinst, "uninstall");
        cout << "GetLastError1: " << GetLastError () << endl << endl;

        // Install hook
        bool hookInstalledSuccessfully = install ();
        cout << "GetLastError2: " << GetLastError () << endl;
        cout << "Hook installed successfully? " << hookInstalledSuccessfully << endl << endl;

        // At this point, go to a 32-bit process (eg. textpad, chrome) and hover over menus; their text should get reversed
        cout << "Text should now be reversed in 32-bit processes" << endl;
        system ("Pause");

        // Uninstall hook
        uninstall();
        cout << endl << "GetLastError3: " << GetLastError () << endl;
        cout << "Done" << endl;
        system ("Pause");
    }

    return 0;
}

Однако при попытке обхода ExtTextOut в Java-приложении происходит сбой; нужно расследовать это.

1 голос
/ 30 мая 2012

Я использую 64-разрядную версию Windows 7, Visual Studio 10.0

Вы должны запустить MS DETOUR INJECT как администратор на WIN7. Для проверки рабочего кода обхода используйте примеры для обхода 3.0, используйте make target test.

cmd>$Path/Detours Express 3.0>nmake test

...