« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга


ПнВтСрЧтПтСбВс
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
    Популярное
Функция AccessResource

CASE-средства. Общая характеристика и классификация

Часть VIII. Интерфейс

Перемещение изображения по форме с помощью мыши

Резюме

Полный справочник по C++

Конструктор апплета

Как Дон Бокс HTTP "похоронил"

Функция RGB

Будущее AJAX


    Архив файлов



    Сообщества



    Документация

Статьи:: Delphi :: DELPHI и ХАКЕР :: Хранение нескольких различных файлов в одном исполняемом 2 (Анпакер)


отправить ссылку другу версия для печати  Обсудить на форуме

Хранение нескольких различных файлов в одном исполняемом 2 (Анпакер)



Часть II. "Анпакер"

© 2003 Zero Ice
см. Часть I

В моей прошлой статье обсуждалась тема написания упаковщика (Packer), теперь же подробно остановимся на программе, котрая всё спрятанное будет из себя доставать. Но сначала я хотел бы обосновать своё мнение о личных форматах хранения информации, которое, возможно, было неправильно понято некоторыми читателями. Когда человек создаёт свой формат хранения информации, то только он знает как её оттуда достать. Большинство программ (например игровые) используют свои форматы хранения ресурсов (музыка, спрайты/текстуры, мультики). Быть может, взломать эти ресурсные файлы легче, так как можно декомпилить/дизассемблить исполняемый файл и понять, как и что прячет и достаёт программа, но я знаю очень мало людей способных это сделать. Если же использовать стандартные средства хранения (какой-нибудь архиватор), то любой более или менее опытный пользователь может посмотреть заголовок файла и по нему найти нужную "открывалку".

Теперь вернёмся к коду пакера. Для удобства я добавил в OnCreate формы следующую строчку:


procedure TForm1.FormCreate(Sender: TObject);
begin
 Edit3.Text:=ExtractFilePath(ParamStr(0))+'test.exe';
end;

Это сделано для удобства использования программы, так как до этого файл "Test.exe" кидался в последнюю открытую директорию и приходилось постоянно указывать путь. Так же надо добавить строчку в самый конец Button1Click:

CloseFile(f2);

Ну вот и всё, что качалось пакера. Осталось самое интересное - анпакер. Вот усовершенствованный код Unpacker'а с последующими комментариями:


program Unpacker;

uses
  Classes;

const c=117248;

var mem:TmemoryStream;
    i:integer;
    done:integer=0;
    done1:integer;
    f:file;
    buf:array[1..2048] of byte;
begin
 mem:=TmemoryStream.Create;
 mem.LoadFromFile(paramstr(0));
 mem.Seek(c,soFromBeginning);
 mem.ReadBuffer(i,sizeof(i));
 assignfile(f,'temp1');
 rewrite(f,1);
 while i>=done+2048 do begin
  done1:=mem.Read(buf,sizeof(buf));
  blockwrite(f,buf,done1);
  done:=done+done1;
 end;
 if i>done then begin
                 done1:=mem.Read(buf,i-done);
                 blockwrite(f,buf,done1);
                end;
 closefile(f);

 done:=0;
 mem.ReadBuffer(i,Sizeof(i));
 assignfile(f,'temp2');
 rewrite(f,1);
 while i>done+2048 do begin
  done1:=mem.Read(buf,sizeof(buf));
  blockwrite(f,buf,done1);
  done:=done+done1;
 end;
 if i>done then begin
                 done1:=mem.Read(buf,i-done);
                 blockwrite(f,buf,done1);
                end;
 CloseFile(f);

 mem.Free;
end.

Одним из самых простых и эффективных методов работы с .exe файлами являются потоки. Тут всё просто. Сначала мы создаём поток, затем загружаем в него исполняемый файл. Далее следует очень важная строчка:


mem.Seek(c,soFromBeginning);

Константа "с" является размером анпакера. Значение 117248 было получено эксперементальным путём. Для этого компилим анпакер и смотрим его ТОЧНЫЙ (а не занимаемый) размер. Его-то и присвайваем "c". Далее мы считываем размер первого файла. Затем циклом копируем его содержимое "Temp1". Аналогично поступаем со вторым файлом. На выходе получаются два файла, которые мы дописали пакером в анпакер.

Чем хорош этот анпакер? Первое и самое главное это то, что весь файл загружается в ОЗУ и извлечение происходит на максимальной скорости. Теперь чем он плох. Во первых размером. Поэтому его нельзя использовать для распаковки трояна и какой-нибудь игрушки (код запуска обоих можно добавить в самый конец (WinExec)). Так же, раз всё загружается в память, то её может не хватить (а то зашьешь в анпакер два файла по 400 метров :).

