![]() |
|
|
#1
|
||||
|
||||
![]() Привет форум!
Такой вот вопрос. Хочу с помощью отдельной программы зашифровать кусок 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
|
||||
|
||||
![]() Варианты:
1) Кури спецификацию формата PE (Portable Executable). 2) Сохранить считанный массив байт (к примеру, первые 128 байт) и бинарно найти его в EXE-файле, определить адрес в файле. 3) Сделать в начале и конце функции магические АСМ-вставки с какой-нибудь константой, по которой функцию легко найти в файле. Или же вызов некой ненужной функции из липовой DLL, который потом будет убран, но позволит найти начало и конец для крипты при парсинге файла. Также надо учитывать, что секция кода для записи изначально не доступна, поэтому для расшифровки скорее всего придется делать VirtualProtect. А также не удивляйся, если вдруг какие-нибудь антивирусы начнут генерировать тонны кирпичей на такое поведение. jmp $ ; Happy End! The Cake Is A Lie. |
#3
|
||||
|
||||
![]() Ну вот у меня с помощью меток и определяется этот кусок. Используется VirtualProtect и работает вроде, касперский по крайней мере не ругается. Буду разбираться с PE, хотя боюсь загнаться... щас начну дописывать секции, менять точки входа...
![]() |
#4
|
|||
|
|||
![]() На сколько я знаю, ASProtect, например, работает (работал по крайней мере, давно не анализировал) примерно так:
1. Программист в начале и конце интересующего его метода расставляет метки. Компилит программу. 2. Запускается ASProtect. Он находит помеченные куски кода, вырезает их, забивает старое место NOP'ами, сам код шифрует и складывает в ресурсы. В начало заNOPоеных кусков ставит переход на свои функции. 3. В самом конце он прописывает свой лоадер. 4. При работе программы при достижении такого места происходит переход в функцию ASProtect'а, которая берет нужный ресурс, расшифровывает его в память и выполняет, потом стирает из памяти и делает переход на конец заNOPленного блока. |
#5
|
||||
|
||||
![]() Если переносить код куда-то, возникнут проблемы с относительными адресами: их все надо найти в коде и пересчитать. А так - да, возможно и такое.
jmp $ ; Happy End! The Cake Is A Lie. |
#6
|
|||
|
|||
![]() Ну, как-то он это делает.
При этом извесны проблемы пересечения шифрованных блоков. Т.е. не все так гладко, как кажется, но, в общем, работает. |