Сейчас на форуме: zds, -Sanchez- (+9 невидимых)

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

Ранг: 82.5 (постоянный), 1thx
Активность: 0.130.04
Статус: Участник

Создано: 09 сентября 2018 00:13
· Личное сообщение · #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 дебажить ?




Ранг: 275.9 (наставник), 340thx
Активность: 0.22=0.22
Статус: Участник
RBC

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

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

-----
Array[Login..Logout] of Life





Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

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

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

-----
2 оттенка серого




Ранг: 82.5 (постоянный), 1thx
Активность: 0.130.04
Статус: Участник

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

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

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

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




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

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

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

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

-----
2 оттенка серого





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

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

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

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

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 09 сентября 2018 08:43 · Поправил: f13nd
· Личное сообщение · #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

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

-----
2 оттенка серого




Ранг: 82.5 (постоянный), 1thx
Активность: 0.130.04
Статус: Участник

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

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




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 09 сентября 2018 11:34
· Личное сообщение · #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.


-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

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

mazaxaker

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

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

-----
vx





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

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

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

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

ClockMan

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

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

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

> mov ecx, large fs:2Ch

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

-----
vx





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

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

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

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


-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

ClockMan

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

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

-----
vx



 eXeL@B —› Основной форум —› TlsIndex в win xp
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати