Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Прикрепить свой Dll к поцессу


Автор: ZC1989 27.5.2007, 07:09
как загрузить свой Dll в процесс на совсем из вне? что бы после перезагрузки процесса Dll загружался автоматически... так же как этот Dll потом отсоединить от процесса и как проверить, подгружается ли этот Dll?

Добавлено через 51 секунду
кстать, как на время работы процесса к нему прикрепить Dll я знаю...

Автор: Tectoder 27.5.2007, 08:32
Поищи формат PE

Автор: ZC1989 27.5.2007, 09:15
Tectoder, РЕ  - это добавление своего кода в в ехе... а можно как-то по другому...просто процесс к которому надо подключиться это explorer.exe 

Автор: W4FhLF 27.5.2007, 09:21
Добавь в таблицу импорта explorer.exe свою DLL. Будет грузиться постоянно.

Автор: ZC1989 27.5.2007, 09:32
W4FhLF, собсно вот ток что нашёл про таблицу РЕ...чувствую острых ощущений на весь день мне хватит...гыгы...а вот вопрос такой (пока начал читать ток теорию) добавить в таблицу надо по адресу определённому...значит надо открыть exe, потом найти это место памяти, прописать туда имя библиотеки (или полный путь)...так а explorer - то запущен...или так и надо?

Автор: W4FhLF 27.5.2007, 09:52
Цитата(ZC1989 @  27.5.2007,  09:32 Найти цитируемый пост)
W4FhLF, собсно вот ток что нашёл про таблицу РЕ...чувствую острых ощущений на весь день мне хватит...гыгы...а вот вопрос такой (пока начал читать ток теорию) добавить в таблицу надо по адресу определённому...значит надо открыть exe, потом найти это место памяти, прописать туда имя библиотеки (или полный путь)...так а explorer - то запущен...или так и надо?


Если ты хочешь, чтобы при запуске системы только в explorer.exe оказывалась твоя dll, то тебе надо изменить таблицу импорта у файла на винте. Как ты это будешь делать - я не знаю, но способ рабочий)

Автор: ZC1989 27.5.2007, 09:59
W4FhLF, ну да, главное сделать возможным запуск с моей библиотечкой...  smile 

Автор: Tectoder 27.5.2007, 11:06
ZC1989, вообще, есть AppInitDll, правда она подгружается во все процессы... Но это проще чем "инфицирование" проводника

Автор: ZC1989 27.5.2007, 12:06
Tectoder, возьму на заметку..только мне хотелось что бы было это для одного, конкретного процесса...

Добавлено через 1 минуту и 47 секунд
да, и что это за функция такая, (на всякий случай спрошу..хехе...) где она лежит? и что именна делает

Автор: Tectoder 27.5.2007, 13:11
http://browsersentinel.com/help/startup-modules.htm
Конкретно для эсклорера можно еще написать BHO(browser helper object). Тогда твоя dll будет внедрена ТОЛЬКО в проводник и программы, использующие ie

Автор: ZC1989 27.5.2007, 22:00
Вот почитал инфу и получается что бы explorer.exe загружал при старте мою библиотеку то надо прописать ключь по адресу 
HKEY_LOCAL_MACHINE \Software \Microsoft \Windows \CurrentVersion \ShellServiceObjectDelayLoad

Там есть уже некоторые ключи…и в них описаные подобные данные…
{7849596a-48ea-486e-8937-a2a3009f31a9}

Это я так понимаю номер уже залинкованной в винду ДЛЛки…..а как понормальному сделать что бы нужная мне ДЛЛка прилинковалась?

Автор: Tectoder 27.5.2007, 23:23
ZC1989, это guid com-класса
Тебе, соответственно нужно сделать свою библиотеку COM-библиотекой и прописать там guid одного из своих классов. Реализовавывать там что либо не обязательно. Достаточно самому написать процедуру DllCanUnloadNow что бы она всегда возвращала 0

Автор: ZC1989 27.5.2007, 23:33
Tectoder, ех блин....лес дремучий.....ладно. подумаю...а нет примера не у кого как можно в ЕХЕ добавить свою библиотеку, понимаю так проще получится....чем с реестром работать (не пробовал ни разу)

