Внедрение ДЛЛ в чужой процесс
От: belichi2002  
Дата: 10.01.06 09:05
Оценка:
Доброго времени суток!!
Тема избитая ... но вопросы остаются...
Есть исходник .... привожу полностью....
#pragma check_stack(off)
#pragma code_seg("injection")
struct inject_data
{
        
    
    HINSTANCE (__stdcall *pfnLoadLibraryA)(LPCTSTR);
    char dllPath [0x100];
    
};

static HINSTANCE __stdcall inject_code( inject_data *p )
{
p->pfnLoadLibraryA(p->dllPath);     
return 0;     
}


static void inject_code_end()
{}
#pragma check_stack()
#pragma code_seg()

//==========================================================================================


void inject2( char *psz_process, inject_data *pdata, size_t cb_data, void *ptr_code, size_t cb_code )
{
    cb_code |= (cb_code+3)&~3;
    
    PROCESS_INFORMATION    pi;
    ZeroMemory(  &pi,sizeof( pi ) );
    
    STARTUPINFO si;
    ZeroMemory( &si, sizeof( si ) );

    si.cb = sizeof( si );
    ::GetStartupInfo( &si );
    ::CreateProcess( 0, psz_process, 0, 0, false,
        CREATE_SUSPENDED, 0, 0, &si, &pi );

    void    *ptr = VirtualAllocEx( pi.hProcess, 0, cb_data+cb_code, 
        MEM_COMMIT | MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE );
    void    *ptr_data = (char*)ptr+cb_code;
    WriteProcessMemory( pi.hProcess, ptr, inject_code, cb_code, 0 );
    WriteProcessMemory( pi.hProcess, ptr_data, pdata, cb_data, 0 );



    CONTEXT    context;
    ZeroMemory( &context, sizeof( context ) );
    context.ContextFlags = CONTEXT_FULL; 
    ::GetThreadContext( pi.hThread, &context );

    unsigned    ret_addr;
    ::ReadProcessMemory( pi.hProcess, (void*)context.Esp, &ret_addr, sizeof( unsigned ), 0 );
    ::WriteProcessMemory( pi.hProcess, (void*)context.Esp, &ptr_data, sizeof( unsigned ), 0 );
    context.Esp-=4;
    ::WriteProcessMemory( pi.hProcess, (void*)context.Esp, &ret_addr, sizeof( unsigned ), 0 );

    context.Eip = (unsigned)ptr;

    ::SetThreadContext( pi.hThread, &context );
    ::ResumeThread( pi.hThread );

    ::CloseHandle( pi.hThread );
    ::CloseHandle( pi.hProcess );

}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    inject_data    data;
    char temp [100] = {'\0'};
    GetSystemDirectory(temp,sizeof(temp));
    strcat(temp,"\\");
    strcat(temp,"MyDll.dll");
    

/***********************For LoadLibrary********************/

    
(FARPROC&)data.pfnLoadLibraryA = ::GetProcAddress( ::LoadLibrary( "Kernel32.dll" ), "LoadLibraryA" );
strcpy(data.dllPath,temp);    




    unsigned    cb_injection_data = sizeof( data );
    unsigned    cb_injection_code = ((unsigned)inject_code_end-(unsigned)inject_code);
    
        inject2( "explorer.exe", &data, cb_injection_data, inject_code, cb_injection_code );
    return 0;
}


Какая проблема.... Пытаюсь загрузить длл в чужой процесс и выгрузить родительский процесс посредством
использования в длл-ке сначала createthread, затем SetTimer.
С GreateRemoteThread все пашет на ура... Процесс спокойно загружает длл и выгружается (длл работает после
выгрузки). В этом варианте фигушки....как говорят. Длл-ка работает до выгрузки ...Затем кирдык.
Причем createthread не работает в любои варианте. Подскажите люди добрые в чем проблема????

Добавлено форматирование — тэг [c]. — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.