Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват API функции ReadFile 
:(
    Опции темы
freezeman
Дата 7.1.2012, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Всем привет!
Подскажите пожалуйста, может кто сталкивался с перехватом API функций. 
Мне необходимо перехватить функцию ReadFile... Причем перехват должен быть глобальным.

Реализовал описанный здесь способ, там и код тоже приводится, но в результате не перехватывает, а на многие приложения, например, стандартный калькулятор даже не захотел зайти в функцию...

Читал о фреймворке Microsoft Detours, как мне показалось, там намного проще все реализуется...скачал библиотеку попытался откомпилировать...вроде бы получилось, но при подключении в Visual Studio <detours.h> выдает ошибку о том, что не может найти этот файл...возможна проблема с компиляцией...

Если кто работал с Detours, помогите, пожалуйста...
Или может другие варианты есть...?

Все пробовал как в Windows 7 x64, x86, так и в Windows XP x86.
PM MAIL   Вверх
shara
Дата 7.1.2012, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



сталкивался  с этой проблемой, но от перехвата АПИ -функций я отказался так как она граничит с "хаком" и не всегда приемлема.
давно дело было, исходники свои я где-то посеял.. может со временем проростут. нашел только старый архив со статьями по которым в свое время монироли вопрос.



Это сообщение отредактировал(а) shara - 7.1.2012, 16:58

Присоединённый файл ( Кол-во скачиваний: 26 )
Присоединённый файл  perehfat_API__articles__p.1.zip 623,96 Kb


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
shara
Дата 7.1.2012, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



а решил проблему путем писания драйвера фильтра файловой системы. на мой взгляд это более легально\универсально\функциональней. Вот тут  и тут обсуждения (да простят меня Одмины за сцылку на конкурирующий сайт  smile )


Присоединённый файл ( Кол-во скачиваний: 30 )
Присоединённый файл  perehfat_API__articles__p.2.zip 795,66 Kb


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
actuator
Дата 7.1.2012, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



Цитата(freezeman @  7.1.2012,  16:18 Найти цитируемый пост)
Читал о фреймворке Microsoft Detours, как мне показалось, там намного проще все реализуется...скачал библиотеку попытался откомпилировать...вроде бы получилось, но при подключении в Visual Studio <detours.h> выдает ошибку о том, что не может найти этот файл...возможна проблема с компиляцией...

Значит, пути include не проставлены или проставлены неверно. Других причин у этой ошибки нет.
PM MAIL   Вверх
freezeman
Дата 7.1.2012, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(actuator @ 7.1.2012,  20:16)
Цитата(freezeman @  7.1.2012,  16:18 Найти цитируемый пост)
Читал о фреймворке Microsoft Detours, как мне показалось, там намного проще все реализуется...скачал библиотеку попытался откомпилировать...вроде бы получилось, но при подключении в Visual Studio <detours.h> выдает ошибку о том, что не может найти этот файл...возможна проблема с компиляцией...

Значит, пути include не проставлены или проставлены неверно. Других причин у этой ошибки нет.

Я пробовал, добавить в настройках путь к файлу detours.h, но при запуске проекта показывает > 100 ошибок. Возможно, что компиляция прошла неправильно? В VS  2010 не получается указать директорию, где хранятся эти .h-файлы...
Просто очень надо...помогите разобраться, хотя бы настроить MS Detours для работы в Visual Studio...

Ниже вывод при компиляции, если нужен будет.
Вот вывод при компиляции через командную строку VS 2005 Express:
    cd "C:\Documents and Settings\SMan\??????? ????\Detours Express 3.0\src"
    if not exist "..\include" mkdir "..\include"
    if not exist "..\lib.X86" mkdir "..\lib.X86"
    if not exist "..\bin.X86" mkdir "..\bin.X86"
    if not exist "obj.X86" mkdir "obj.X86"
    cl /W4 /WX /Zi /MTd /Gy /Gm- /Zl /Od /DWIN32_LEAN_AND_MEAN /D_WIN32_WINNT=0x403 /Gs /DDETOURS_X86=1 /DDETOURS_32BIT=1 /D_X86_ /Fd..\lib.X86\detours.pdb /Foobj.X86\detours.obj /c .\detours.cpp
detours.cpp
.\detours.cpp(9) : fatal error C1083: Cannot open include file: 'windows.h': No such file or directory


Вот вывод при компиляции через командную строку VS 2010:


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  irtel.txt 38,26 Kb
PM MAIL   Вверх
actuator
Дата 7.1.2012, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



У тебя обе студии на одном компьютере? Возможно, проблемы из-за этого.

В 2005 как положено, при помощи nmake компилировал? У тебя, как минимум, не прописан путь к Windows SDK в INCLUDE, а может ещё и в LIB. Переменные должны выглядеть как-то так (у меня, к сожалению, только 2008 версия):
Код
INCLUDE=C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE;C:\Program Files\Microsoft SDKs\Windows\v6.0A\include;
LIB=C:\Program Files\Microsoft Visual Studio 9.0\VC\LIB;C:\Program Files\Microsoft SDKs\Windows\v6.0A\lib;


В 2010 - из-за чего не получается?
Библиотеки без своих солюшнов добавляются так. Щелкаешь правой кнопкой по своему проекту в обозревателе решений, выбираешь в меню пункт свойства, далее тебе нужны:

Свойства конфигурации -> C/C++ -> Общие, Дополнительные каталоги включения (добавляешь туда путь папки include библиотеки detours)
Свойства конфигурации -> Компоновщик -> Общие, Дополнительные каталоги библиотек (добавляешь туда путь папки lib.X86)

Ну и конечно не стоит размещать проекты в папках с русскими символами в пути, от этого бывают странные проблемы.
PM MAIL   Вверх
freezeman
Дата 10.1.2012, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(actuator @ 7.1.2012,  23:48)
У тебя обе студии на одном компьютере? Возможно, проблемы из-за этого.

В 2005 как положено, при помощи nmake компилировал? У тебя, как минимум, не прописан путь к Windows SDK в INCLUDE, а может ещё и в LIB. Переменные должны выглядеть как-то так (у меня, к сожалению, только 2008 версия):
Код
INCLUDE=C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE;C:\Program Files\Microsoft SDKs\Windows\v6.0A\include;
LIB=C:\Program Files\Microsoft Visual Studio 9.0\VC\LIB;C:\Program Files\Microsoft SDKs\Windows\v6.0A\lib;


В 2010 - из-за чего не получается?
Библиотеки без своих солюшнов добавляются так. Щелкаешь правой кнопкой по своему проекту в обозревателе решений, выбираешь в меню пункт свойства, далее тебе нужны:

Свойства конфигурации -> C/C++ -> Общие, Дополнительные каталоги включения (добавляешь туда путь папки include библиотеки detours)
Свойства конфигурации -> Компоновщик -> Общие, Дополнительные каталоги библиотек (добавляешь туда путь папки lib.X86)

Ну и конечно не стоит размещать проекты в папках с русскими символами в пути, от этого бывают странные проблемы.

Попробовал в VS 2010 подключить, как вы сказали, добавил #include <detours.h>, но при компиляции выдает супер-много ошибок ~120... Почему так происходит... в чем может быть проблема?

Попробовал тоже сделать в Visual C++ 2005 Express... тоже самое.

Это сообщение отредактировал(а) freezeman - 10.1.2012, 10:28
PM MAIL   Вверх
GremlinProg
Дата 10.1.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(freezeman @  8.1.2012,  00:51 Найти цитируемый пост)
cd "C:\Documents and Settings\SMan\??????? ????\Detours Express 3.0\src"

Цитата(actuator @  8.1.2012,  01:48 Найти цитируемый пост)
Ну и конечно не стоит размещать проекты в папках с русскими символами в пути, от этого бывают странные проблемы.

 smile 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
freezeman
Дата 10.1.2012, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(GremlinProg @ 10.1.2012,  10:29)
Цитата(freezeman @  8.1.2012,  00:51 Найти цитируемый пост)
cd "C:\Documents and Settings\SMan\??????? ????\Detours Express 3.0\src"

Цитата(actuator @  8.1.2012,  01:48 Найти цитируемый пост)
Ну и конечно не стоит размещать проекты в папках с русскими символами в пути, от этого бывают странные проблемы.

 smile

Спасибо за ответ.. Но только что получилось, дополнительно нужно было подключить windows.h и все компилируется... правда предстоит ещё много работы по реализации глобального статического перехвата...есть опыт в этом?
PM MAIL   Вверх
freezeman
Дата 10.1.2012, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Как реализуется Глобальный перехват в MS Detours... если можно привести примеры или ссылки скинуть,
помогите кто-нибудь...
PM MAIL   Вверх
actuator
Дата 10.1.2012, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



Найди в документации раздел Using Detours - там пример DLL-ки, которая делает перехват функции для процесса, к которому подключается, доработай его и добавь путь к ней в "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs" - тогда она будет подключаться ко всем процессам, где используется библиотека user32 (то есть, практически всем). В примере адрес перехватываемой функции получается статически, но его ещё можно найти в таблицах импорта/экспорта соответствующими функциями.
PM MAIL   Вверх
freezeman
Дата 11.1.2012, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



При компиляции выдает ошибки, что с ними делать понятия не имею!!

------ Перестроение всех файлов начато: проект: msdetours, Конфигурация: Debug Win32 ------
...
dllmain.obj : error LNK2019: ссылка на неразрешенный внешний символ _DetourDetach@8 в функции _DllMain@12
dllmain.obj : error LNK2019: ссылка на неразрешенный внешний символ _DetourTransactionCommit@0 в функции _DllMain@12
dllmain.obj : error LNK2019: ссылка на неразрешенный внешний символ _DetourAttach@8 в функции _DllMain@12
dllmain.obj : error LNK2019: ссылка на неразрешенный внешний символ _DetourUpdateThread@4 в функции _DllMain@12
dllmain.obj : error LNK2019: ссылка на неразрешенный внешний символ _DetourTransactionBegin@0 в функции _DllMain@12
c:\documents and settings\sman\мои документы\visual studio 2010\Projects\msdetours\Debug\msdetours.dll : fatal error LNK1120: 5 неразрешенных внешних элементов

СБОЙ построения.

Затраченное время: 00:00:05.77
========== Перестроение всех: успешно: 0, с ошибками: 1, пропущено: 0 ==========

код:
Код

#include <windows.h>
#include <detours.h>

static LONG dwSlept = 0;

// Target pointer for the uninstrumented Sleep API.
static VOID (WINAPI * TrueSleep)(DWORD dwMilliseconds) = Sleep;

// Detour function that replaces the Sleep API.
VOID WINAPI TimedSleep(DWORD dwMilliseconds)
{
    // Save the before and after times around calling the Sleep API.
    DWORD dwBeg = GetTickCount();
    TrueSleep(dwMilliseconds);
    DWORD dwEnd = GetTickCount();

    InterlockedExchangeAdd(&dwSlept, dwEnd - dwBeg);
}

// DllMain function attaches and detaches the TimedSleep detour to the
// Sleep target function.  The Sleep target function is referred to
// through the TrueSleep target pointer.
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    if (dwReason == DLL_PROCESS_ATTACH) {
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)TrueSleep, TimedSleep);
        DetourTransactionCommit();
    }
    else if (dwReason == DLL_PROCESS_DETACH) {
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)TrueSleep, TimedSleep);
        DetourTransactionCommit();
    }
    return TRUE;
}

