Комментарии 23
>>В наличии относительный условный переход, который затрется нашими 5 байтами
Именно по этой причине стараюсь использовать технику сплайсинга как можно меньше!
Куда больше нравится править непосредственно IAT(Import Address Table).
Поясню:
Допустим есть код:
Для наглядности офсет куда указывает инструкция call покажу в виде списка dword-ов:
Как мы знаем это ничто иное как адрес в IAT:
Можно сделать такое:
1) Сохраняется оригинальный адрес в IAT
2) В IAT пишется свой адрес
3) После перехода на код хэндлера мы должны понять: «А это тот кусок кода что мы перехватываем?» На этот вопрос можно получить ответ только когда мы понимаем кто вызвал нашу функцию. Это же в свою очередь можно понять пользуясь технологией SEH, как это делают при раскрутке стека, это не сложно и не накладно по скорости работы! Для 64-битов немного другие правила.
Плюсы:
1) Достаточно быстро патчится
2) Не надо морочиться с корректностью выполнения первых N-байтов где мы поставили свой jmp
3) Код достаточно читабельный и проще сопровождать
Именно по этой причине стараюсь использовать технику сплайсинга как можно меньше!
Куда больше нравится править непосредственно IAT(Import Address Table).
Поясню:
Допустим есть код:
.0047C452: 56 2push esi
.0047C453: 8D45F8 lea eax,[ebp][-8]
.0047C456: 50 push eax
.0047C457: FF1594E04A00 call GetSystemTimeAsFileTime
Для наглядности офсет куда указывает инструкция call покажу в виде списка dword-ов:
.0047C459: 004AE094
.0047C45D: 33FC758B
.0047C461: 15FFF875
Как мы знаем это ничто иное как адрес в IAT:
.004AE094: 20 16 0D 00-3A 16 0D 00-48 16 0D 00-5A 16 0D 00 ▬♪ :▬♪ H▬♪ Z▬♪
Можно сделать такое:
1) Сохраняется оригинальный адрес в IAT
2) В IAT пишется свой адрес
3) После перехода на код хэндлера мы должны понять: «А это тот кусок кода что мы перехватываем?» На этот вопрос можно получить ответ только когда мы понимаем кто вызвал нашу функцию. Это же в свою очередь можно понять пользуясь технологией SEH, как это делают при раскрутке стека, это не сложно и не накладно по скорости работы! Для 64-битов немного другие правила.
Плюсы:
1) Достаточно быстро патчится
2) Не надо морочиться с корректностью выполнения первых N-байтов где мы поставили свой jmp
3) Код достаточно читабельный и проще сопровождать
Минусы:
1) Не перехватываются вызовы функций, которые приложение получило через GetProcAddress
2) Сколько загружено модулей, столько и IAT-ов патчить (для полной гарантии перехвата функции внутри процесса надо отслеживать заргузку новых модулей). Столкнулся с этим, когда надо было прозрачно для приложения шифровать определённые типы файлов. IAT модуля, скажем acad.exe был исправлен, а реальный вызов CreateFileA проходил через IAT модуля msvcrt.dll
1) Не перехватываются вызовы функций, которые приложение получило через GetProcAddress
2) Сколько загружено модулей, столько и IAT-ов патчить (для полной гарантии перехвата функции внутри процесса надо отслеживать заргузку новых модулей). Столкнулся с этим, когда надо было прозрачно для приложения шифровать определённые типы файлов. IAT модуля, скажем acad.exe был исправлен, а реальный вызов CreateFileA проходил через IAT модуля msvcrt.dll
С минусами согласен. Но для этой задачи вполне подходит именно IAT-патчинг.
1) а что мешает перехватить GetProcAddress?
ничего не мешает, но это уже за пределеми «чистого» IAT-патчинга.
сейчас нашёл ещё один минус:
3) если атакуемое приложение упаковано хотя бы безобидным UPX, патчер не сможет найти расположение оригинальной IAT, он увидит IAT-таблицу для upx-депакера
сейчас нашёл ещё один минус:
3) если атакуемое приложение упаковано хотя бы безобидным UPX, патчер не сможет найти расположение оригинальной IAT, он увидит IAT-таблицу для upx-депакера
При написании любого куска кода всегда есть ограничения, но это не означает что программировать вообще не надо! Это означает надо посмотреть на задачу и понять всю ситуацию и с какими конкретно ограничениями можно согласиться. Так что говорить одно круче или хуже можно только относительно конкретно взятой ситуации.
патчи, патчи. инди клерк вас не одобрил бы:)
Вспомнились статьи ms-rem'a и ночи проведенные с дизасемблером
Мне кажется, статус «на коленках» уже немножко не катит…
Вот и я о том же. Там где начинается хардкор — теряется вся наглядность…
Хардкор это бинарь покрытый скажем Themida не желающий работать под какой-либо виртуалкой, а файл сомнительный и на живой машине реверсить не хочется, а надо!
Ну про такой хардкор я бы никогда не стал тут писать :)
НЛО прилетело и опубликовало эту надпись здесь
Простите, я малость позабыл, это Themida создает 100500 потоков и кучу антиотладочных трюков в себе держит. В смысле расчет на крайне высокую сложность ручной распаковки?
>>В смысле расчет на крайне высокую сложность ручной распаковки?
Это требование справедливо к любому современному проту, иначе смысл его покупать?
Это требование справедливо к любому современному проту, иначе смысл его покупать?
Темида снимается даже нубастым мной с использованием некоторых скриптов в 70% случаев…
>>даже нубастым мной с использованием
При стандартных решениях. А когда перед тобой хз че за файл и над ним хорошо постарались, то скрипты тут не помогут, тут думать надо.
Я как-то одного выскочку проучил, хвалился что может снять простой элементарный пакер. Я сделал ему unpackme: взял один известных пакеров, открутил Aplib, а под ним был был e8\e9-фильтр, убрал его и попатчил код фильтра. Затем дошел до настройки импорта, пофиксил чексумму имени АПИ-шки, потом это все обратно Аплибом запаковал. Какого было мое удивление, что человек не осилил! ;) Там импорт был чуток нестандартен, его немного подпилить и все, можно ImpRec юзать.
При стандартных решениях. А когда перед тобой хз че за файл и над ним хорошо постарались, то скрипты тут не помогут, тут думать надо.
Я как-то одного выскочку проучил, хвалился что может снять простой элементарный пакер. Я сделал ему unpackme: взял один известных пакеров, открутил Aplib, а под ним был был e8\e9-фильтр, убрал его и попатчил код фильтра. Затем дошел до настройки импорта, пофиксил чексумму имени АПИ-шки, потом это все обратно Аплибом запаковал. Какого было мое удивление, что человек не осилил! ;) Там импорт был чуток нестандартен, его немного подпилить и все, можно ImpRec юзать.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Перехват видео в браузере или TCP сниффер под Windows на коленке (часть вторая)