• XSS.stack #1 – первый литературный журнал от юзеров форума

Как вызвать tls callback или как заинжектить майнер(64) в 64-битное приложение?

IPirateS6

(L3) cache
Пользователь
Регистрация
02.06.2020
Сообщения
211
Реакции
107
Несколько месяцев назад я создал тему по поводу runpe инжекта x32->x64 майнера xmrig. Решение в итоге оказалось очень нестабильным (из-за отсутствия работы с релоками и tls callback). Вот только что добавил поддержку релоков, протестил на калькуляторе (заинжектил 64-битный calc.exe в 64-битный Process Hacker) и всё сработало на ура. Но ни у calc.exe, ни у process hacker'а не было tls callback'ов. Так вот вопрос: как вызвать эти зло*бучие колбэки? В который раз загуглив доку в мсдн по pe формату я посмотрел что колбэк имеет следующий формат:
C:
typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
    PVOID DllHandle,
    DWORD Reason,
    PVOID Reserved
    );
Как вызвать его в другом процессе через RtlCreateUserThread?

Немного отходя от темы, хочу упомянуть, что большинство кодеров .NET Miner'ов так и вовсе не заморачиваются ни с колбэками, ни с релоками, тупо анмап+запись+NtSetContextThread. И вроде как и никто не жалуется особо. Как пример можно рассмотреть майнеры от UnamSanctam на github.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Как вызвать его в другом процессе через RtlCreateUserThread?
Просто так вызвать не получится, нужно заинжектить небольшую прослойку из асм кода или функцию позиционно независимую, которая будет их все вызывать друг за другом в цикле. Ну и да, TLS коллбеков может быть много, создавать по одному потоку на каждый из них довольно расточительно.
 
Просто так вызвать не получится, нужно заинжектить небольшую прослойку из асм кода или функцию позиционно независимую, которая будет их все вызывать друг за другом в цикле. Ну и да, TLS коллбеков может быть много, создавать по одному потоку на каждый из них довольно расточительно.
Мда уж, ну и геморрой. Не в курсе есть ли у кого код с подобным? Чтобы лишний раз не морочить себе голову.
Видел в MemoryModule есть вызов колбэков, но там в контексте текущего процесса они вызываются, что совершенно неприменимо к RunPE. Эх, а как бы хотелось чтобы эти колбэки сами вызывались в энтри поинте... Странно что у копромайнеров на .NET с убогим RunPE всё работает вроде как. 0.о
 
Сделай шеллкод и используя IPC передавай ему пошифрованный бинарник майнера, а уже из шеллкода загружай его в память, вызывая тлс коллбеки поочередно. Тебе нужно создать засуспенженный процесс, внести соответствующие правки, чтобы на этапе запуска управление передавалось сразу на шеллкод и начать его выполнение. Конечно, это уже будет ранпе не в привычном понимании, но почему нет? И вроде как универсально.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Странно что у копромайнеров на .NET с убогим RunPE всё работает вроде как. 0.о
А чего странного, у меня давно сложилось впечатление, что формат метаданных дотнетовских сборок куда лучше проработан, чем PE, несмотря на то, что этот самый формат метаданных потом внутрь PE формата вхерачили молотком. Ты просто подгружаешь фреймворк, даешь ему сборку и он ее грузит.
 
А как насчет собрать xmrig без колбеков и не ебать себе бошку?
Этот вопрос в своё время поднимался на эксплойте, для того чтобы собрать xmrig без тлс нужно править его код, насколько я помню, связано с pthread, который он использует. В статье от Suffocation был сэмпл собранного как дллки xmrig'a.
 
Этот вопрос в своё время поднимался на эксплойте, для того чтобы собрать xmrig без тлс нужно править его код, насколько я помню, связано с pthread, который он использует. В статье от Suffocation был сэмпл собранного как дллки xmrig'a.
А как насчет собрать xmrig без колбеков и не ебать себе бошку?
И на сколько стабильно сие решение? На сколько выгодно в плане производительности майнинга? Сомневаюсь что по этим показателям он будет равен RunPE с колбэками.
Но, мне друг подсказал что можно просто конвертировать exe в шелкод и уже заинжектить этот шк, буду пробовать. Хотя вопрос о tls callbacks остаётся открытым, тем более, что уверен он будет актуален и для других мемберов форума.
 
Этот вопрос в своё время поднимался на эксплойте, для того чтобы собрать xmrig без тлс нужно править его код, насколько я помню, связано с pthread, который он использует. В статье от Suffocation был сэмпл собранного как дллки xmrig'a.
И, да, кстати, меня не только xmrig интересует, но и ethminer.
 
Еще немного подскажу, колбеки эти нахрен никому не сдались, их можно игнорить в случае с xmrig'ом. Можно просто выпилить их с таблицы руками, потом упаковать бинарь upx'ом для сокращения количества секций и размера, и он будет работать. Проверенно. Бинарь на столе лежал пересобранный с сорцев, не дефолтный. По производительности сам сравнивай, я дальше сборки и локальной проверки не ходил.
 
Еще немного подскажу, колбеки эти нахрен никому не сдались, их можно игнорить в случае с xmrig'ом. Можно просто выпилить их с таблицы руками, потом упаковать бинарь upx'ом для сокращения количества секций и размера, и он будет работать. Проверенно. Бинарь на столе лежал пересобранный с сорцев, не дефолтный. По производительности сам сравнивай, я дальше сборки и локальной проверки не ходил.
Эх, костыли-костылёчки)
 
Меня вполне устраивает описанная выше конструкция. Если это все еще и заработает обернутое шеллкодом в чужом АП, то почему нет?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну как бы наличие TLS намекает, что либо в самой программе, либо в прилинкованных библиотеках используются thread local переменные или еще чего, если их вырезать, то 100 процентов работоспособности от исходной версии программы гарантировать никак нельзя. Баг с этим связанный в процессе тестирования может и не появляться. Наверное, стоит перед вызовом точки входа на всякий случай SetErrorMode сделать, чтобы в случае жесткого эксепшена процесс просто упал по-тихому без всяких окошек.
 
Ну как бы наличие TLS намекает, что либо в самой программе, либо в прилинкованных библиотеках используются thread local переменные или еще чего, если их вырезать, то 100 процентов работоспособности от исходной версии программы гарантировать никак нельзя. Баг с этим связанный в процессе тестирования может и не появляться. Наверное, стоит перед вызовом точки входа на всякий случай SetErrorMode сделать, чтобы в случае жесткого эксепшена процесс просто упал по-тихому без всяких окошек.
Согласен, нужны тесты. Мне на момент экспериментов от рига надо было только WITH_HWLOC, WITH_RANDOMX, WITH_ASM, WITH_MSR и WITH_EMBEDDED_CONFIG, все остальное OFF и оно работало. Наличие TLS означает что для CRT возможно когда нибудь потребуется что-то инициализированное в TLS, а возможно и нет.. я не выявил момента
 
А в чем проблема то, столько возни вокруг банальных TLS развели, они обрабатываются даже UPX, у которого открытые исходные коды, возьмите да посмотрите как это делать правильно
Как написал вышеDildoFagins создавать на каждый колбэк по новому потоку нецелесообразно, так как в официальной доке описано, что вызываются они последоватлеьно, по порядку, и пока первый не отработает второй не запустится, так что даже верно все это обрабатывать в одном потоке
Но помимо первичного запуска колбэков на старте процесса надо сделать так, что бы они вызывались еще потом, как это и должно быть, при создании потоков, завершении потоков и завершении процесса, а для этого колбэки надо зарегистрировать
Для данной операции есть специальное поле в структуре PEB по смещению 0x58 для 64 бит и 0x2C для 32 бит процессов, называется поле KernelCallbackTable
Туда после ручной обработки колбэков надо занести адрес таблицы колбэков и они при необходимости будут дергаться системным загрузчиком
Кстати, возможно если используется именно RunPE ,а не loadPE, можно сразу после запуска суспенд процесса записать в PEB эту таблицу колбэков и тогда загрузчик их сам дернет перед передачей управдения на EP, но увы я достаточно мало работал с RunPE, все реализации чего-либо у меня на LoadPE, поэтому не довелось проверить этот момент, идея пришла прямо сейчас пока писал текст, так что как дойдут руки проверю
1661675791085.png
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх