> Идея очень хороша! > А не подскажите, мож шде есть статейка какая с примером, а > то я такого не делала ни разу? Примера нету, но я в принципе довольно подробно описал (с названиями функций). Как именно вызывать эти функции - можно посмотреть в MSDN
> А будет ли работать метод NT под Win9x и наоборт? Нет. Под 9x нету CreateRemoteThread (хотя подобного результата можно добиться при помощи dll injection - искать в гугле по этим ключевым словам), а под NT не работает трюк с FreeLibrary
Уважаемые , подскажите как бы реализовать самомодификацию исполняемого файла?
Т.е. есть 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
> Необходимо, чтобы он изменился в памяти или на диске. Если > в памяти, то это тривиально, если на диске, то кроме того, > что предложил 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
> > Идея очень хороша! > > А не подскажите, мож шде есть статейка какая с > примером, а > > то я такого не делала ни разу? > Примера нету, но я в принципе довольно подробно описал (с > названиями функций). Как именно вызывать эти функции - > можно посмотреть в 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
Еще способ под Win9x27.03.04 22:20 Автор: :-) <:-)> Статус: Elderman
> Правда это из ring0, но зато можно писать хоть в > kernel32.dll :) Вот чего я за ночь наковырял
Открываем файл совершенно без прав, находим HANDLE_TABLE_ENTRY и правим себе права (каламбур). Нюанс во первых в том, что таблицы хендлом в NT-совместимых осях довольно хитрые, во-вторых в том, что в 2k и XP они имеют совершенно разную организацию. В частности вот кусок кода прямо из драйвера:
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 Статус: Незарегистрированный пользователь
> Уважаемые , подскажите как бы реализовать самомодификацию > исполняемого файла? > Т.е. есть 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 рылась, но > безрезультатно :( Имя своего файла: 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