PM MAIL   Вверх
GremlinProg
Дата 11.1.2012, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106





--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
freezeman
Дата 11.1.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(GremlinProg @ 11.1.2012,  09:22)
https://www.google.com/search?q=unresolved+external+symbol

Спасибо, добавил 
Код

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

всё заработало...
PM MAIL   Вверх
freezeman
Дата 11.1.2012, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Прописал в реестре "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs" путь к своей dll,
запустил программу, но ничего не перехватывает...Поискал функцию внедрения, но тоже не работает...

Dll:
Код

#include <windows.h>
#pragma comment (lib, "detours.lib")
#include <detours.h>

static LONG dwSlept = 0;

// Target pointer for the uninstrumented Sleep API.
static VOID (WINAPI * TrueSleep)(DWORD dwMilliseconds) = Sleep;

// Detour function that replaces the Sleep API.
VOID WINAPI MyMessBox(HWND hwnd, char *text, char *hdr, UINT utype)
{
    // Save the before and after times around calling the Sleep API.
    DWORD dwBeg = GetTickCount();
    //TrueSleep(dwMilliseconds);
    DWORD dwEnd = GetTickCount();
    MessageBox(NULL, L"Hello from Hooked function", L"Hello", MB_OK);
    InterlockedExchangeAdd(&dwSlept, dwEnd - dwBeg);
}

