EXE PACKING – The Hard Way Упаковка екзешников вручную - важная процедура, которая может быть выполнена вполне элементарно.. Существует много причин для шифрования файлов, например защита программ от изменений, взлома и т.д. Некоторые хеккеры используют это для криптования вириев и троев, для внедрения вредоносного кода в готовые .exe, короче максимально завуалировать свои вредоносные программы, скрипты, коды. Еще одно достоинство ручного шифрования-это обход антивирусников или вовсе превращение вредоносного кода в код подписанный, заверенный антивирусом. Для начала, точка входа (.text, .date, .rsrc) требует шифрования. Но если местоположение сигнатуры вируса известно, требуется зашифровать только вредоносную секцию кода программы, определенные байты. Небольшую XOR функцию необходимо закодировать( перенести в код заражаемой программы ), для того чтобы ее можно было шифровать и сохранить в файл. После того, как файл был зашифрован, его требуется запустить, и XOR-функция запустится вместе с файлом. Во время запуска программы, шифрованный вредоносный код дешифруется изапускается внутри памяти зараженной программы. Следовательно, Для антивируса запускается не два файла(неопасный экзешник и вредоносный код), а один, безопасный файлик, никак не определяемый антивирусом. Что такое XOR функция? XOR, так же известное как Exclusive OR, это побитовый оператор двооичной математики. Оператор XOR возвращает 1 когда значение первого или второго битов равно 1. Так же, оператор XOR возврощает 0, когда ниодного или оба одновременно значения 1-го и 2-го битов равны 1. Разъяснить можно этой диаграммой: Код: 1.bit 2.bit Result F F F F T T T F T T T F Оператор XOR используется для сдвига, замены (нулей и единиц) в куске незашифрованного кода для создание шифрованного текста. Другими словами, если кусок кода прогнать через XOR дважды, то изменений от исходника не будет, т.е. после шифрования XOR'ом уже зашифрованного XOR'ом кода - код дешифруется до первоначального состояния. Код: Entry Point <--- jump to encrypt/cave code Code Cave <--- XOR function encrypt/decrypt End Cave <--- Заменяем точку входа процессом шифрования, внедряем процесс шифрования в стек, затем возвращаем замещенный кусок исходной программы(точку входа в частности), возвращаем изначальный код заражаемой программы, после исполнения вредоносного кода. Шифрующий код должен запуститься одновременно с чистым кодом заражаемой проги, что бы в зашифрованном виде сохраниться в файл (дроп). Следующий раз зараженная прога при запуске расшифрует этот код. Что потребуется: зараженный exe (Трой, вирь...) Ollydbg LordPE И так приступим. Откройте зараженный файл Ollydbg и скопируйте первые несколько комманд ( на все изменения делать бэкапы в блокнотике) Вставте эти строчки в текстовый редактор. Код: -=:Entry Code:=- 00401219 >/$ 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 0040121F |. 55 PUSH EBP 00401220 |. 89E5 MOV EBP,ESP 00401222 |. 6A FF PUSH -1 Теперь в конце файла ищите DB 00 в стеке. Если эта секция не защищена от записи, то все хорошо, не придется менять допуски к секции. Код: -=:Cave Code:=- 0040E4FD 0000 ADD BYTE PTR DS:[EAX],AL 0040E4FF 0000 ADD BYTE PTR DS:[EAX],AL 0040E501 0000 ADD BYTE PTR DS:[EAX],AL 0040E503 0000 ADD BYTE PTR DS:[EAX],AL Если появилась ошибка-значит эта секция защищена и придется модифицировать PE секцию, чтобы получить доступ к редакттированию. Это можно легко сделать с помощью LordPE (меняет свойства секций) Открываем LordPE, загружаем наш файл, тыкаем кнопку Section. После этого правой кнопкой data section, выбераем свойства. Убираем\ставим голочки-в общем делаем файл доступным к изменению и запуску (writeable and executable). Этот файл готов. Следущий алгоритм используется для XOR-шифрования секции. Фактически это банальное шифрование каждого байта из data section (@0040129c) с нашим ключем (0f). Цикл остановится в конце data section (@0040E46C) Код: Encryption Routine mov eax,0040129c xor byte [eax],0f inc eax cmp eax,0040E46C jle [xor address] Deleted Call 00401219 >/$ 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 0040121F |. 55 PUSH EBP Jump back to application flow 00401219 > E9 E2D20000 JMP finish1t.0040E500 0040121E 90 NOP Финальный код должен выглядеть примерно так: Код: XOR Loop + Deleted Call + Jump back to application flow. Code Cave: 0040E500 B8 9C124000 MOV EAX,finish1t.0040129C ; Entry address 0040E505 8030 0F XOR BYTE PTR DS:[EAX],0F 0040E508 0 INC EAX 0040E509 3D 6CE44000 CMP EAX,<JMP.&CRTDLL.wctomb>; Entry address 0040E50E 7E F5 JLE SHORT finish1t.0040E505 0040E510 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 0040E516 E9 042DFFFF JMP finish1t.0040121F Теперь делаем break point в конце цикла, строчка 0040e510, и выполняем код. Как только выполнение остановилось, сохраняем файл и выходим из OllyDbg Код: 00401219 >/$ 64:A1 00000000 JMP finish1t. 0040E500 (c)onthar, 08.2008. по мотивам: EXE PACKING – The Hard Way Jacky Altal 16/06/2006