PDA

Просмотр полной версии : Играем в прятки с Filemon и Regmon. Нестандартный (читай - кривой) кодинг


_kREveDKo_
21.06.2006, 12:46
::goto intro::

:intro

Здарова, перец, сейчас я поведаю тебе маленькую историю о том, как я играл в прятки с Filemon Nt и Regmon Nt.
Этаи программы призваны засекать обращение к файловой системе и к реестру. А мне вот
захотелось сделать так, что бы они не пялились на места, где моя прога оставляет следы.

Начнём с примитива. Вот простейшая программа на си, которая всего-то и делает, что объявляет
переменную с путём к файлу для обращения и записывает по этому пути строчку текста.



#include <stdio.h>
char *file = "C:\\Windows\\lala.txt";
int main(int argc, char *argv[])
{
FILE *fp;
fp=fopen(file,"w");
fprintf(fp,"Xex! Palevo!");
fclose(fp);
return 0;
}



Предварительно настроив filemon на процесс моего приложения, я запустил прогу и смог лицезреть в
логах место, куда я записал текстовик. Естественно, что это стандартный и наиболее правильный
метод записи в файл - создание потока и запись в него. Вот тут я и начал свои поиски альтернативных
путей записи. Перепробовав практически все стандартные функции для работы с файловой системой,
я вспомнил про свою нездоровую любовь к коммандному интерпретатору и страсть ваять .bat-ники.
Для работы с CMD в C/C++ есть функция system(""); Она-то и пошла в бой.
Безо всяки колебаний я наколбасил уже давно привычную строчку:

echo Xex! Filemon sucksss! > C:\Windows\Help\lala.txt и поместил её в
функцию system("");. Вышло:



#include <stdio.h>
int main(int argc, char *argv[])
{
system("echo Xex! Filemon sucksss! > C:\\Windows\\Help\\lala.txt");
return 0;
}



Какова была моя радость, когда, пролистав логи, я не увидел пути C:\Windows\Help, а лицезрел
лишь путь к cmd.exe (C:\Windows\system32). Ну правильно! Filemon правильно отследил, что мы
обратились к Cmd.exe!!! Но он даже не стал смотреть, что интерпретатор там вытворяет на харде!
Вот оно! Мы же использовали cmd как козла отпущения, который умеет работать с потоками! =)

::Я требую продолжения банкета!::

Через 2 минуты после оргазма, полученного от результата кривой кодерской мысли, глаза мои
снова загорелись недеЦЦким пламенем и мне захотелось таким же образом наколоть Regmon Nt.
Издав азартное "Гыгы! Нука нука!!" я с блаженным лицом принялся обдумывать, как можно сделать
запись в реестр НЕстандартным путём. Ведь все стандартные ф-ции записи в реестр Regmon Nt видит
как кошка видит бомжа в тёмном подвале, поэтому я даже не стал пытаться их юзать.
"А что тут думать?"-подумал я! Давай опять найдём козла отпущения, только теперь он должен
уметь работать с реестром!.

Да не вопрос, ёпт! Зачем, спрашивается, программеры конторы Билла придумали прогу reg.exe?
Конечно для нас! Её прямая обязанность дать нам возможность работать с реестром через коммандную
строку. Изучив основные параметры этой программы, я наколбасил тестовый код, который через
reg.exe добавлял в реестр параметр "Test" со значением "regmon sucks".



#include <stdio.h>
int main(int argc, char *argv[])
{
system("reg.exe ADD \"HKCU\\Software\\Microsoft\\Internet Explorer\\Main\" /v Test2 /d \"filemon sucks\"");
return 0;
}



И снова я расплываюсь в улыбке. Regmon своим молчанием даёт понять, что процесс sucks.exe(моя прога)
на девственный реестр не покушался.

Можно было ещё пойти немножко другим способом. Вот код:



#include <stdio.h>
int main(int argc, char *argv[])
{
system("echo Windows Registry Editor Version 5.00 > sucks.reg");
system("echo [HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\Main] >> sucks.reg");
system("echo \"Window Title\" = \"lol\" >> sucks.reg");
system("start sucks.reg");
system("del sucks.reg /Q");
system("pause");
return 0;
}


Примитивный сорец, думаю, не вызывает у тебя вопросов. Создаётся файл sucks.reg (создаётся опять же
не стандартным методом), выполняется и удаляется, благополучно занеся запись в реестр и не вызвав
внимания на процесс приложения.




::Помечтали и хватит::

Конечно же будут правы те, кто сейчас начнёт бубнеть, что это совершенно не кодерский подход
к решению проблемы. Данный способ отвлечения работает увы не так хорошо... Увы...А всё потому,
что достаточно в Regmon убрать фильтр по моему процессу и вот уже он прекрасно отследил кто куда
и что записал. Ещё один способ - снятие "слепка" с реестра. Этот способ был описан в спец хакере
за май (С помощью программы WinTools.Net). НО... всё-таки хоть и не намного, но описанный мною
способ осложнит работу крякеру (хотя для нормального крякера, вообще нет неломаемой программы),
ведь винда постоянно работает с реестром и файловой системой. Это значит, что в логах будет куча
мусора, который неприятно разбирать. В общем вердикт думаю такой: 2:1 в пользу спец софта. Одним
очком я наградил себя за храбрость а Reg/File-mon наградил двумя. за то, что с задачей своей он
справился.

::Зачем я всё это читал?::

Лично я считаю, что применение этому способу можно найти лишь в часном случае, при работе в
конкретных условиях. Так обычно и случается: прочитал какую-нибудь статьюс интересным подходом
и отложил в памяти. Потом через определённое время появляется необходимость действовать не
по-страндартному и тогда вспоминается отложенный в "опиративке" способ. Надеюсь
моё мини-исследование тебе тоже когда-нибудь пригодится. =) На этом ставлю точку.
Не болей!

W!z@rD
23.06.2006, 04:44
Мда... какого только кодинга не существует ;)

qBiN
23.06.2006, 08:19
Дурь

ProTeuS
30.07.2006, 23:23
а можно просто:
CreatFileMapping -> MapViewOfFile и файлмон уходит отдохнуть

_kREveDKo_
31.07.2006, 23:02
На то ж я не Pr0_c0d3r а b00zy_c0d3r =) и на то это кривой кодинг =)