// C:\Documents and Settings\SMan\Мои документы\Visual Studio 2010\Projects\msdetours\Debug\msdetours.dll
// DllMain function attaches and detaches the TimedSleep detour to the
// Sleep target function.  The Sleep target function is referred to
// through the TrueSleep target pointer.
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    if (dwReason == DLL_PROCESS_ATTACH) {
        MessageBox(NULL, L"Hello from DLL_PROCESS_ATTACH", L"Hello", MB_OK);
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)MessageBoxA, MyReadFile);
        DetourTransactionCommit();
    }
    else if (dwReason == DLL_PROCESS_DETACH) {
        MessageBox(NULL, L"Hello from DLL_PROCESS_DETACH", L"Hello", MB_OK);
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)MessageBoxA, MyReadFile);
        DetourTransactionCommit();
    }
    return TRUE;
}

extern "C"
{
    void HookInit();
}

void HookInit()
{
}


Main:
Код

// test_detours.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    //------не уверен, что это надо----
    HMODULE s_hDLL = NULL;
    s_hDLL = LoadLibrary(TEXT("USER32.dll"));
    //-----------------------

    MessageBox(NULL, L"Hello from Inject program 1!", L"Hello", MB_OK);
    int ret=0;
    static HINSTANCE hinstDLL; 
    HOOKPROC hkprcSysMsg;
    static HHOOK hhookSysMsg;
    hinstDLL = LoadLibrary(L"C:\\Documents and Settings\\SMan\\Мои документы\\Visual Studio 2010\\Projects\\msdetours\\Debug\\msdetours.dll");
    hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "HookInit"); 
    hhookSysMsg = SetWindowsHookEx(WH_GETMESSAGE,hkprcSysMsg,hinstDLL,0); 
    
    MessageBox(NULL, L"Hello from Inject program 2!", L"Hello", MB_OK);

    getchar();
    return ret;
}


