Раздел: Документация
0 ... 75 76 77 78 79 80 81 ... 169 писан он ужасным стилем. Все то же самое можно найти у Рихтера и гораздо лучше написанное. Все, что делает ехе - это загрузка библиотеки в Explorer.exe и запуск библиотечной функции zzzlnit. Исходник zzz.dll помещать полностью не буду, только основные куски. Главное — это функция my switch, что переключает контексты. Основные структуры: typedef struct THREAD BASIC INFORMATION 1 BOOL ExitStatus; PVOID Teb; CLIENT ID ClientID; DWORD AffinityMask; DWORD BasePriority; DWORD Priority; } THREAD BASIC INFORMATION, *PTHREAD BASIC INFORMA-TION. Надеюсь, что мое предположение верно и данная структура описывает волокно (fiber). Если кто-то знает больше, сообщите свои мысли, пожалуйста, особенно про ЕОС. typedef struct DWORD arg; DWORD Exceptions; DWORD DWORD StackLimit; DWORD ЕОС; CONTEXT context; } MYFIBER, *PMYFIBER. Основная функция переключения контекста потока: — 1 аргумент — handle на поток, куда внедряется наш код 236 - 2 аргумент — указатель на предварительно созданный fiber -- 3 аргумент — указатель на исполняемый код: void my switch( HANDLE hThread, //thread to be interrupted PVOID fib, //fib to switch to DWORD function) //function to process { CONTEXT cont; BOOL bo; THREAD BASIC INFORMATION threadbuff; ULONG 1; MYFIBER temp fiber; memset(&cont,0x00,sizeof(CONTEXT)); memset (sthreadbuff, 0x00, sizeof (THREAD BAS I CONFORMATION) ) ; // Read context and stack of target stack cont.ContextFlags=CONTEXT CONTROL; bo=GetThreadContext(hThread,Scont); bo=NtQueryInformationThread(hThread, 0, sthreadbuff, siz eof (THREAD BASI C INFORMATION), &1) Save arg, Teb and context //arg memmove((BYTE *)&temp fiber.arg,(BYTE *)fib,4); //Teb memmove((BYTE*)&temp fiber.Exceptions , (BYTE *)threadbuff.Teb,4); (BYTE buff.Teb+4,4); memmove((BYTE*)&temp fiber.StackLimit, (BYTE *)threadbuff.Teb+8,4); memmove((BYTE*)&temp fiber.Е0С,(BYTE *)threadbuff.Teb+0xe0c,4); //Context memmove( (BYTE*)&temp fiber.con text, (BYTE *)&cont,sizeof(CONTEXT)); //Помещаем в блок окружения (Teb) и контекст потока значения из созданного 237 //v. проиницилизированного волокна (fiber) Change all memmove( (BYTE *) threadbuf f . Teb, (BYTE *) fib+4, 4) ; memmove( (BYTE *) threadbuf f.Teb+4, (BYTE *) fib+8, 4) ; memmove( (BYTE *) threadbuff.Teb+8, (BYTE *)fib+12,4); memmove ( (BYTE* ) threadbuff . Teb+OxeOc, (BYTE *)fib+16,4); memmove( (BYTE *) threadbuff.Teb+20, (BYTE *)&fib,4); //pointer to saved fib memmove ( (BYTE*)&cont .Edi, (BYTE *)fib+OxbO,4) ; (BYTE (BYTE (BYTE (BYTE (BYTE cont.Eip= (DWORD)function ; bo=SetThreadContext (hThread,&cont) ; memmove ( (BYTE*) fib, (BYTE *)&temp fiber,sizeof(MYFIBER)) ; } Поток, внедряющий код в контекст заданного потока. Аргумент в основном — это идентификатор потока, куда внедряется код: DWORD WINAPI thread2 (LPVOII arg2) { ULONG i, 1; PVOID fibl; BOOL DWORD HANDLE OBJECT ATTRIBUTESObj ectAttributes ; -J CLIENT ID MYPAR * par3; MY ARG * pmyarg; //Подготовка параметров (несущественно) 238 0 ... 75 76 77 78 79 80 81 ... 169
|