информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяВсе любят медSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Под NT и 9x разные способы 27.03.04 19:54  Число просмотров: 1655
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Идея очень хороша!
> А не подскажите, мож шде есть статейка какая с примером, а
> то я такого не делала ни разу?
Примера нету, но я в принципе довольно подробно описал (с названиями функций). Как именно вызывать эти функции - можно посмотреть в MSDN

> А будет ли работать метод NT под Win9x и наоборт?
Нет. Под 9x нету CreateRemoteThread (хотя подобного результата можно добиться при помощи dll injection - искать в гугле по этим ключевым словам), а под NT не работает трюк с FreeLibrary

Под 9х пример нашел
http://groups.google.com/groups?hl=ru&lr=&ie=UTF-8&oe=UTF-8&selm=927679011%40p13.f65.n5083.z2.ftn&rnum=9
<programming>
[Win32] Самомодификация? 26.03.04 00:46  
Автор: Lutien Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Уважаемые , подскажите как бы реализовать самомодификацию исполняемого файла?
Т.е. есть exe'ник, необходимо заставить его стукнуться в инет, чтоб он там качнул файл, и НЕ ЗАПУСКАЯ его, изменить себя?
[Win32] Уточни 26.03.04 01:47  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Уважаемые , подскажите как бы реализовать самомодификацию
> исполняемого файла?
> Т.е. есть exe'ник, необходимо заставить его стукнуться в
> инет, чтоб он там качнул файл, и НЕ ЗАПУСКАЯ его, изменить
> себя?
Необходимо, чтобы он изменился в памяти или на диске. Если в памяти, то это тривиально, если на диске, то кроме того, что предложил Killer{R} есть способ:

Под NT:
Можно сделать свой thread в другом процессе и из него удалить/пересоздать файл. Причем не обязательно это делать в explorer-е как рекомендуют многие. Эксплорера может и не оказаться (есть извращенцы, которые меняют shell). Просто пытаешься открыть (OpenProcess) все процессы с нужными правами, какой откроется такой откроется. Делаешь там VirtualAllocEx, записываешь кусочек кода при помощи WriteProcessMemory и запускаешь на исполнение поток при помощи CreateRemoteThread. Благополучно выходишь из основного процесса. В созданном потоке ждешь пока процесс перестанет открываться и делаешь с его файлом что угодно.

Под 9x:
Есть одна тонкость. Можно освободить свой модуль и после этого удалять его. Надо выделить динамическую память HeapAlloc, скопировать туда кусок кода и перейти туда. На новом месте сделать FreeLibrary(GetModuleHandle(NULL)) и можно безболезненно удалять свой файл и перезаписывать его. Есть еще один (извращенный) способ: повыкладывать на стек адреса всех функций со всеми параметрами и сделать ret.
Кстати, в NT4 и 2К тоже можно удалить самого себя:) 01.04.04 04:11  
Автор: AlexD <Alexander> Статус: Member
<"чистая" ссылка>
Пример есть в G.Nebbett'е. Точно работает в NT/2К. В XP/2K3 возникают какие-то проблемы...
Именно на диске. 27.03.04 00:29  
Автор: Lutien Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Необходимо, чтобы он изменился в памяти или на диске. Если
> в памяти, то это тривиально, если на диске, то кроме того,
> что предложил Killer{R} есть способ:

Именно на диске.

>
> Под NT:
> Можно сделать свой thread в другом процессе и из него
> удалить/пересоздать файл. Причем не обязательно это делать
> в explorer-е как рекомендуют многие. Эксплорера может и не
> оказаться (есть извращенцы, которые меняют shell). Просто
> пытаешься открыть (OpenProcess) все процессы с нужными
> правами, какой откроется такой откроется. Делаешь там
> VirtualAllocEx, записываешь кусочек кода при помощи
> WriteProcessMemory и запускаешь на исполнение поток при
> помощи CreateRemoteThread. Благополучно выходишь из
> основного процесса. В созданном потоке ждешь пока процесс
> перестанет открываться и делаешь с его файлом что угодно.

Идея очень хороша!
А не подскажите, мож шде есть статейка какая с примером, а то я такого не делала ни разу?

А будет ли работать метод NT под Win9x и наоборт?

> Под 9x:
> Есть одна тонкость. Можно освободить свой модуль и после
> этого удалять его. Надо выделить динамическую память
> HeapAlloc, скопировать туда кусок кода и перейти туда. На
> новом месте сделать FreeLibrary(GetModuleHandle(NULL)) и
> можно безболезненно удалять свой файл и перезаписывать его.
> Есть еще один (извращенный) способ: повыкладывать на стек
> адреса всех функций со всеми параметрами и сделать ret.
Под NT и 9x разные способы 27.03.04 19:54  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Идея очень хороша!
> А не подскажите, мож шде есть статейка какая с примером, а
> то я такого не делала ни разу?
Примера нету, но я в принципе довольно подробно описал (с названиями функций). Как именно вызывать эти функции - можно посмотреть в MSDN

> А будет ли работать метод NT под Win9x и наоборт?
Нет. Под 9x нету CreateRemoteThread (хотя подобного результата можно добиться при помощи dll injection - искать в гугле по этим ключевым словам), а под NT не работает трюк с FreeLibrary

Под 9х пример нашел
http://groups.google.com/groups?hl=ru&lr=&ie=UTF-8&oe=UTF-8&selm=927679011%40p13.f65.n5083.z2.ftn&rnum=9
Да да, огромное спасибо! 28.03.04 03:02  
Автор: Lutien Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > Идея очень хороша!
> > А не подскажите, мож шде есть статейка какая с
> примером, а
> > то я такого не делала ни разу?
> Примера нету, но я в принципе довольно подробно описал (с
> названиями функций). Как именно вызывать эти функции -
> можно посмотреть в MSDN

Да да, все хорошо, даже я вроде въехала.
Просто до практики пока руки не дошли :(( Времени мало:((
На след выходных скорее всего буду пробовать реализовать все это на практике.

Еще раз огромное всем спасибо!

ЗЫ Если вдруг есть еще какие умные идеи, то буду тока рада!
>
> > А будет ли работать метод NT под Win9x и наоборт?
> Нет. Под 9x нету CreateRemoteThread (хотя подобного
> результата можно добиться при помощи dll injection - искать
> в гугле по этим ключевым словам), а под NT не работает трюк
> с FreeLibrary
>
> Под 9х пример нашел
> http://groups.google.com/groups?hl=ru&lr=&ie=UTF-8&oe=UTF-8
> &selm=927679011%40p13.f65.n5083.z2.ftn&rnum=9
Еще способ под Win9x 27.03.04 22:20  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
Правда это из ring0, но зато можно писать хоть в kernel32.dll :)

Win9X: Пишем в закрытые для записи файлы
http://www.sbvc.net/articles/34.html 09.04.04 10:08  
Автор: Kerk Статус: Незарегистрированный пользователь
<"чистая" ссылка>
С NT-ями все гораздо интереснее 28.03.04 07:36  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Правда это из ring0, но зато можно писать хоть в
> kernel32.dll :)
Вот чего я за ночь наковырял

Открываем файл совершенно без прав, находим HANDLE_TABLE_ENTRY и правим себе права (каламбур). Нюанс во первых в том, что таблицы хендлом в NT-совместимых осях довольно хитрые, во-вторых в том, что в 2k и XP они имеют совершенно разную организацию. В частности вот кусок кода прямо из драйвера:
// TestDriver.h
typedef struct {
	PVOID	Object;
	ACCESS_MASK	GrantedAccess;
} HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;

typedef struct _HANDLE_TABLE_XP {
	ULONG	TableCode;
	CHAR	pad[0x34];
	ULONG	NextHandleNeedingPool;
} HANDLE_TABLE_XP, *PHANDLE_TABLE_XP;

typedef struct _HANDLE_TABLE_2K {
        ULONG	Pad;
	LONG HandleCount;
	PHANDLE_TABLE_ENTRY **Table;
} HANDLE_TABLE_2K, *PHANDLE_TABLE_2K;

typedef struct _EXHANDLE {
	union {
		struct {
			ULONG TagBits : 2;
			ULONG Index : 30;
		};
		HANDLE GenericHandleOverlay;
	};
} EXHANDLE, *PEXHANDLE;

#define LEVEL_CODE_MASK (3)

// TestDriver.c
	do {
		HANDLE	hFile;
		UNICODE_STRING	NameString;
		OBJECT_ATTRIBUTES	ObjAttrs;
		IO_STATUS_BLOCK	IoStatus;
		LARGE_INTEGER	ByteOffset;

		RtlInitUnicodeString(&NameString, L"\\??\\C:\\testfile");
		InitializeObjectAttributes(&ObjAttrs, &NameString, 0, NULL, NULL);
		ntStatus = ZwCreateFile(&hFile, GENERIC_READ, &ObjAttrs, &IoStatus, 0, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN_IF, 0, NULL, 0);
		if (!NT_SUCCESS(ntStatus))
			break;

		do {
			PHANDLE_TABLE_XP Table;
			EXHANDLE Handle;
			PHANDLE_TABLE_ENTRY Entry, Entries;
			ULONG TableCode;

			Handle.GenericHandleOverlay = hFile;
			Table = *(PHANDLE_TABLE_XP *)((ULONG)PsGetCurrentProcess() + 0xc4);
			Handle.TagBits = 0;
			// Handle.Index &= ~0x10000000

			if ((ULONG)Handle.GenericHandleOverlay >= Table->NextHandleNeedingPool)
				break;
			TableCode = Table->TableCode & ~LEVEL_CODE_MASK;
			switch (Table->TableCode & LEVEL_CODE_MASK) {
			case 0:
				Entries = (PHANDLE_TABLE_ENTRY)(TableCode);
				Entry = Entries + Handle.Index;
				break;

			case 1:
				Entries = ((PHANDLE_TABLE_ENTRY *)TableCode)[Handle.Index >> 9];
				Entry = Entries + (Handle.Index & 0x1ff);
				break;

			case 2:
				Entries = ((PHANDLE_TABLE_ENTRY **)TableCode)[Handle.Index >> 0x13][(Handle.Index & ~(0 - (1 << 0x13))) >> 9];
				Entry = Entries + (Handle.Index & 0x1ff);
				break;

			default:
				Entry = NULL;
			}
			if (Entry != NULL)
				Entry->GrantedAccess = 0x001f01ff;
		} while (0);

		ByteOffset.QuadPart = 0;
		ntStatus = ZwWriteFile(hFile, NULL, NULL, NULL, &IoStatus, (PVOID)"\x12\x34\x56\x78", 4, &ByteOffset, NULL);

		ZwClose(hFile);
	} while (0);

---

GENERIC_READ для ZwCreateFile-а поставлен для того, чтобы было явно видно, что прав на запись мы не получаем. Лучше и прав на чтение не просить и открывать с нулем в этом поле. Кроме того, для атрибутов хендла не указываются OBJ_KERNEL_HANDLE, то бишь хендл будет принадлежать процессу, в контексте которого будет на момент исполнения этого кода находиться ядро. Можно вообще не дать такому процессу открывать файлы при помощи квот или еще чего нить. В этой ситуации надо создавать ядерный хендл (в InitializeObjectAttributes указывать OBJ_KERNEL_HANDLE), таблицу хендлов брать не из текущего процесса, а из процесса System и перед преобразованием хендла сбросить ему старший (31-й) бит

Преимущество в данном методе одно: никаких манипуляций с удалением/созданием нового файла не надо (хотя фиг его знает как еще поведет себя система), а недостатки: все метода, кроме драйверных не требуют никаких прав кроме прав на запись/удаление этого самого файла; драйверные методы использую ОЧЕНЬ недокументированные возможности. Не гарантируется работоспособность даже на другом хотфиксе, не то что на другом сервис паке или не дай бог очередной версии

В заключение приведу функцию для поиска HANDLE_TABLE_ENTRY в 2000-й винде:
PHANDLE_TABLE_ENTRY
ExpLookupHandleTableEntry2k (
    IN PHANDLE_TABLE_2K HandleTable,
    IN EXHANDLE Handle
    )
{
    ULONG i,j,k,l;

    l = (Handle.Index >> 24) & 255;
    i = (Handle.Index >> 16) & 255;
    j = (Handle.Index >> 8)  & 255;
    k = (Handle.Index)       & 255;


    if ( l != 0 ) {
        return NULL;
    }

    if (HandleTable->Table[i] == NULL) {
        return NULL;
    }

    if (HandleTable->Table[i][j] == NULL) {
        return NULL;
    }

    return &(HandleTable->Table[i][j][k]);
}

---
Вау, это очень даже интересно! 28.03.04 01:58  
Автор: Lutien Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Правда это из ring0, но зато можно писать хоть в
> kernel32.dll :)

Вау, это очень даже интересно!
Спасибо за ссылку! Сайт очень даже интересный, много чего нового!
Под NT: 26.03.04 01:02  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
> Уважаемые , подскажите как бы реализовать самомодификацию
> исполняемого файла?
> Т.е. есть exe'ник, необходимо заставить его стукнуться в
> инет, чтоб он там качнул файл, и НЕ ЗАПУСКАЯ его, изменить
> себя?

Под NT:
1)переименовать самого себя
2)скопировать себя по старому имени
3)сделать изменения
4)запустить измененного, самому выйти
5)измененный стирает старого

