Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.09.2015, 11:05
Аватар для a.n.d.r.e.w
a.n.d.r.e.w a.n.d.r.e.w вне форума
Прохожий
 
Регистрация: 01.07.2015
Сообщения: 28
Версия Delphi: delphi xe7
Репутация: 10
По умолчанию image address

Привет форум!
Такой вот вопрос. Хочу с помощью отдельной программы зашифровать кусок exe файла содержащий некоторую функцию, а при выполнении этого exe он будет сам свой кусок расшифровывать. Вобщем задача тривиальная, определить адреса этого блока в момент шифрации отдельной программой и адрес такого же блока при дешифрации самого себя.
Делаю так нахожу всякими череззаднийпроходными способами адрес в памяти самого процесса получаю Addr1
потом загружаю в мемористрим этот же exe нахожу там этот же кусок по адресу Addr2
дальше определяю смещения
Ofs1=Addr1-Hinstance
Ofs2=Addr2-MS.Memoryв итоге Ofs1<> Ofs2
Если посмотреть в VMMap то адрес имидж блока начинается с header который 4КБ а адрес .tеxt с адреса $00401000 но разница меньше 4КБ
Как понять что это за дельта где ее определить получается Ofs1-Ofs2= 3072 байт?

Хммм.. перефразирую вопрос.
есть тестовое приложение, в нем есть к примеру функция "Test", я могу получить ее адрес:
Addr1:=Addr(Test);
если по этому адресу просто вычитать данные получим к примеру "C3 8D 40 00 55 8B EC B8 ...."
затем я запускаю другое приложение в котором, загружаю в мемористрим exe файл моего тестового приложения
и вот вопрос, как мне определить позицию меморитсрима по которой я прочитаю тот же блок "C3 8D 40 00 55 8B EC B8 ...."????

Последний раз редактировалось a.n.d.r.e.w, 24.09.2015 в 16:11.
Ответить с цитированием
  #2  
Старый 24.09.2015, 23:50
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Варианты:
1) Кури спецификацию формата PE (Portable Executable).
2) Сохранить считанный массив байт (к примеру, первые 128 байт) и бинарно найти его в EXE-файле, определить адрес в файле.
3) Сделать в начале и конце функции магические АСМ-вставки с какой-нибудь константой, по которой функцию легко найти в файле. Или же вызов некой ненужной функции из липовой DLL, который потом будет убран, но позволит найти начало и конец для крипты при парсинге файла.
Также надо учитывать, что секция кода для записи изначально не доступна, поэтому для расшифровки скорее всего придется делать VirtualProtect.
А также не удивляйся, если вдруг какие-нибудь антивирусы начнут генерировать тонны кирпичей на такое поведение.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 25.09.2015, 07:18
Аватар для a.n.d.r.e.w
a.n.d.r.e.w a.n.d.r.e.w вне форума
Прохожий
 
Регистрация: 01.07.2015
Сообщения: 28
Версия Delphi: delphi xe7
Репутация: 10
По умолчанию

Ну вот у меня с помощью меток и определяется этот кусок. Используется VirtualProtect и работает вроде, касперский по крайней мере не ругается. Буду разбираться с PE, хотя боюсь загнаться... щас начну дописывать секции, менять точки входа...
Ответить с цитированием
  #4  
Старый 25.09.2015, 19:58
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,105
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

На сколько я знаю, ASProtect, например, работает (работал по крайней мере, давно не анализировал) примерно так:
1. Программист в начале и конце интересующего его метода расставляет метки. Компилит программу.
2. Запускается ASProtect. Он находит помеченные куски кода, вырезает их, забивает старое место NOP'ами, сам код шифрует и складывает в ресурсы. В начало заNOPоеных кусков ставит переход на свои функции.
3. В самом конце он прописывает свой лоадер.
4. При работе программы при достижении такого места происходит переход в функцию ASProtect'а, которая берет нужный ресурс, расшифровывает его в память и выполняет, потом стирает из памяти и делает переход на конец заNOPленного блока.
Ответить с цитированием
  #5  
Старый 25.09.2015, 21:12
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Если переносить код куда-то, возникнут проблемы с относительными адресами: их все надо найти в коде и пересчитать. А так - да, возможно и такое.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #6  
Старый 25.09.2015, 22:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,105
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, как-то он это делает.
При этом извесны проблемы пересечения шифрованных блоков.
Т.е. не все так гладко, как кажется, но, в общем, работает.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:20.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025