Это сообщение отредактировал(а) freezeman - 11.1.2012, 10:51
PM MAIL   Вверх
GremlinProg
Дата 11.1.2012, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(freezeman @  11.1.2012,  12:50 Найти цитируемый пост)
Прописал в реестре "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs" путь к своей dll,запустил программу, но ничего не перехватывает

не перехватывает после перезагрузки?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
freezeman
Дата 11.1.2012, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(actuator @ 10.1.2012,  16:33)
Найди в документации раздел Using Detours - там пример DLL-ки, которая делает перехват функции для процесса, к которому подключается, доработай его и добавь путь к ней в "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs" - тогда она будет подключаться ко всем процессам, где используется библиотека user32 (то есть, практически всем). В примере адрес перехватываемой функции получается статически, но его ещё можно найти в таблицах импорта/экспорта соответствующими функциями.

Я прописал в реестр путь к dll, но ничего не происходит... Сделал перехват MessageBox, запустил MessageBox'ы в разных приложениях системы, но ничего не происходит... в чем может быть проблема?

Код

#include <windows.h>
#pragma comment (lib, "detours.lib")
#include <detours.h>
static LONG dwSlept = 0;
// Target pointer for the uninstrumented Sleep API.
static VOID (WINAPI * TrueSleep)(DWORD dwMilliseconds) = Sleep;
// Detour function that replaces the Sleep API.
VOID WINAPI MyMessBox(HWND hwnd, char *text, char *hdr, UINT utype)
{
    // Save the before and after times around calling the Sleep API.
    DWORD dwBeg = GetTickCount();
    //TrueSleep(dwMilliseconds);
    DWORD dwEnd = GetTickCount();
    MessageBox(NULL, L"Hello from Hooked function", L"Hello", MB_OK);
    InterlockedExchangeAdd(&dwSlept, dwEnd - dwBeg);
}
// C:\Documents and Settings\SMan\Мои документы\Visual Studio 2010\Projects\msdetours\Debug\msdetours.dll
// DllMain function attaches and detaches the TimedSleep detour to the
// Sleep target function.  The Sleep target function is referred to
// through the TrueSleep target pointer.
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    if (dwReason == DLL_PROCESS_ATTACH) {
        MessageBox(NULL, L"Hello from DLL_PROCESS_ATTACH", L"Hello", MB_OK);
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)MessageBoxA, MyReadFile);
        DetourTransactionCommit();
    }
    else if (dwReason == DLL_PROCESS_DETACH) {
        MessageBox(NULL, L"Hello from DLL_PROCESS_DETACH", L"Hello", MB_OK);
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)MessageBoxA, MyReadFile);
        DetourTransactionCommit();
    }
    return TRUE;
}