Можно пойти другим путём - использовать стандартные Delphi'ковские FileOpen, FileRead and so on :).
Вот исходник:


program Unpacker;

uses
  SysUtils;

const c=41984;

var h:integer;
      mas:array[1..2048] of byte;
      f:file;
      i,done1:integer;
      done:integer=0;

begin
 h:=FileOpen(paramstr(0),fmOpenRead or fmShareDenyWrite);
 FileSeek(h,c,0);
 FileRead(h,i,sizeof(i));
 assignfile(f,'temp1');
 rewrite(f,1);
 while i>=done+2048 do begin
  done1:=FileRead(h,mas,sizeof(mas));
  blockwrite(f,mas,done1);
  inc(done,done1);
 end;
 if i>done then begin
                 done1:=fileread(h,mas,i-done);
                 blockwrite(f,mas,done1);
                end;
 CloseFile(f);
 done:=0;
 FileRead(h,i,sizeof(i));
 assignfile(f,'temp2');
 rewrite(f,1);
 while i>=done+2048 do begin
  done1:=FileRead(h,mas,sizeof(mas));
  blockwrite(f,mas,done1);
  inc(done,done1);
 end;
 if i>done then begin
                 done1:=fileread(h,mas,i-done);
                 blockwrite(f,mas,done1);
                end;
 CloseFile(f);
 FileClose(h);
end.

В принципе всё то же самое, что и в первом примере, только без потоков (помни про "c").

Отсюда вытекает следующее: меньше расходуется память, так как все мы берём из файла, объём анпакера сокращается до 41984 байт (у тебя может быть другая цифра). Минусы - работа с винтом и всё еще большой анпакер, так что троян записать (и кому-нибудь "подарить") проблематично.

В следующий раз мы поговорим о Windows Api и оптимизации кода анпакера.

И помни: мои примеры всегда можно подогнать под свои нужды и использовать в общественно-полезной деятельности :)))).

Copyright© 2003 Zero Ice  Специально для Delphi Plus




Рубрика: DELPHI и ХАКЕР




XML документация в C#.

XML в .NET

Сегодня речь пойдет об одной интересной и полезной возможности языка С#, которая поможет нам в документировании кода. Она называется «XML документация» или «Документирующие комментарии XML». Это такие специальные теги XML, которые содержаться в комментариях и описывают свойства или методы в конкретном файле. Так вот, есть по крайней мере три веских причины, почему всегда следует заполнять XML комментарии.


Подробнее... | Рубрика: XML в .NET | Добавлено: 08.10.2008

Курсоры в MySQL 5.

MySQL

Начиная с 5-ой версии, MySQL имеет возможность создавать курсоры. Курсор — это виртуальная таблица, предоставляющая альтернативный способ просмотра табличных данных. Курсор не содержит данных, а лишь ссылается на них из других таблиц. Из этого вытекает ряд особенностей, но об этом ниже.


Подробнее... | Рубрика: MySQL | Добавлено: 08.10.2008

Microsoft опубликовала подробности о сессиях Windows 7.

Мероприятия

В преддверии конференции WinHEC компания Microsoft опубликовала подробный список сессий, которые пройдут в рамках конференции. Довольно-таки большое количество выступлений будет посвящено Windows 7, что не может не радовать. Принимая во внимание тот факт, что PDC и WinHEC разделяют несколько дней, а пройдут они в одном здании - Los Angeles Convention Center, - можно несколько дней поиграть в прятки, спрятавшись в какой-нибудь комнате, но зато бесплатно посетить WinHEC.


Подробнее... | Рубрика: Мероприятия | Добавлено: 08.10.2008

Остальные статьи:

Microsoft делится подробностями о том, что будет после Windows
Тестируем новый javascript от нового браузера Google
MySQL Query Cache
Использование провайдеров компиляции в Asp.net
Чего мы ждем от C# 4.0
Delphi 2009 и C++Builder 2009
Джоэл Спольски и Джеф Этвуд запустили новый вебсайт для программистов - StackOve...
Поиск кода Google /* что нового? */
10 jQuery скриптов для улучшения интерфейса
Генераторы отчетов FastReport 4 и QuickReport 5: версии 2008 года
День программиста — набор стерeотипов
Индусские програмисты
Вышел Django 1.0
Портативная версия Google Chrome Portable
Исходные коды .Net Frameword 3.5 SP1 для отладки в Visual Studio
Пишем правильный online WYSIWYG-редактор


Цитата дня (все,добавить):

Портал фрилансеров

    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование

Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 147
Пользователей: 0