Автор: ZC1989 28.5.2007, 15:26
Вот нашёл следующий код из статьи Yinrong Huang-а…

Там типа добавляется некий код в файл…я откомпиллил прогу…но как с ней работать не пойму… патылся открыть с её помощью другой ехе – ничего…спотыкается на первой ошибке…

if ( argc != 7 )…

я думаю что можно приписать самому эти данные….но как? Я с параметрами int main(int argc, char* argv[]) туго соображаю…
Код

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#define EMBEDME_REPLACE_OFST 0xFC
#define EMBEDME_JMP_OFST 0x105

char embedded[] =
        "\x60\x8b\xec\xeb\x29\x4c\x6f\x61\x64\x4c\x69\x62\x72\x61\x72\x79"
        "\x41\x00\x75\x73\x65\x72\x33\x32\x00\x4d\x65\x73\x73\x61\x67\x65"
        "\x42\x6f\x78\x41\x00\x48\x65\x6c\x6c\x6f\x21\x00\xeb\x05\xe8\xf9"
        "\xff\xff\xff\x5b\x8d\x7b\xd2\x57\xeb\x1f\xc1\xeb\x10\xc1\xe3\x10"
        "\x66\x81\x3b\x4d\x5a\x75\x0b\x8b\x4b\x3c\x66\x81\x3c\x0b\x50\x45"
        "\x74\x06\xc1\xeb\x10\x4b\x75\xe5\xc3\xe8\xdc\xff\xff\xff\x8b\x43"
        "\x3c\x40\x8b\x54\x03\x7f\x03\xd3\x8b\x42\x0c\x03\xc3\x8b\x08\x81"
        "\xc9\x20\x20\x20\x20\x81\xf9\x6b\x65\x72\x6e\x75\x11\x8b\x48\x04"
        "\x81\xc9\x20\x20\x20\x20\x81\xf9\x65\x6c\x33\x32\x74\x05\x83\xc2"
        "\x14\xeb\xd5\x8b\x42\x10\x8b\x1c\x03\xe8\x9c\xff\xff\xff\x33\xff"
        "\x8b\x4b\x3c\x8b\x74\x0b\x78\x03\xf3\x8b\x4e\x20\x03\xcb\x47\x8b"
        "\x11\x03\xd3\x81\x7a\x04\x72\x6f\x63\x41\x74\x05\x83\xc1\x04\x75"
        "\xed\x8b\x56\x24\x03\xd3\x0f\xb7\x3c\x7a\x2b\x7e\x10\x8b\x56\x1c"
        "\x8d\x14\xba\x8b\x14\x13\x03\xd3\x5f\x52\x53\x57\x87\xd3\x52\xff"
        "\xd3\x8d\x4f\x0d\x51\xff\xd0\x8d\x7f\x14\x57\x50\xff\xd3\x33\xc9"
        "\x51\x57\x8d\x57\x0c\x52\x51\xff\xd0\x8b\xe5\x61\x90\x90\x90\x90"
        "\x90\x90\x90\x90\xe9\xfb\xff\xff\xff";


void EmbedMe(unsigned char * pImage,
                    DWORD srcRva,
                    DWORD srcOfst,
                    DWORD targetRva,
                    DWORD targetOfst,
                    BOOL call)
{
    unsigned char * pTarget = pImage + targetOfst;
    unsigned char * pSrc = pImage + srcOfst;
    if ( call )
    {
        pSrc[0] = 0xE8; // call
        * (DWORD * ) (embedded+EMBEDME_JMP_OFST) = ( ( * (DWORD * ) (pSrc + 1) ) + srcRva + 5 - ( targetRva + EMBEDME_JMP_OFST + 4));
        * (DWORD * ) (pSrc + 1) = ( targetRva - (srcRva + 5) );
    }
    else
    {
        memcpy(embedded + EMBEDME_REPLACE_OFST, pSrc, 5 );
        pSrc[0] = 0xE9; // jmp
        * (DWORD * ) (pSrc + 1) = ( targetRva - (srcRva + 5) );
        * (DWORD * ) (embedded+EMBEDME_JMP_OFST) = ( srcRva + 5 - (targetRva + EMBEDME_JMP_OFST + 4 ) );
    }
    memcpy(pTarget, embedded, sizeof(embedded) );
}


int main(int argc, char* argv[])
{
    HANDLE fHandle;
    unsigned char * pImage;
    BOOL call = TRUE;
    DWORD srcRva, srcOfst, targetRva, targetOfst, fileLow, fileHigh;
    if ( argc != 7 )
    {
        printf("Please notice the following numbers in hex as well as RVA\n"
                "To embed the embedded as a callable\n"
                " embedme -c SrcRva FileOfst TargetRva TargetOfst filename\n"
                "To embed the embedded as a jumpable\n"
                " embedme -j SrcRva FileOfst TargetRva TargetOfst filename\n");

        printf("\n\n");
        system("PAUSE");

        return 1;
    }

    if ( strcmp(argv[1], "-c") != 0 )
        call = FALSE;

    sscanf(argv[2], "%x", &srcRva);
    sscanf(argv[3], "%x", &srcOfst);
    sscanf(argv[4], "%x", &targetRva);
    sscanf(argv[5], "%x", &targetOfst);

    fHandle = CreateFile(argv[6],
                                GENERIC_READ | GENERIC_WRITE,
                                0,
                                NULL,
                                OPEN_EXISTING,
                                0,
                                NULL );
    if ( fHandle == INVALID_HANDLE_VALUE )
    {
        printf("Failed to open file %s for error %d\n", argv[6], GetLastError() );

        printf("\n\n");
        system("PAUSE");

        return 2;
    }

    fileLow = GetFileSize(fHandle, & fileHigh);
    if ( fileHigh || ( fileLow == 0 ) )
    {
        printf("File is either too big or empty\n", argv[6]);
        CloseHandle(fHandle);

        printf("\n\n");
        system("PAUSE");

        return 3;
    }

    pImage = (unsigned char *) malloc(fileLow);
    if ( pImage == NULL )
    {
        printf("Run out of memory so early?\n");
        CloseHandle(fHandle);

        printf("\n\n");
        system("PAUSE");

        return 4;
    }

    if ( ReadFile(fHandle, pImage, fileLow, &fileHigh, NULL ) &&
        ( fileLow == fileHigh) )
    {
        SetFilePointer(fHandle, 0, NULL, FILE_BEGIN); // reset it for writing
        EmbedMe(pImage, srcRva, srcOfst, targetRva, targetOfst, call);
        if ( ! WriteFile(fHandle, pImage, fileLow, &fileHigh, NULL ) ||
        ( fileLow != fileHigh ) )
        {
            printf("Failed to write to file %s for error %d\n",
            argv[6], GetLastError() );
        }
    }
    else
    {
        printf("Failed to read from file %s for error %d\n",
        argv[6], GetLastError() );
    }
    CloseHandle(fHandle);

    printf("\n\n");
    system("PAUSE");

    return 0;
}

На что можно заменить int argc, char* argv[]?

Автор: ZC1989 29.5.2007, 22:31
ребят, подскажите плиzzzzzz smile 

Автор: dumb 30.5.2007, 11:59
ZC1989, ищи по фразе "inject dll" и используй готовый код.

Автор: ZC1989 30.5.2007, 16:40
dumb, у мя есть готовый пример где через инжект добавляется длл....да вот только это на время работы процесса, а мне надо на всегда

Автор: dumb 30.5.2007, 17:52
Цитата(ZC1989 @  30.5.2007,  16:40 Найти цитируемый пост)
а мне надо на всегда 

выше вроде речь уже была про внедрение в explorer.exe? - вот и действуй.

Автор: ZC1989 30.5.2007, 21:40
dumb, я ваабще-то и привёл код нарытый в какой-то статье...одна проблема, я не знаю английского....и нормальные статьи по РЕ не для мя....а тот код порит ехе"шник....или это вообще не для того код? скажите пожалуйста

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)