Под 9х(там вроде низзя переименовывать работающие ехе) и NT:
1)скопировать себя во временное имя
2)сделать изменения там
3)запустить нового и выйти
5)новый копирует себя по старому имени
6)новый запускает копию и выходит
7)копия стирает временный ехешник
Под NT: 27.03.04 00:33  
Автор: Lutien Статус: Незарегистрированный пользователь
<"чистая" ссылка>

> Под NT:
> 1)переименовать самого себя

А как переименовать свой exe файл? В MSDN рылась, но безрезультатно :(
мдя 27.03.04 00:48  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
>
> > Под NT:
> > 1)переименовать самого себя
>
> А как переименовать свой exe файл? В MSDN рылась, но
> безрезультатно :(
Имя своего файла: GetModuleFileName
Переименовать: MoveFile
Скопировать: CopyFile
Удалить: DeleteFile
Открыть, читать, писать, закрыть: CreateFile,ReadFile,WriteFile,CloseHandle
Если надо чтоб работало и под 9х и под НТ - то надо заюзать способ 2
ну зачем же так 27.03.04 21:17  
Автор: Lutien Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Спасибо за столь развернутый ответ ;)
Правда я все это и так знала, точнее почти все, не приходило на ум использовать MoveFile.

> >
> > > Под NT:
> > > 1)переименовать самого себя
> >
> > А как переименовать свой exe файл? В MSDN рылась, но
> > безрезультатно :(
> Имя своего файла: GetModuleFileName
> Переименовать: MoveFile
> Скопировать: CopyFile
> Удалить: DeleteFile
> Открыть, читать, писать, закрыть:
> CreateFile,ReadFile,WriteFile,CloseHandle
> Если надо чтоб работало и под 9х и под НТ - то надо заюзать
> способ 2

1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach