8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

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