Полноценный вызов функций по указателю

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.11.2004 (Ср) 6:05

Глобальная переменная Wrapper1Address расположена по оффсету 403024.
Процедура Redirect по оффсету 401F50

Код: Выделить всё
Public Function Wrapper1() As Long
  //Redirect Wrapper1Address
  mov eax, Wrapper1Address //dword ptr 403024
  push eax
  call Redirect //401F50
  xor eax, eax  //вернуть ноль
  ret
End Function

Public Sub Redirect(ByVal Addr As Long)
  lea eax, dword ptr [esp+4]
  push eax
  call VarPtr
  //теперь eax = VarPtr(Addr)
  sub eax, 4
  mov ecx, Addr
  push ecx
  jo //... это нам не надо...
  push eax
  call PutMem4
  call vbaSetSystemError
  ret 4
End Sub


А щас с параметрическими разберёмся...
Последний раз редактировалось GSerg 24.11.2004 (Ср) 6:22, всего редактировалось 1 раз.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 24.11.2004 (Ср) 6:11

Ну, вроде бы стек не изменяется.
Только вот в конце Redirect наверное стоит
Код: Выделить всё
ret  4
С уважением, Approximator.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.11.2004 (Ср) 6:16

Да, ret 4.

Код функции с 1 параметром абсолютно идентичен :shock: За исключением, понятно, ret...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 24.11.2004 (Ср) 6:26

GSerg писал(а):Да, ret 4.

Код функции с 1 параметром абсолютно идентичен :shock:

Тогда, признаюсь, мне самому не очень понятно почему она не работает в откомпилированном виде.
Попробуй всё же вставить в модуль тест-функцию, которая бы проверяла и сравнивала адрес стека и его содержимое с таковыми у Wrapper'ов. :)
В противном случае необходимо смотреть дальше - в те места откуда Wrapper'ы вызываются.
С уважением, Approximator.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.11.2004 (Ср) 6:29

Дык смотрел. mov куда-нибудь hwnd, push его и call wrapper...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 24.11.2004 (Ср) 6:32

GSerg писал(а):Дык смотрел. mov куда-нибудь hwnd, push его и call wrapper...

Не :) не туда смотрел, чё они после этого с eax делают? Может там какая засада? (Ты не ответил, передаваемый стек тест-функцией проверял?)
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 24.11.2004 (Ср) 6:43

Не знаю, похоже, что у тебя есть каой-то локальный баг. Я бы проверил с OpCode-вставкой и без неё, постоянно мониторил бы динамику изменения стека и т.п. Если засада где-то имеется, то её обязательно множно обнаружить. В конце-концов ты всего лишь заменяешь адрес возврата - то есть измененмя, вносимые тобой, минимальны. Стало быть, если прога глючит, значит либо это локальный глюк, либо :) одно из двух...
С уважением, Approximator.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.11.2004 (Ср) 7:02

Посмотрю...
Ты мне скажи, ты в ресурсах сечёшь? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.11.2004 (Ср) 7:14

Так...
Процедурина form_load выглядит так:

какие-то фиговины с fs:[00000000] (а именно запоминание его в eax, push eax, замена fs:[00000000] на esp, потом ещё куча push, вызов некой функции). Потом инициализация локальных переменных.
Сразу вслед за оной идёт вызов Wrapper1. Его результат без изменений топает из eax в [ebp-1c], после чего наряду с другими push попадает в rtcMessageBox...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.11.2004 (Ср) 11:42

GSerg писал(а):Точно...
Меня терзают смутные сомненья на предмет того, что если у функции есть параметры, то первые две её команды -
Код: Выделить всё
push ebp
mov ebp, esp

Причём это выполняется до любого юзерского кода. Так что в верхушке стека оказывается ebp. Да его, к тому же, и выпихнуть надо перед возвратом.
Хреново... Без переходников-таки не обойтись...

"Нич-чего не понимаю" (с)
В начале Redirect:
Код: Выделить всё
push ebp
mov ebp, esp

В конце IsWindow:
Код: Выделить всё
pop ebp
ret 4

Зачем нужны переходники? И так всё одинаково...
Действительно, похоже на локальные глюки у GSerg-а.

Approximator, если бы по ret-у из IsWindow происходил возврат по адресу из какой-то локальной переменной Redirect, случайно оказавшейся на стеке, с вероятностью 99,9% было бы "программа выполнила недопустимую операцию". А у GSerg-а управление возвращается куда нужно, и только eax по дороге где-то портится...
Изображение

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 25.11.2004 (Чт) 2:26

GSerg'у:
В общем, в том, что ты здесь выкладываешь я глюка не вижу. Кажется, что усё должно работать. Можно, конечно совсем обнаглеть и в Redirect'е прописать ручками ардес возврата (предварительно его необходимо сохранить из Wrapper'а) и аргумент для IsWindow (ведь стек IsWindow находится по адресу VarPtr(Addr)+4). Если и это не поможет, то я не знаю, что и советовать.

Тёмычу:
С таким же успехом я могу утверждать, что после прописывания в адрес возврата адреса IsWindow функция с необходимостью (где-то 99,99999% вероятность :)) исполняется. Между тем, нам троим очевидно, что где-то имеется глюк. Где именно пока не вижу.
С уважением, Approximator.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.11.2004 (Чт) 8:27

Approximator писал(а):С таким же успехом я могу утверждать, что после прописывания в адрес возврата адреса IsWindow функция с необходимостью (где-то 99,99999% вероятность :)) исполняется. Между тем, нам троим очевидно, что где-то имеется глюк. Где именно пока не вижу.

Дык, и я прав, и ты прав :-) IsWindow исполняется, и возвращается в Wrapper1, как и положено. По крайней мере, у меня было так, и по рассмотрении кода он именно так и должен работать.
У GSerg-а нет возможности проверить код на другом компе?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.11.2004 (Чт) 8:36

У GSerg-а есть возможность проверить код на другом компе. Сейчас он сделает это...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.11.2004 (Чт) 8:43

Тааааааак........
Хрюшка на ноутбуке говорит IsWindow=1.

Мой комп под 98 говорит IsWindow=-2112212688. Впрочем, цифра может меняться (но не в рамках одного запуска программы).

Предложения?




Раз предложений пока нет, тогда предварительный вывод... IsWindow возвращает не 1, а "не ноль" на 98, и это нормально. Хотя под C++ всегда вылазит 1, мда...
Пойду другие функции повызываю...


Смотри-ка :) GetWindowTextLengthA работает правильно.
Делаем вывод о правильности вывода! :)

Будем, значица, юзать :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 26.11.2004 (Пт) 2:10

Стало быть, всё и так было ок? :) !"№;%:?* :)
С уважением, Approximator.

Пред.

Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37

    TopList