информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Страшный баг в WindowsПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





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

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

Под 9х(там вроде низзя переименовывать работающие ехе) и NT:
1)скопировать себя во временное имя
2)сделать изменения там
3)запустить нового и выйти
5)новый копирует себя по старому имени
6)новый запускает копию и выходит
7)копия стирает временный ехешник
<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-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach