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

Обработка TLS x64

reqwest

(L3) cache
Пользователь
Регистрация
05.05.2022
Сообщения
231
Реакции
137
Гарант сделки
2
Депозит
0.00
Привет, подскажите, в процессе написания PE-лоадера столкнулся с проблемой обработки TLS: ловлю исключение STATUS_ILLEGAL_INSTRUCTION при выполнении нужной мне экспортируемой функции из загруженного модуля. Та же длл, собранная под х86 работает как нужно, но именно с х64 какие-то траблы. Для теста попробовал donut - та же проблема.
Колбэки выполняю примерно так:
C:
void exec_tls(LPVOID addr) {
    PIMAGE_TLS_DIRECTORY tls = /* RVA of IMAGE_DIRECTORY_ENTRY_TLS directory */;
    PIMAGE_TLS_CALLBACK* cb = (PIMAGE_TLS_CALLBACK*)tls->AddressOfCallBacks;
    if (cb) {
        while (*cb) {
            (*cb)(addr, DLL_PROCESS_ATTACH, NULL);
            cb++;
        }
    }
}
Есть ли какая-то разница в их обработке на архитектурах х86/х64?
 
А вообще, попробуй сделать:
В примере выше я специально убрал некоторые проверки на null, для наглядности. Исключение ловлю при выполнении экспортируемой функции уже после загрузки модуля, выполнения entrypoint.
 
По моему, надо создавать поток с указателем на адрес экспортируемых функций
Вовсе не обязательно. Экспортируемая функция выполняется в мейн-потоке приложения, которое загрузило модуль. Нет никакой разницы в отдельном/мейн потоке.
 
Привет, подскажите, в процессе написания PE-лоадера столкнулся с проблемой обработки TLS: ловлю исключение STATUS_ILLEGAL_INSTRUCTION при выполнении нужной мне экспортируемой функции из загруженного модуля. Та же длл, собранная под х86 работает как нужно, но именно с х64 какие-то траблы. Для теста попробовал donut - та же проблема.
Колбэки выполняю примерно так:
C:
void exec_tls(LPVOID addr) {
    PIMAGE_TLS_DIRECTORY tls = /* RVA of IMAGE_DIRECTORY_ENTRY_TLS directory */;
    PIMAGE_TLS_CALLBACK* cb = (PIMAGE_TLS_CALLBACK*)tls->AddressOfCallBacks;
    if (cb) {
        while (*cb) {
            (*cb)(addr, DLL_PROCESS_ATTACH, NULL);
            cb++;
        }
    }
}
Есть ли какая-то разница в их обработке на архитектурах х86/х64?
Обработка TLS не заканчивается вызовом коллбеков. Помимо них тебе нужно обрабатывать thread local variables, коллбеки нужны только для первичной инициализации. Можешь глянуть исходники самого полного опенсорсного PE загрузчика, который я видел: https://github.com/polycone/pe-loader
Возможно, это тебе как то поможет.
 
Request The error you're encountering, STATUS_ILLEGAL_INSTRUCTION, indicates that the processor encountered an instruction that it cannot execute. This can be due to differences in the way x86 and x64 architectures handle function calls and stack manipulation.

One key difference between x86 and x64 architectures is the calling convention used for function calls. In x86, the cdecl calling convention is commonly used, where function arguments are typically passed on the stack. In x64, the calling convention often used is the Microsoft x64 calling convention (also known as fastcall), where the first four arguments are passed in registers.

When dealing with TLS callbacks, it's essential to ensure that you're adhering to the correct calling convention for the target architecture. In your code snippet, you're invoking the TLS callback functions using a simple function pointer dereference, which might not handle the calling convention correctly for x64.

Код:
#include <windows.h>

void exec_tls(LPVOID addr) {
    PIMAGE_TLS_DIRECTORY64 tls = /* RVA of IMAGE_DIRECTORY_ENTRY_TLS directory */;
    PIMAGE_TLS_CALLBACK* cb = (PIMAGE_TLS_CALLBACK*)tls->AddressOfCallBacks;
    
    if (cb) {
        // Iterate through TLS callback functions
        while (*cb) {
            // Call TLS callback function using the fastcall calling convention
            __try {
                (*cb)(addr, DLL_PROCESS_ATTACH, NULL);
            }
            __except(EXCEPTION_EXECUTE_HANDLER) {
                // Handle any exceptions raised during callback execution
                // Log error or take appropriate action
            }
            cb++;
        }
    }
}
 


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