Доброго времени суток!!
Тема избитая ... но вопросы остаются...
Есть исходник .... привожу полностью....
#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]. — Кодт