Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
ну зачем же так 27.03.04 21:17 Число просмотров: 1578
Автор: Lutien Статус: Незарегистрированный пользователь
|
Спасибо за столь развернутый ответ ;)
Правда я все это и так знала, точнее почти все, не приходило на ум использовать MoveFile.
> > > > > Под NT: > > > 1)переименовать самого себя > > > > А как переименовать свой exe файл? В MSDN рылась, но > > безрезультатно :( > Имя своего файла: GetModuleFileName > Переименовать: MoveFile > Скопировать: CopyFile > Удалить: DeleteFile > Открыть, читать, писать, закрыть: > CreateFile,ReadFile,WriteFile,CloseHandle > Если надо чтоб работало и под 9х и под НТ - то надо заюзать > способ 2
|
<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
|
| | | | |
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
|
|
|