PM MAIL   Вверх
freezeman
Дата 11.1.2012, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(GremlinProg @ 11.1.2012,  11:43)
Цитата(freezeman @  11.1.2012,  12:50 Найти цитируемый пост)
Прописал в реестре "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs" путь к своей dll,запустил программу, но ничего не перехватывает

не перехватывает после перезагрузки?

Да, перезагружал..
PM MAIL   Вверх
freezeman
Дата 11.1.2012, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Что делать, если после того, как я прописал путь к подгружаемой dll в регистре "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs" она (dll) не хочет подключаться ни к одному процессу...может я допустил какую-нибудь типичную ошибку, код приводил выше...

После добавления в регистр комп. перегружал, ОС Windows XP x86 SP3.
PM MAIL   Вверх
actuator
Дата 11.1.2012, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



Во-первых, извини, с appinit_dlls - это всё-таки вредный совет. Из-за особенностей работы стандартных библиотек в VC (есть подозрение, что из-за поддержки расширений .NET), DLL-ка с перехватчиком неправильно инициализируется, что вообще может грохнуть систему. Так что придется этот вариант отложить. А не подключается у тебя перехватчик потому, что в пути к нему есть пробелы, а пробелы используются как разделитель списка библиотек. Нужно либо скопировать библиотеку в папку без них, либо использовать короткие имена файлов, которые можно получить winapi-функцией GetShortPathName.

Во-вторых, прежде чем писать код, пойми, как работает перехватчик: он, внедряясь в процесс, переписывает несколько инструкций в начале перехватываемой функции переходом (jmp) к предоставленной тобой функции. Если ты, как сделал выше, попробуешь из MyMessBox вызвать MessageBox, то программа просто уйдет в бесконечный цикл. Именно поэтому функция DetourAttach принимает указатель на указатель - перед перехватом она выделяет блок памяти, в который копирует заменяемые инструкции, и дописывает в него переход на остаток функции в обход уже записанного туда перехода на твою функцию и заменяет переданный указатель, чтобы он указывал на этот блок памяти. Когда тебе потребуется оригинал функции, ты используешь его.

В итоге код библиотеки выглядит как-то так:
Код
#include <windows.h>
#include <detours.h>

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

