eXeLab
eXeL@B ВИДЕОКУРС !

Курс видеоуроков «Программирование и взлом 2O18»
Обновлен 13 сентября 2O18 года
Свежие инструменты, новые видеоуроки!

  • 300+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: Isaev, Gmc, Belg (+6 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Основной форум —› TlsIndex в win xp
Посл.ответ Сообщение

Ранг: 70.0 (постоянный)
Статус: Участник

Создано: 9 сентября 2018 00:13 New!
Цитата · Личное сообщение · #1

Отлаживаю либу, которая написана на c++. В ней такой код
Code:
  1. mov     eax, TlsIndex
  2. mov     ecx, large fs:2Ch
  3. mov     edx, [ecx+eax*4]
  4. mov     eax, [esp+arg_0]
  5. mov     [edx+4], eax

Когда отлаживаю на win7, то все нормально работает, инструкция
Code:
  1. mov     ecx, large fs:2Ch
возвращает нормальный адрес, а при отладке в win xp sp2 на vmware, эта инструкция выдает 0 и в итоге в следующей инструкции получаю исключение.
Почему так на хп работает и как пофиксить, чтобы там эту либу можно было также как в вин7 дебажить ?


Ранг: 240.7 (наставник)
Статус: Участник
RBC

Создано: 9 сентября 2018 00:15 · Поправил: Kindly New!
Цитата · Личное сообщение · #2

Это не инструкция выдает 0, а в large fs:2Ch не передается нифига или в TlsIndex.


Ранг: 93.4 (постоянный)
Статус: Участник

Создано: 9 сентября 2018 00:28 · Поправил: f13nd New!
Цитата · Личное сообщение · #3

--> Link <--
--> Link <--
Это что-то из разряда получить хендл kernel32 из шеллкода - безобидные легитимные программы такого делать не должны. Напрямую лазить в peb и teb только виндовые библиотеки имеют моральное право, да при установке seh разве что. Так что эту поделку тебе надо заменить на TlsGetValue/TlsSetValue.

Ранг: 70.0 (постоянный)
Статус: Участник

Создано: 9 сентября 2018 00:28 New!
Цитата · Личное сообщение · #4

Kindly, да это понятно, вопрос в том, почему в хп в TlsIndex ничего не передается и как это пофиксить можно, на хп дебажить приятнее.

Добавлено спустя 11 минут
f13nd пишет:
Так что эту поделку тебе надо заменить на TlsGetValue/TlsSetValue.

Да она много где в коде встречается, много правок, на прямую как в семерке на хп не прокатит ?


Ранг: 93.4 (постоянный)
Статус: Участник

Создано: 9 сентября 2018 00:45 New!
Цитата · Личное сообщение · #5

mazaxaker пишет:
Да она много где в коде встречается, много правок, на прямую как в семерке на хп не прокатит ?

Ну видимо нет. Ну или проблема не в выборке, а в создании ThreadLocalStorage, которого не происходит почему-то. Сделано бы было по канонам, работало бы везде одинаково.


Ранг: 497.6 (мудрец)
Статус: Участник
оптимист

Создано: 9 сентября 2018 02:01 · Поправил: ClockMan New!
Цитата · Личное сообщение · #6

f13nd пишет:
Это что-то из разряда получить хендл kernel32 из шеллкода - безобидные легитимные программы такого делать не должны

Это ты программам на делфи написанных скажи там это функция вовсю юзается, пусть лучше смотрит в сторону TLS directory


Ранг: 93.4 (постоянный)
Статус: Участник

Создано: 9 сентября 2018 08:43 · Поправил: f13nd New!
Цитата · Личное сообщение · #7

ClockMan пишет:
Это ты программам на делфи написанных скажи

У меня еще не настолько шифер посыпался, чтобы с программами разговаривать. Но однажды дельфи мутирует настолько, что эти многометровые чудища осознают себя личностями и сами начнут разговаривать.

В 8.1 х64 TlsSetValue
Code:
  1. 776D12C6  MOV ESI,DWORD PTR SS:[EBP+8]                  ;nTlsIndex
  2. 776D12C9  PUSH EDI
  3. 776D12CA  MOV EDI,DWORD PTR FS:[18]
  4. 776D12D1  CMP ESI,40
  5. 776D12D4  JAE 776E4E9A
  6. 776D12DA  MOV EAX,DWORD PTR SS:[EBP+0C]               ;nTlsValue
  7. 776D12DD  MOV DWORD PTR DS:[ESI*4+EDI+0E10],EAX

Как бы немножечко не то пальто, да еще с таким смещением. Лучше бросить это значение в лицо винде соответствующей функции, пусть сама ковыряется.

Ранг: 70.0 (постоянный)
Статус: Участник

Создано: 9 сентября 2018 09:39 New!
Цитата · Личное сообщение · #8

ClockMan, на хп есть способ, чтобы инструкция
Code:
  1. mov     ecx, large fs:2Ch
выдала нормальный адрес или тока патчить все эти места придется ?


Ранг: 497.6 (мудрец)
Статус: Участник
оптимист

Создано: 9 сентября 2018 11:34 New!
Цитата · Личное сообщение · #9

mazaxaker
нет --> Link <--

On Windows operating systems before Windows Vista, __declspec( thread ) has some limitations. If a DLL declares any data or object as __declspec( thread ), it can cause a protection fault if dynamically loaded. After the DLL is loaded with LoadLibrary, it causes system failure whenever the code references the __declspec( thread ) data. Because the global variable space for a thread is allocated at run time, the size of this space is based on a calculation of the requirements of the application plus the requirements of all the DLLs that are statically linked. When you use LoadLibrary, you cannot extend this space to allow for the thread local variables declared with __declspec( thread ). Use the TLS APIs, such as TlsAlloc, in your DLL to allocate TLS if the DLL might be loaded with LoadLibrary.


Ранг: 248.2 (наставник)
Статус: Участник

Создано: 9 сентября 2018 16:43 · Поправил: difexacaw New!
Цитата · Личное сообщение · #10

Что то тут не сходится, работать оно должно наоборот. На 7-ке +0x2C: UserSharedInfo. На XP там тлс. ТС попутал и вводит всех в заблуждение.

mazaxaker

> на хп есть способ, чтобы инструкция

И даже не один по подмене выборки(DF). В простейшем случае ставите железячный останов на это поле и обрабатываете его, эмулируя инструкцию, либо перезапуском её с изменённым контекстом. Ну чтобы подменять смещения динамически, не трогая дельфийский код, в котором нет OS-case.


Ранг: 497.6 (мудрец)
Статус: Участник
оптимист

Создано: 10 сентября 2018 01:24 · Поправил: ClockMan New!
Цитата · Личное сообщение · #11

difexacaw
Вы читали что я выше написал это DLL c TLS, поддержка началась с Windows Vista , если DLL на Windows XP объявляет поток то срабатывает защита ......


Ранг: 248.2 (наставник)
Статус: Участник

Создано: 12 сентября 2018 21:40 · Поправил: difexacaw New!
Цитата · Личное сообщение · #12

ClockMan

А как оно могло работать на старших версиях системы, если там другие смещения ?

И не имеет значения длл или нет, поле в системной структуре не соответствует версиям. Удивительно почему никто это не посмотрел.

Кстате между делом, кровь из глаз пойдёт если смотреть:

> mov ecx, large fs:2Ch

Это косяк компилера - нет адресных скобок, эффективный адрес не определён, значит это загрузка константы в регистр и наличие префикса FS.


Ранг: 497.6 (мудрец)
Статус: Участник
оптимист

Создано: 13 сентября 2018 00:52 New!
Цитата · Личное сообщение · #13

difexacaw пишет:
А как оно могло работать на старших версиях системы, если там другие смещения ?

вы какуета ерунду пишете например что это за функция
Code:
  1.   MOV EAX,FS:[18]
  2.   MOV EAX,[EAX+20]
  3.   RETN
  4.  


Ранг: 248.2 (наставник)
Статус: Участник

Создано: 13 сентября 2018 20:55 · Поправил: difexacaw New!
Цитата · Личное сообщение · #14

ClockMan

TEB.Tib.Self -> TEB.Cid.Pid

1. Зачем вы это спрашиваете.
2. Что имеется ввиду под функцией хз, вам апи нужно получения PID и узнать знаю ли я это.
3. А зачем указатели, можно прямо прочитать fs:[0x20]. Вы когда то видели чтобы указатель на структуру изменился эту - я это тоже не видел.
 eXeL@B —› Основной форум —› TlsIndex в win xp

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS