Создано: 9 сентября 2018 00:13 New! Цитата · Личное сообщение · #1
Отлаживаю либу, которая написана на c++. В ней такой код
Code:
moveax, TlsIndex
movecx, large fs:2Ch
movedx,[ecx+eax*4]
moveax,[esp+arg_0]
mov[edx+4],eax
Когда отлаживаю на win7, то все нормально работает, инструкция
Code:
movecx, large fs:2Ch
возвращает нормальный адрес, а при отладке в win xp sp2 на vmware, эта инструкция выдает 0 и в итоге в следующей инструкции получаю исключение. Почему так на хп работает и как пофиксить, чтобы там эту либу можно было также как в вин7 дебажить ?
Создано: 9 сентября 2018 00:28 · Поправил: f13nd New! Цитата · Личное сообщение · #3
--> Link <-- --> Link <-- Это что-то из разряда получить хендл kernel32 из шеллкода - безобидные легитимные программы такого делать не должны. Напрямую лазить в peb и teb только виндовые библиотеки имеют моральное право, да при установке seh разве что. Так что эту поделку тебе надо заменить на TlsGetValue/TlsSetValue.
Создано: 9 сентября 2018 00:28 New! Цитата · Личное сообщение · #4
Kindly, да это понятно, вопрос в том, почему в хп в TlsIndex ничего не передается и как это пофиксить можно, на хп дебажить приятнее.
Добавлено спустя 11 минут f13nd пишет: Так что эту поделку тебе надо заменить на TlsGetValue/TlsSetValue. Да она много где в коде встречается, много правок, на прямую как в семерке на хп не прокатит ?
Создано: 9 сентября 2018 00:45 New! Цитата · Личное сообщение · #5
mazaxaker пишет: Да она много где в коде встречается, много правок, на прямую как в семерке на хп не прокатит ? Ну видимо нет. Ну или проблема не в выборке, а в создании ThreadLocalStorage, которого не происходит почему-то. Сделано бы было по канонам, работало бы везде одинаково.
Создано: 9 сентября 2018 02:01 · Поправил: ClockMan New! Цитата · Личное сообщение · #6
f13nd пишет: Это что-то из разряда получить хендл kernel32 из шеллкода - безобидные легитимные программы такого делать не должны Это ты программам на делфи написанных скажи там это функция вовсю юзается, пусть лучше смотрит в сторону TLS directory
Создано: 9 сентября 2018 08:43 · Поправил: f13nd New! Цитата · Личное сообщение · #7
ClockMan пишет: Это ты программам на делфи написанных скажи У меня еще не настолько шифер посыпался, чтобы с программами разговаривать. Но однажды дельфи мутирует настолько, что эти многометровые чудища осознают себя личностями и сами начнут разговаривать.
В 8.1 х64 TlsSetValue
Code:
776D12C6MOVESI,DWORDPTRSS:[EBP+8];nTlsIndex
776D12C9PUSHEDI
776D12CAMOVEDI,DWORDPTRFS:[18]
776D12D1CMPESI,40
776D12D4JAE776E4E9A
776D12DAMOVEAX,DWORDPTRSS:[EBP+0C];nTlsValue
776D12DDMOVDWORDPTRDS:[ESI*4+EDI+0E10],EAX
Как бы немножечко не то пальто, да еще с таким смещением. Лучше бросить это значение в лицо винде соответствующей функции, пусть сама ковыряется.
Создано: 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.
Создано: 9 сентября 2018 16:43 · Поправил: difexacaw New! Цитата · Личное сообщение · #10
Что то тут не сходится, работать оно должно наоборот. На 7-ке +0x2C: UserSharedInfo. На XP там тлс. ТС попутал и вводит всех в заблуждение.
mazaxaker
> на хп есть способ, чтобы инструкция
И даже не один по подмене выборки(DF). В простейшем случае ставите железячный останов на это поле и обрабатываете его, эмулируя инструкцию, либо перезапуском её с изменённым контекстом. Ну чтобы подменять смещения динамически, не трогая дельфийский код, в котором нет OS-case.
Создано: 10 сентября 2018 01:24 · Поправил: ClockMan New! Цитата · Личное сообщение · #11
difexacaw Вы читали что я выше написал это DLL c TLS, поддержка началась с Windows Vista , если DLL на Windows XP объявляет поток то срабатывает защита ......
Создано: 13 сентября 2018 20:55 · Поправил: difexacaw New! Цитата · Личное сообщение · #14
ClockMan
TEB.Tib.Self -> TEB.Cid.Pid
1. Зачем вы это спрашиваете. 2. Что имеется ввиду под функцией хз, вам апи нужно получения PID и узнать знаю ли я это. 3. А зачем указатели, можно прямо прочитать fs:[0x20]. Вы когда то видели чтобы указатель на структуру изменился эту - я это тоже не видел.