static int (WINAPI * RealMessageBoxA)(HWND,LPCSTR,LPCSTR,UINT) = MessageBoxA;

VOID WINAPI MyMessBox(HWND hwnd, char *text, char *hdr, UINT utype)
{
    RealMessageBoxA(NULL, "Hello from Hooked function", "Hello", MB_OK);
    RealMessageBoxA(hwnd, text, hdr, utype);
}
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    return TRUE;
    if (dwReason == DLL_PROCESS_ATTACH) {
        // До перехвата можно использовать оригинальный адрес функции
        MessageBoxA(NULL, "Hello from DLL_PROCESS_ATTACH", "Hello", MB_OK);

        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)RealMessageBoxA, MyMessBox);
        DetourTransactionCommit();
    }
    else if (dwReason == DLL_PROCESS_DETACH) {
        // После перехвата - только тот, что нам дала функция DetourAttach
        // (иначе вызовем перехватчик, а не оригинал функции)
        RealMessageBoxA(NULL, "Hello from DLL_PROCESS_DETACH", "Hello", MB_OK);
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)RealMessageBoxA, MyMessBox);
        DetourTransactionCommit();
    }
    return TRUE;
}


Теперь о том, как без appinit_dlls цеплять её к процессам. В статье на RSDN в разделе "Внедрение 1" есть подходящий для этого код, надо только обернуть struct INJECTORCODE в блок #pragma pack(push,1) / #pragma pack(pop), чтобы убрать выравнивание. Разве что искать id нужных процессов придется, самостоятельно. А вот сам их способ перехвата лучше не использовать - в detours он надежнее.
PM MAIL   Вверх
freezeman
Дата 11.1.2012, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



actuator большое спасибо за помощь, буду пробовать...
благодарю также всех за помощь...
PM MAIL   Вверх
freezeman
Дата 11.1.2012, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Цитата(actuator @ 11.1.2012,  20:05)
Во-первых, извини, с appinit_dlls - это всё-таки вредный совет. Из-за особенностей работы стандартных библиотек в VC (есть подозрение, что из-за поддержки расширений .NET), DLL-ка с перехватчиком неправильно инициализируется, что вообще может грохнуть систему. Так что придется этот вариант отложить. А не подключается у тебя перехватчик потому, что в пути к нему есть пробелы, а пробелы используются как разделитель списка библиотек. Нужно либо скопировать библиотеку в папку без них, либо использовать короткие имена файлов, которые можно получить winapi-функцией GetShortPathName.

Во-вторых, прежде чем писать код, пойми, как работает перехватчик: он, внедряясь в процесс, переписывает несколько инструкций в начале перехватываемой функции переходом (jmp) к предоставленной тобой функции. Если ты, как сделал выше, попробуешь из MyMessBox вызвать MessageBox, то программа просто уйдет в бесконечный цикл. Именно поэтому функция DetourAttach принимает указатель на указатель - перед перехватом она выделяет блок памяти, в который копирует заменяемые инструкции, и дописывает в него переход на остаток функции в обход уже записанного туда перехода на твою функцию и заменяет переданный указатель, чтобы он указывал на этот блок памяти. Когда тебе потребуется оригинал функции, ты используешь его.

В итоге код библиотеки выглядит как-то так:
...

Пробовал внедрить, как описано на rsdn, но при инъекции выдает звуковой сигнал и всё... Прописал в реестре без пробелов и действительно заработало, но выдает сообщения из DLL_PROCESS_ATTACH и DLL_PROCESS_DETACH, но не перенаправляет на MyMessBox, а при выходе из почти любого приложения появляется сообщение "Инструкция по адресу "0x7c9100e8" обратилась к памяти по адресу "0x00000010". Память не может быть "read" ". В чем может быть проблема?


Переделал Вашу dll-ку для перехвата функции ReadFile... Перехватывает, заходит в функцию, но при выходе из приложения выдает туже ошибку
"Инструкция по адресу "0x7c9100e8" обратилась к памяти по адресу "0x00000010". Память не может быть "read" "


Это сообщение отредактировал(а) freezeman - 11.1.2012, 22:52
PM MAIL   Вверх
freezeman
Дата 12.1.2012, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Что если реализовать какой-нибудь обработчик ошибок и перехватить её? Например, try ... catch...

PM MAIL   Вверх
actuator
Дата 12.1.2012, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



Не исключениями, а JIT-отладчиком. Если у тебя только express-версии среды, скачай какой-нибудь OllyDbg, назначь его отладчиком по умолчанию и прогони на отладочной сборке перехватчика - покажет, какая функция роняет программу. Ничего подробнее сказать не могу, пока не покажешь код.
PM MAIL   Вверх
freezeman
Дата 13.1.2012, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Если сделал все правильно... Запустил через OllyDbg notepad.exe и когда закрываю программу отладчик указывает на 
7C9100E8   . 0B43 10        OR EAX,DWORD PTR DS:[EBX+10]

эти данные нужно было отследить?


Это сообщение отредактировал(а) freezeman - 13.1.2012, 13:40
PM MAIL   Вверх
actuator
Дата 13.1.2012, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



Нет, нужно по содержимому стека (там, где ты смотрел - правое нижнее окно) посмотреть цепочку вызовов, скорее всего там будет вызов твоей библиотеки (заодно укажи в меню Debug -> Select path for symbols папку, где у тебя лежит .pdb-шка от библиотеки, обычно там же где она сама - так будут доступны более подробные символы).
Хотя я уверен, что ошибка где-то у тебя в коде - может, указатель провисший. Проверь также настройки компиляции - "C/C++ -> Создание кода, Библиотека времени выполнения - многопоточная".

Это сообщение отредактировал(а) actuator - 13.1.2012, 15:08
PM MAIL   Вверх
freezeman
Дата 13.1.2012, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Вот скрин отладчика... img 


По поводу локального перехвата, я переписал вариант с rsdn и написал тестовое приложение, которое использует api readfile, после внедрения он эту функцию прекрасно перехватил, но когда внедряю в другие процессы, то он заходит, но не перехватывает.

вот код инъектора
Код

#include "stdafx.h"
// #include <afxwin.h>
#include "stddef.h"
#include <windows.h>
#pragma pack(push,1) 
BOOL InjectDll(DWORD, char*);

int main(int argc, char* argv[])
{
  if(argc<3) 
  {
    printf("Parameters: PID , Dllname"); 
    //getch();
    return 0;
  }
  InjectDll(atol(argv[1]), argv[2]);
  return 0;
}

//структура описывает поля, в которых содержится код внедрения
struct INJECTORCODE
{
  BYTE  instr_push_loadlibrary_arg; //инструкция push
  DWORD loadlibrary_arg;            //аргумент push  

  WORD  instr_call_loadlibrary;     //инструкция call []  
  DWORD adr_from_call_loadlibrary;

  BYTE  instr_push_exitthread_arg;
  DWORD exitthread_arg;

  WORD  instr_call_exitthread;
  DWORD adr_from_call_exitthread;

  DWORD addr_loadlibrary;
  DWORD addr_exitthread;     //адрес функции ExitTHread
  BYTE  libraryname[100];    //имя и путь к загружаемой библиотеке  
};


BOOL InjectDll(DWORD pid, char *lpszDllName)
{
      
  HANDLE hProcess;
  BYTE *p_code;
  INJECTORCODE cmds;
  DWORD wr, id;

  //открыть процесс с нужным доступом
  hProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|PROCESS_VM_OPERATION, FALSE, pid);
  if(hProcess == NULL)
  {
    MessageBoxA(NULL, "You have not enough rights to attach dlls", "Error!", 0);
    return FALSE;
  }

  //зарезервировать память в процессе
    p_code = (BYTE*)VirtualAllocEx(hProcess, 0, sizeof(INJECTORCODE),
                                   MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if(p_code==NULL)
    {
      MessageBox(NULL, TEXT("Unable to alloc memory in remote process"),
                       TEXT("Error!"), 0);
      return FALSE;
    }

  //инициализировать  машинный код
  cmds.instr_push_loadlibrary_arg = 0x68; //машинный код инструкции push
  cmds.loadlibrary_arg = (DWORD)((BYTE*)p_code + offsetof(INJECTORCODE, libraryname));

  cmds.instr_call_loadlibrary = 0x15ff; //машинный код инструкции call
  cmds.adr_from_call_loadlibrary = (DWORD)(p_code + offsetof(INJECTORCODE, addr_loadlibrary));

  cmds.instr_push_exitthread_arg  = 0x68;
  cmds.exitthread_arg = 0;

  cmds.instr_call_exitthread = 0x15ff; 
  cmds.adr_from_call_exitthread = (DWORD)(p_code + offsetof(INJECTORCODE, addr_exitthread));

  cmds.addr_loadlibrary = (DWORD)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");

  cmds.addr_exitthread  = (DWORD)GetProcAddress(GetModuleHandle(L"kernel32.dll"),"ExitThread");

  if(strlen(lpszDllName)>99)
  {
     MessageBox(NULL, TEXT("Dll Name too long"), TEXT("Error!"), 0);
     return FALSE;
  }
  strcpy((char*)cmds.libraryname, lpszDllName );
  /*После инициализации cmds в мнемонике ассемблера выглядит следующим
    образом:
      push  adr_library_name               ;аргумент ф-ции loadlibrary
      call dword ptr [loadlibrary_adr]     ; вызвать LoadLibrary 
      push exit_thread_arg                 ;аргумент для ExitThread
      call dword ptr [exit_thread_adr]     ;вызвать ExitThread     
  */
  //записать машинный код по зарезервированному адресу
  WriteProcessMemory(hProcess, p_code, &cmds, sizeof(cmds), &wr);
  //выполнить машинный код
  HANDLE z = CreateRemoteThread(hProcess, NULL, 0, (unsigned long (__stdcall *)(void *))p_code, 0, 0, &id);
  //ожидать завершения удаленного потока
  WaitForSingleObject(z, INFINITE);
  //освободить память

  VirtualFreeEx(hProcess, (void*)p_code, sizeof(cmds), MEM_RELEASE);
  #pragma pack(pop)
  return TRUE;
}



Это сообщение отредактировал(а) freezeman - 13.1.2012, 17:05
PM MAIL   Вверх
actuator
Дата 14.1.2012, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



Вот, сделал программку, пишущую c:\readfile-log\readfile-log.txt файлик с аргументами всех вызовов твоего ReadFile для заданного процесса: http://ifolder.ru/28114248. Папку создай, у тебя должны быть в ней права на запись. Запускаешь так:

injector.exe <pid процесса> <полный путь к library.dll>

У меня никаких падений не наблюдается. Если у тебя не заработает - то помочь не смогу. В коде просто нечему падать.
PM MAIL   Вверх
freezeman
Дата 15.1.2012, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Хоть и вылетает ошибка, но у ладно с ней, решу позже...Решил проверить на Windows 7 x86, но ничего не происходит, не перехватывается...прописал в путь к моей dll в реестре...что это моджет быть? Мне казалось, что MS Detours подходит для всех систем семейства Windows NT...
PM MAIL   Вверх
actuator
Дата 16.1.2012, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



Все-таки используешь appinit_dlls? Вот потому и не работает, я уже писал выше. Майкрософтовская библиотека при этом глючит. Делай процесс и подключай библиотеку через него него. Если нужен перехват системных процессов - делай программу службой и назначай запуск от имени администратора.
Ну а чтобы включить appinit_dlls на windows 7, нужно изменить ещё пару ключей реестра.
PM MAIL   Вверх
freezeman
Дата 18.1.2012, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Большое спасибо за помощь!!
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1255 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.