Хакерские способы извлечения данных из локального хранилища потоков
Я узнал кое-что о локальном хранилище потоков (TLS). С моей точки зрения, это полностью черный ящик — вы даете ему ключ, и он возвращает вам локальные данные потока . Понятия не имею, что это за ключ и где хранятся эти локальные данные.
Недавно я нашел несколько хакерских способов получения данных TLS, но не мог понять, как они работают.
В асинхронном профилировщике проекта (в строке src/vmStructs.cpp:347) ключ pthread является
int
, почему? Я прочитал исходный код о манипулировании pthread JVM Hotspot и не нашел никакой подсказки. Hotspot не указывает тип ключа pthread (и я не думаю, что может). И почему мы можем гарантировать, что найдем ключ pthread с помощью простого целочисленного цикла? Не уверен, что это вопрос TLS или вопрос Hotspot. :(pthread_t — это адрес pthread. Я думаю, что это указывает на какой-то экземпляр потока ОС, который мы не можем анализировать напрямую. Но, согласно ответу Phoenix87 , мы могли бы рассматривать pthread_t как адрес списка pthread_t, в котором мы могли бы найти TID(возврат gettid()) с помощью простого цикла (опять же простого цикла). Вы можете найти его в Остине (в строке src/linux/py_proc.h: 613). Как это работает?
1 ответ
Оба они делают предположения оpthread
реализация, над которой они работают.
Такие предположения в общем случае не гарантируются и почти гарантированно не работают с другой реализацией.
Не пишите такой код без крайней необходимости , а если вы пишете такой код, пожалуйста, четко укажите, какие именно реализации и версии вы поддерживаете.