|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 2, 2003 02:33:07 Заранее извиняюсь за неправильное употребление терминов и т.д. Не специалист я, поэтому и спрашиваю совета. Есть программа, судя по сигнатуре писанная на vc32. При определенном и известном воздействии пользователя программа падает. Исходников программы нет. С помощбю IDA и Soft Ice нашел процедуру в которой происходит ошибка: push ebp mov ebp, esp push ecx mov [ebp+var_4], ecx mov eax, [ebp+arg_0] movsx edx, word ptr [ecx+4] imul edx, 46h mov eax, [ebp-4] lea ecx, [eax+edx+8] mov edx, [ebp+0Ch] mov eax, [edx+14h] movsx edx, word ptr [eax+4] movsx eax, byte ptr [ecx+edx] тут неважно как вычисляется результат процедуры и заносится в eax mov esp, ebp pop ebp retn 8 Падение происходит на первом movsx когда ecx=0 или на втором и третьем movsx когда [eax+4] или [ecx+edx] ссылаются на неопределенную область памяти. Вопрос: каким путем можно поправить эту процедуру, чтобы избежать падения программы? Проверить ecx на 0 в первом случае - это понятно, но что делать во втором и третьем? Или есть более правильный путь? Процедура после изменения может увеличиться в размере, т.к. рядом есть неиспользуемый код достаточного размера. И дополнительный вопрос - зачем нужен push ecx если ecx нигде не восстанавливается? |
|
|
Дата: Июн 2, 2003 03:10:04 Только проверку на ecx=0. Все остальный movsx зависят от значения ecx. |
|
|
Дата: Июн 2, 2003 03:39:00 2 severe44: И дополнительный вопрос - зачем нужен push ecx если ecx нигде не восстанавливается? Вообще-то принцип стека состоит в том, что последние положенные в него данные восстанавливаются первыми, независимо от того как они клались (через EAX, ECX, и т.д.). Судя по твоему коду: push ebp mov ebp, esp push ecx ... pop ebp можно сказать, что pop ebp как раз и восстанавливает значение, положенное при push ecx. |
|
|
Дата: Июн 2, 2003 05:05:58 Sk. Inc. pop ebp как раз и восстанавливает значение, положенное при push ecx Заблуждаетесь, ибо: [code] mov ebp, esp ... mov esp, ebp [/code] |
|
|
Дата: Июн 2, 2003 11:40:41 Только проверку на ecx=0. Все остальный movsx зависят от значения ecx. Это понятно, но как отследить и предупредить ситуацию, когда во втором и третьем movsx происходит обращение к "чужой" или неиспользуемой памяти (в Soft Ice ее содержимое не определено - ?? ?? ?? ...). Проблема в том, что глики во втором и третьем movsx не зависят от ecx=0 и возникают в других случаях. |
|
|
Дата: Июн 2, 2003 12:04:22 · Поправил: P2M severe44 нашел процедуру в которой происходит ошибка Из Вашего кода не понятно где инициализируется ECX? Процедура после изменения может увеличиться в размере ... Можно перед обращением в "чужую" память проверять IsBadReadPtr. зачем нужен push ecx если ecx нигде не восстанавливается? Например, для места под локальную переменную(ые) размером в DWORD вместо add esp,4. В win32-app восстанавливать значение ecx не обязательно. |
|
|
Дата: Июн 2, 2003 13:08:23 [ severe44: Вопрос: каким путем можно поправить эту процедуру, чтобы избежать падения программы? ] Не совсем ясен вопрос. Все завязано на значении, которое содержится в ecx. А туда оно попадает еще до входа в процедуру. Если же нужно просто избежать падения можно просто поставить SEH-обработчик. Но, тогда не ясно зачем эта процедура вообще нужна. |
|
|
Дата: Июн 2, 2003 16:28:38 severe44 нашел процедуру в которой происходит ошибка Из Вашего кода не понятно где инициализируется ECX? Логично предположить что в ecx находится this класса, и через [ecx+4] читаются его члены. |
|
|
Дата: Июн 19, 2003 13:05:05 Если же нужно просто избежать падения можно просто поставить SEH-обработчик. Что такое SEH-обработчик? И как его поставить или где увидеть примеры? :) |
|
|
Дата: Июн 19, 2003 13:05:34 Если же нужно просто избежать падения можно просто поставить SEH-обработчик. Что такое SEH-обработчик? И как его поставить или где увидеть примеры? :) |
|
|
Дата: Июн 20, 2003 11:35:20 Адрес задается через селектор FS и смещение 0 (пользовательский код). Примеры (вроде) есть в исходниках этого сайта. |
|
|
Дата: Июн 20, 2003 14:12:25 Пример примитивного SEH есть у Iczelion в PE-tutorial "Урок 5. Таблица секций" - на сайте есть перевод. Если хочешь досконально разобраться с SEH ищи статью "Win32 Exception handling for assembler programmers" by Jeremy Gordon. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.090 |